From 57c628780e68459d9ae683365659c9f04683932c Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 9 Aug 2019 11:19:31 +0300 Subject: [PATCH 01/86] - initialized visibility changed [skip ci] --- .../TelegramCore/ReplyMarkupMessageAttribute.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift index 7ffbf0f5dc..20c3ca2bcb 100644 --- a/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift +++ b/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift @@ -78,7 +78,7 @@ public struct ReplyMarkupButton: PostboxCoding, Equatable { public let titleWhenForwarded: String? public let action: ReplyMarkupButtonAction - init(title: String, titleWhenForwarded: String?, action: ReplyMarkupButtonAction) { + public init(title: String, titleWhenForwarded: String?, action: ReplyMarkupButtonAction) { self.title = title self.titleWhenForwarded = titleWhenForwarded self.action = action @@ -108,7 +108,7 @@ public struct ReplyMarkupButton: PostboxCoding, Equatable { public struct ReplyMarkupRow: PostboxCoding, Equatable { public let buttons: [ReplyMarkupButton] - init(buttons: [ReplyMarkupButton]) { + public init(buttons: [ReplyMarkupButton]) { self.buttons = buttons } From 6e448c207236eedc8d3a11f08d789071ec5a15e6 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Mon, 12 Aug 2019 17:29:43 +0300 Subject: [PATCH 02/86] no message --- .../TelegramCore_Xcode.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 65ed88a7fb..0155284224 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -208,6 +208,9 @@ D02D60AC206BA64100FEFE1E /* VerifySecureIdValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02D60AA206BA64100FEFE1E /* VerifySecureIdValue.swift */; }; D02DADC12139A1FC00116225 /* ContactSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02DADC02139A1FC00116225 /* ContactSyncManager.swift */; }; D02DADC22139A1FC00116225 /* ContactSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02DADC02139A1FC00116225 /* ContactSyncManager.swift */; }; + D02E88522301AAA7000259C5 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986A22FD882200915E37 /* OutgoingScheduleInfoMessageAttribute.swift */; }; + D02E88532301AAA7000259C5 /* RegisterNotificationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02B198F21FB1D520094A764 /* RegisterNotificationToken.swift */; }; + D02E88542301AAA7000259C5 /* ScheduledMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986C22FD99D400915E37 /* ScheduledMessages.swift */; }; D03121021DA57E93006A2A60 /* TelegramPeerNotificationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03121011DA57E93006A2A60 /* TelegramPeerNotificationSettings.swift */; }; D0329EA222FC5A7C00F9F071 /* MessageReactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0329EA122FC5A7C00F9F071 /* MessageReactions.swift */; }; D0329EA322FC5A7C00F9F071 /* MessageReactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0329EA122FC5A7C00F9F071 /* MessageReactions.swift */; }; @@ -2637,6 +2640,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D02E88522301AAA7000259C5 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */, + D02E88532301AAA7000259C5 /* RegisterNotificationToken.swift in Sources */, + D02E88542301AAA7000259C5 /* ScheduledMessages.swift in Sources */, D020F00722F19C8F00BE699A /* ManagedAnimatedEmojiUpdates.swift in Sources */, D05FDC3922CA45070060BFE3 /* AppUpdate.swift in Sources */, D014193922AE6B85008667CB /* ChannelOwnershipTransfer.swift in Sources */, From bdd94a86acaf737b43cea2a637ba430b5913bffd Mon Sep 17 00:00:00 2001 From: overtake <> Date: Wed, 14 Aug 2019 16:51:43 +0300 Subject: [PATCH 03/86] no message --- .../TelegramCore/OutgoingMessageWithChatContextResult.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift b/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift index 480e69bec7..fcfcf3ccd5 100644 --- a/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift +++ b/submodules/TelegramCore/TelegramCore/OutgoingMessageWithChatContextResult.swift @@ -13,12 +13,15 @@ private func aspectFitSize(_ size: CGSize, to: CGSize) -> CGSize { return CGSize(width: floor(size.width * scale), height: floor(size.height * scale)) } -public func outgoingMessageWithChatContextResult(to peerId: PeerId, results: ChatContextResultCollection, result: ChatContextResult, hideVia: Bool = false) -> EnqueueMessage? { +public func outgoingMessageWithChatContextResult(to peerId: PeerId, results: ChatContextResultCollection, result: ChatContextResult, hideVia: Bool = false, scheduleTime: Int32? = nil) -> EnqueueMessage? { var attributes: [MessageAttribute] = [] attributes.append(OutgoingChatContextResultMessageAttribute(queryId: result.queryId, id: result.id, hideVia: hideVia)) if !hideVia { attributes.append(InlineBotMessageAttribute(peerId: results.botId, title: nil)) } + if let scheduleTime = scheduleTime { + attributes.append(OutgoingScheduleInfoMessageAttribute(scheduleTime: scheduleTime)) + } switch result.message { case let .auto(caption, entities, replyMarkup): if let entities = entities { From 84136efce3bca6c5901e1744d70394b3aa86b8c7 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 13:27:46 +0300 Subject: [PATCH 04/86] - mac internal updater [skip ci] --- .../TelegramCore/MacInternalUpdater.swift | 166 ++++++++++++++++++ .../project.pbxproj | 12 ++ 2 files changed, 178 insertions(+) create mode 100644 submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift diff --git a/submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift b/submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift new file mode 100644 index 0000000000..d4c1493e7c --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/MacInternalUpdater.swift @@ -0,0 +1,166 @@ +import TelegramApiMac +import SwiftSignalKitMac +import PostboxMac + +public enum InternalUpdaterError { + case generic + case xmlLoad + case archiveLoad +} + +public func requestUpdatesXml(account: Account, source: String) -> Signal { + return resolvePeerByName(account: account, name: source) + |> introduceError(InternalUpdaterError.self) + |> mapToSignal { peerId -> Signal in + return account.postbox.transaction { transaction in + return peerId != nil ? transaction.getPeer(peerId!) : nil + } |> introduceError(InternalUpdaterError.self) + } + |> mapToSignal { peer in + if let peer = peer, let inputPeer = apiInputPeer(peer) { + return account.network.request(Api.functions.messages.getHistory(peer: inputPeer, offsetId: 0, offsetDate: 0, addOffset: 0, limit: 1, maxId: Int32.max, minId: 0, hash: 0)) + |> retryRequest + |> introduceError(InternalUpdaterError.self) + |> mapToSignal { result in + switch result { + case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers): + if let apiMessage = apiMessages.first, let storeMessage = StoreMessage(apiMessage: apiMessage) { + + var peers: [PeerId: Peer] = [:] + for chat in apiChats { + if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { + peers[groupOrChannel.id] = groupOrChannel + } + } + for user in apiUsers { + let telegramUser = TelegramUser(user: user) + peers[telegramUser.id] = telegramUser + } + + if let message = locallyRenderedMessage(message: storeMessage, peers: peers), let media = message.media.first as? TelegramMediaFile { + return Signal { subscriber in + let fetchDispsable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: MediaResourceReference.media(media: AnyMediaReference.message(message: MessageReference(message), media: media), resource: media.resource)).start() + + let dataDisposable = account.postbox.mediaBox.resourceData(media.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { data in + if data.complete { + if let data = try? Data(contentsOf: URL.init(fileURLWithPath: data.path)) { + subscriber.putNext(data) + subscriber.putCompletion() + } else { + subscriber.putError(.xmlLoad) + } + } + }) + return ActionDisposable { + fetchDispsable.dispose() + dataDisposable.dispose() + } + } + } + } + default: + break + } + return .fail(.xmlLoad) + } + } else { + return .fail(.xmlLoad) + } + } +} + +public enum AppUpdateDownloadResult { + case started(Int) + case progress(Int, Int) + case finished(String) +} + +public func downloadAppUpdate(account: Account, source: String, fileName: String) -> Signal { + return resolvePeerByName(account: account, name: source) + |> introduceError(InternalUpdaterError.self) + |> mapToSignal { peerId -> Signal in + return account.postbox.transaction { transaction in + return peerId != nil ? transaction.getPeer(peerId!) : nil + } |> introduceError(InternalUpdaterError.self) + } + |> mapToSignal { peer in + if let peer = peer, let inputPeer = apiInputPeer(peer) { + return account.network.request(Api.functions.messages.getHistory(peer: inputPeer, offsetId: 0, offsetDate: 0, addOffset: 0, limit: 10, maxId: Int32.max, minId: 0, hash: 0)) + |> retryRequest + |> introduceError(InternalUpdaterError.self) + |> mapToSignal { result in + switch result { + case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers): + + var peers: [PeerId: Peer] = [:] + for chat in apiChats { + if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { + peers[groupOrChannel.id] = groupOrChannel + } + } + for user in apiUsers { + let telegramUser = TelegramUser(user: user) + peers[telegramUser.id] = telegramUser + } + + let messageAndFile:(Message, TelegramMediaFile)? = apiMessages.compactMap { value in + return StoreMessage(apiMessage: value) + }.compactMap { value in + return locallyRenderedMessage(message: value, peers: peers) + }.sorted(by: { + $0.id > $1.id + }).first(where: { value -> Bool in + if let file = value.media.first as? TelegramMediaFile, file.fileName == fileName { + return true + } else { + return false + } + }).map { ($0, $0.media.first as! TelegramMediaFile )} + + if let (message, media) = messageAndFile { + return Signal { subscriber in + + let reference = MediaResourceReference.media(media: .message(message: MessageReference(message), media: media), resource: media.resource) + + let fetchDispsable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: reference).start() + + let statusDisposable = account.postbox.mediaBox.resourceStatus(media.resource).start(next: { status in + switch status { + case let .Fetching(_, progress): + if let size = media.size { + if progress == 0 { + subscriber.putNext(.started(size)) + } else { + subscriber.putNext(.progress(Int(progress * Float(size)), Int(size))) + } + } + default: + break + } + }) + + let dataDisposable = account.postbox.mediaBox.resourceData(media.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { data in + if data.complete { + subscriber.putNext(.finished(data.path)) + subscriber.putCompletion() + } + }) + return ActionDisposable { + fetchDispsable.dispose() + dataDisposable.dispose() + statusDisposable.dispose() + } + } + } else { + return .fail(.archiveLoad) + } + default: + break + } + return .fail(.archiveLoad) + } + } else { + return .fail(.archiveLoad) + } + } +} diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 02937c4bd6..6831a79195 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -114,6 +114,7 @@ D00BDA1A1EE593D600C64C5E /* TelegramChannelAdminRights.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BDA181EE593D600C64C5E /* TelegramChannelAdminRights.swift */; }; D00BDA1C1EE5952A00C64C5E /* TelegramChannelBannedRights.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BDA1B1EE5952A00C64C5E /* TelegramChannelBannedRights.swift */; }; D00BDA1D1EE5952A00C64C5E /* TelegramChannelBannedRights.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BDA1B1EE5952A00C64C5E /* TelegramChannelBannedRights.swift */; }; + D00C73BB23055AA8004B1E2B /* MacInternalUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C73BA23055AA8004B1E2B /* MacInternalUpdater.swift */; }; D00C7CCC1E3620C30080C3D5 /* CachedChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */; }; D00C7CCD1E3620C30080C3D5 /* CachedChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */; }; D00C7CE01E3785710080C3D5 /* MarkMessageContentAsConsumedInteractively.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CDF1E3785700080C3D5 /* MarkMessageContentAsConsumedInteractively.swift */; }; @@ -885,6 +886,7 @@ D00580AD21E2A08900CB7CD3 /* AccountEnvironmentAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountEnvironmentAttribute.swift; sourceTree = ""; }; D00BDA181EE593D600C64C5E /* TelegramChannelAdminRights.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramChannelAdminRights.swift; sourceTree = ""; }; D00BDA1B1EE5952A00C64C5E /* TelegramChannelBannedRights.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramChannelBannedRights.swift; sourceTree = ""; }; + D00C73BA23055AA8004B1E2B /* MacInternalUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacInternalUpdater.swift; sourceTree = ""; }; D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedChannelParticipants.swift; sourceTree = ""; }; D00C7CDF1E3785700080C3D5 /* MarkMessageContentAsConsumedInteractively.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkMessageContentAsConsumedInteractively.swift; sourceTree = ""; }; D00C7CEA1E37A8540080C3D5 /* SetSecretChatMessageAutoremoveTimeoutInteractively.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetSecretChatMessageAutoremoveTimeoutInteractively.swift; sourceTree = ""; }; @@ -1314,6 +1316,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + D00C73B923055A60004B1E2B /* Mac Internal Updates */ = { + isa = PBXGroup; + children = ( + D00C73BA23055AA8004B1E2B /* MacInternalUpdater.swift */, + ); + name = "Mac Internal Updates"; + sourceTree = ""; + }; D01B27A01E394D7B0022A4C0 /* Settings */ = { isa = PBXGroup; children = ( @@ -1879,6 +1889,7 @@ D09D8C031D4FAB1D0081DBEC /* TelegramCore */ = { isa = PBXGroup; children = ( + D00C73B923055A60004B1E2B /* Mac Internal Updates */, D03B0C791D62153400955575 /* third-party */, D03B0CB71D62232000955575 /* Utils */, D03B0CCF1D62242200955575 /* Objects */, @@ -3014,6 +3025,7 @@ D0FA8BA21E1F99E1001E855B /* SecretChatFileReference.swift in Sources */, D0B844301DAB91E0005F29E1 /* NBNumberFormat.m in Sources */, D001F3F71E128A1C007A8C60 /* ApplyUpdateMessage.swift in Sources */, + D00C73BB23055AA8004B1E2B /* MacInternalUpdater.swift in Sources */, D0B418971D7E0580004562A4 /* TelegramMediaImage.swift in Sources */, D01843A92190C28100278AFF /* ConfirmTwoStepRecoveryEmail.swift in Sources */, D041E3F91E535A88008C24B4 /* RemovePeerMember.swift in Sources */, From 02f87073971d5a9d49e46fb7311e90209e7e489b Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 16:48:30 +0300 Subject: [PATCH 05/86] - modules refactor [skip ci] --- .../Crc32_Xcode.xcodeproj/project.pbxproj | 666 ++++++++++++++++ .../TelegramCore/FormatPhoneNumber.m | 4 + .../InteractivePhoneFormatter.swift | 5 + .../TelegramCore/PhoneNumbers.swift | 4 + .../project.pbxproj | 4 + .../libphonenumber/Sources/NBPhoneNumber.h | 5 +- .../Sources/NBPhoneNumberUtil.h | 5 +- .../project.pbxproj | 722 +++++++++++++++++- .../libphonenumbermac/Info.plist | 24 + .../libphonenumbermac/libphonenumbermac.h | 12 + submodules/sqlcipher/Sources/sqlite3.c | 5 +- .../sqlcipher_Xcode.xcodeproj/project.pbxproj | 722 ++++++++++++++++++ 12 files changed, 2174 insertions(+), 4 deletions(-) create mode 100644 submodules/libphonenumber/libphonenumbermac/Info.plist create mode 100644 submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h diff --git a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj index 4670f11c1a..a393207e5e 100644 --- a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj +++ b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj @@ -225,6 +225,660 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappAlphaMac; + }; + D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Crc32; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappAlphaMac; + }; + D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = crc32mac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappAlphaMac; + }; + D0208AAF2306E7F700A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStore; + }; + D0208AB02306E7F700A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Crc32; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0208AB12306E7F700A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = crc32mac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStore; + }; + D0208AB22306E7FD00A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStore; + }; + D0208AB32306E7FD00A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Crc32; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0208AB42306E7FD00A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = crc32mac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStore; + }; + D0208AB52306E80300A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyapp; + }; + D0208AB62306E80300A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Crc32; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; + D0208AB72306E80300A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = crc32mac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.crc32mac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyapp; + }; D03E456A2305CC310049C28B /* DebugAppStoreLLC */ = { isa = XCBuildConfiguration; buildSettings = { @@ -887,7 +1541,11 @@ buildConfigurations = ( D03E456A2305CC310049C28B /* DebugAppStoreLLC */, D03E456F2305CC4E0049C28B /* DebugHockeyapp */, + D0208AAF2306E7F700A23503 /* DebugAppStore */, + D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */, D03E456B2305CC310049C28B /* ReleaseAppStoreLLC */, + D0208AB22306E7FD00A23503 /* ReleaseAppStore */, + D0208AB52306E80300A23503 /* ReleaseHockeyapp */, D03E45712305CC590049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -898,7 +1556,11 @@ buildConfigurations = ( D03E456D2305CC310049C28B /* DebugAppStoreLLC */, D03E45702305CC4E0049C28B /* DebugHockeyapp */, + D0208AB02306E7F700A23503 /* DebugAppStore */, + D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */, D03E456E2305CC310049C28B /* ReleaseAppStoreLLC */, + D0208AB32306E7FD00A23503 /* ReleaseAppStore */, + D0208AB62306E80300A23503 /* ReleaseHockeyapp */, D03E45722305CC590049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -909,7 +1571,11 @@ buildConfigurations = ( D03E46372306E0BB0049C28B /* DebugAppStoreLLC */, D03E46382306E0BB0049C28B /* DebugHockeyapp */, + D0208AB12306E7F700A23503 /* DebugAppStore */, + D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */, D03E46392306E0BB0049C28B /* ReleaseAppStoreLLC */, + D0208AB42306E7FD00A23503 /* ReleaseAppStore */, + D0208AB72306E80300A23503 /* ReleaseHockeyapp */, D03E463A2306E0BB0049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; diff --git a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m index 926270cc1d..58e9d3d7e0 100644 --- a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m +++ b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m @@ -1,6 +1,10 @@ #import "FormatPhoneNumber.h" +#if TARGET_OS_IOS #import +#else +#import +#endif static NBPhoneNumberUtil *getNBPhoneNumberUtil() { static NBPhoneNumberUtil *value; diff --git a/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift b/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift index 24405329bb..28ea06c4c5 100644 --- a/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift +++ b/submodules/TelegramCore/TelegramCore/InteractivePhoneFormatter.swift @@ -1,5 +1,10 @@ import Foundation + +#if os(macOS) +import libphonenumbermac +#else import libphonenumber +#endif public final class InteractivePhoneFormatter { private let formatter = NBAsYouTypeFormatter(regionCode: "US")! diff --git a/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift b/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift index fd0afc5e50..47c68731b9 100644 --- a/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift +++ b/submodules/TelegramCore/TelegramCore/PhoneNumbers.swift @@ -1,5 +1,9 @@ import Foundation +#if os(macOS) +import libphonenumbermac +#else import libphonenumber +#endif private let phoneNumberUtil = NBPhoneNumberUtil() diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index e39dd695d5..f25af74257 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -180,6 +180,7 @@ D01C7F051EFC1C49008305F1 /* DeviceContact.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C7F031EFC1C49008305F1 /* DeviceContact.swift */; }; D01D6BF91E42A713006151C6 /* SearchStickers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01D6BF81E42A713006151C6 /* SearchStickers.swift */; }; D01D6BFA1E42A718006151C6 /* SearchStickers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01D6BF81E42A713006151C6 /* SearchStickers.swift */; }; + D0208AF42306E92B00A23503 /* libphonenumbermac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0208AF32306E92B00A23503 /* libphonenumbermac.framework */; }; D020F00722F19C8F00BE699A /* ManagedAnimatedEmojiUpdates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0925903622F0D02D003D6283 /* ManagedAnimatedEmojiUpdates.swift */; }; D021E0DF1DB539FC00C6B04F /* StickerPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0DE1DB539FC00C6B04F /* StickerPack.swift */; }; D021E0E21DB5401A00C6B04F /* StickerManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0E11DB5401A00C6B04F /* StickerManagement.swift */; }; @@ -868,6 +869,7 @@ D01C7ED51EF5E468008305F1 /* ProxySettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxySettings.swift; sourceTree = ""; }; D01C7F031EFC1C49008305F1 /* DeviceContact.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceContact.swift; sourceTree = ""; }; D01D6BF81E42A713006151C6 /* SearchStickers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchStickers.swift; sourceTree = ""; }; + D0208AF32306E92B00A23503 /* libphonenumbermac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = libphonenumbermac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D021E0DE1DB539FC00C6B04F /* StickerPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerPack.swift; sourceTree = ""; }; D021E0E11DB5401A00C6B04F /* StickerManagement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerManagement.swift; sourceTree = ""; }; D0223A971EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaResourceNetworkStatsTag.swift; sourceTree = ""; }; @@ -1227,6 +1229,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D0208AF42306E92B00A23503 /* libphonenumbermac.framework in Frameworks */, D0CC4ADC22BA47280088F36D /* TelegramApiMac.framework in Frameworks */, D0B4187F1D7E054E004562A4 /* MtProtoKitMac.framework in Frameworks */, D0B418721D7E0409004562A4 /* PostboxMac.framework in Frameworks */, @@ -1653,6 +1656,7 @@ D06706631D512ADA00DED3E3 /* Frameworks */ = { isa = PBXGroup; children = ( + D0208AF32306E92B00A23503 /* libphonenumbermac.framework */, D03E45D32305D44A0049C28B /* libphonenumber.framework */, D03E45D02305D34C0049C28B /* libphonenumber_iOS.framework */, D0CC4ADB22BA47280088F36D /* TelegramApiMac.framework */, diff --git a/submodules/libphonenumber/Sources/NBPhoneNumber.h b/submodules/libphonenumber/Sources/NBPhoneNumber.h index 51b3a2ac46..abff40ed9b 100755 --- a/submodules/libphonenumber/Sources/NBPhoneNumber.h +++ b/submodules/libphonenumber/Sources/NBPhoneNumber.h @@ -5,8 +5,11 @@ // #import +#if TARGET_OS_IOS #import - +#else +#import +#endif @interface NBPhoneNumber : NSObject diff --git a/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h b/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h index 4d1ce4fea0..fea42a7444 100755 --- a/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h +++ b/submodules/libphonenumber/Sources/NBPhoneNumberUtil.h @@ -7,8 +7,11 @@ // #import +#if TARGET_OS_IOS #import - +#else +#import +#endif @class NBPhoneMetaData, NBPhoneNumber; diff --git a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj index 032c923888..315dab9d6d 100644 --- a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj +++ b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,36 @@ objects = { /* Begin PBXBuildFile section */ + D0208ABB2306E84F00A23503 /* libphonenumbermac.h in Headers */ = {isa = PBXBuildFile; fileRef = D0208AB92306E84F00A23503 /* libphonenumbermac.h */; }; + D0208ABC2306E84F00A23503 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D0208ABA2306E84F00A23503 /* Info.plist */; }; + D0208ABF2306E85800A23503 /* NBMetadataCoreTest.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459B2305D1EF0049C28B /* NBMetadataCoreTest.h */; }; + D0208AC02306E85800A23503 /* NBPhoneMetaDataGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A22305D1EF0049C28B /* NBPhoneMetaDataGenerator.h */; }; + D0208AC12306E85800A23503 /* NBNumberFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45992305D1EF0049C28B /* NBNumberFormat.h */; }; + D0208AC32306E85800A23503 /* NBPhoneNumberUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A62305D1F00049C28B /* NBPhoneNumberUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC42306E85800A23503 /* libphonenumbermac.h in Headers */ = {isa = PBXBuildFile; fileRef = D0208AB92306E84F00A23503 /* libphonenumbermac.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC52306E85800A23503 /* NBMetadataCoreMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A02305D1EF0049C28B /* NBMetadataCoreMapper.h */; }; + D0208AC62306E85800A23503 /* NBAsYouTypeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459D2305D1EF0049C28B /* NBAsYouTypeFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC72306E85800A23503 /* NBPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45AA2305D1F10049C28B /* NBPhoneNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC82306E85800A23503 /* NBPhoneNumberDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459C2305D1EF0049C28B /* NBPhoneNumberDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0208AC92306E85800A23503 /* NBMetadataCore.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459E2305D1EF0049C28B /* NBMetadataCore.h */; }; + D0208ACA2306E85800A23503 /* NBPhoneMetaData.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45B02305D1F10049C28B /* NBPhoneMetaData.h */; }; + D0208ACB2306E85800A23503 /* NBPhoneNumberDesc.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A72305D1F00049C28B /* NBPhoneNumberDesc.h */; }; + D0208ACC2306E85800A23503 /* NBMetadataHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459A2305D1EF0049C28B /* NBMetadataHelper.h */; }; + D0208ACD2306E85800A23503 /* NBMetadataCoreTestMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A82305D1F00049C28B /* NBMetadataCoreTestMapper.h */; }; + D0208ACF2306E85800A23503 /* NBMetadataCoreMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A42305D1F00049C28B /* NBMetadataCoreMapper.m */; }; + D0208AD02306E85800A23503 /* NBMetadataCoreTestMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A32305D1F00049C28B /* NBMetadataCoreTestMapper.m */; }; + D0208AD12306E85800A23503 /* NBPhoneNumberDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A12305D1EF0049C28B /* NBPhoneNumberDefines.m */; }; + D0208AD22306E85800A23503 /* NBNumberFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AE2305D1F10049C28B /* NBNumberFormat.m */; }; + D0208AD32306E85800A23503 /* NBAsYouTypeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45B12305D1F10049C28B /* NBAsYouTypeFormatter.m */; }; + D0208AD42306E85800A23503 /* NBMetadataCore.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A92305D1F00049C28B /* NBMetadataCore.m */; }; + D0208AD52306E85800A23503 /* NBPhoneNumberDesc.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E459F2305D1EF0049C28B /* NBPhoneNumberDesc.m */; }; + D0208AD62306E85800A23503 /* NBPhoneNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AD2305D1F10049C28B /* NBPhoneNumber.m */; }; + D0208AD72306E85800A23503 /* NBPhoneMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AF2305D1F10049C28B /* NBPhoneMetaData.m */; }; + D0208AD82306E85800A23503 /* NBMetadataCoreTest.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45B22305D1F10049C28B /* NBMetadataCoreTest.m */; }; + D0208AD92306E85800A23503 /* NBPhoneMetaDataGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AB2305D1F10049C28B /* NBPhoneMetaDataGenerator.m */; }; + D0208ADA2306E85800A23503 /* NBMetadataHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45AC2305D1F10049C28B /* NBMetadataHelper.m */; }; + D0208ADB2306E85800A23503 /* NBPhoneNumberUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E45A52305D1F00049C28B /* NBPhoneNumberUtil.m */; }; + D0208ADD2306E85800A23503 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E45CE2305D32D0049C28B /* Foundation.framework */; }; D03E458F2305CE840049C28B /* libphonenumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E458D2305CE840049C28B /* libphonenumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E45B32305D1F20049C28B /* NBNumberFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45992305D1EF0049C28B /* NBNumberFormat.h */; }; D03E45B42305D1F20049C28B /* NBMetadataHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459A2305D1EF0049C28B /* NBMetadataHelper.h */; }; @@ -38,6 +68,9 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + D0208AB92306E84F00A23503 /* libphonenumbermac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libphonenumbermac.h; sourceTree = ""; }; + D0208ABA2306E84F00A23503 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0208AE52306E85800A23503 /* libphonenumbermac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libphonenumbermac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E458A2305CE830049C28B /* libphonenumber.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libphonenumber.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E458D2305CE840049C28B /* libphonenumber.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libphonenumber.h; sourceTree = ""; }; D03E458E2305CE840049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -71,6 +104,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + D0208ADC2306E85800A23503 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208ADD2306E85800A23503 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D03E45872305CE830049C28B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -82,10 +123,20 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + D0208AB82306E84F00A23503 /* libphonenumbermac */ = { + isa = PBXGroup; + children = ( + D0208AB92306E84F00A23503 /* libphonenumbermac.h */, + D0208ABA2306E84F00A23503 /* Info.plist */, + ); + path = libphonenumbermac; + sourceTree = ""; + }; D03E45802305CE830049C28B = { isa = PBXGroup; children = ( D03E458E2305CE840049C28B /* Info.plist */, + D0208AB82306E84F00A23503 /* libphonenumbermac */, D03E458C2305CE840049C28B /* Sources */, D03E458B2305CE830049C28B /* Products */, D03E45CD2305D32D0049C28B /* Frameworks */, @@ -96,6 +147,7 @@ isa = PBXGroup; children = ( D03E458A2305CE830049C28B /* libphonenumber.framework */, + D0208AE52306E85800A23503 /* libphonenumbermac.framework */, ); name = Products; sourceTree = ""; @@ -145,6 +197,27 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + D0208ABE2306E85800A23503 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208AC42306E85800A23503 /* libphonenumbermac.h in Headers */, + D0208ABF2306E85800A23503 /* NBMetadataCoreTest.h in Headers */, + D0208AC02306E85800A23503 /* NBPhoneMetaDataGenerator.h in Headers */, + D0208AC12306E85800A23503 /* NBNumberFormat.h in Headers */, + D0208AC32306E85800A23503 /* NBPhoneNumberUtil.h in Headers */, + D0208AC52306E85800A23503 /* NBMetadataCoreMapper.h in Headers */, + D0208AC62306E85800A23503 /* NBAsYouTypeFormatter.h in Headers */, + D0208AC72306E85800A23503 /* NBPhoneNumber.h in Headers */, + D0208AC82306E85800A23503 /* NBPhoneNumberDefines.h in Headers */, + D0208AC92306E85800A23503 /* NBMetadataCore.h in Headers */, + D0208ACA2306E85800A23503 /* NBPhoneMetaData.h in Headers */, + D0208ACB2306E85800A23503 /* NBPhoneNumberDesc.h in Headers */, + D0208ACC2306E85800A23503 /* NBMetadataHelper.h in Headers */, + D0208ACD2306E85800A23503 /* NBMetadataCoreTestMapper.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D03E45852305CE830049C28B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -154,6 +227,7 @@ D03E45B32305D1F20049C28B /* NBNumberFormat.h in Headers */, D03E458F2305CE840049C28B /* libphonenumber.h in Headers */, D03E45C02305D1F20049C28B /* NBPhoneNumberUtil.h in Headers */, + D0208ABB2306E84F00A23503 /* libphonenumbermac.h in Headers */, D03E45BA2305D1F20049C28B /* NBMetadataCoreMapper.h in Headers */, D03E45B72305D1F20049C28B /* NBAsYouTypeFormatter.h in Headers */, D03E45C42305D1F20049C28B /* NBPhoneNumber.h in Headers */, @@ -169,6 +243,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + D0208ABD2306E85800A23503 /* libphonenumbermac */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0208AE02306E85800A23503 /* Build configuration list for PBXNativeTarget "libphonenumbermac" */; + buildPhases = ( + D0208ABE2306E85800A23503 /* Headers */, + D0208ACE2306E85800A23503 /* Sources */, + D0208ADC2306E85800A23503 /* Frameworks */, + D0208ADE2306E85800A23503 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = libphonenumbermac; + productName = "libphonenumber-iOS"; + productReference = D0208AE52306E85800A23503 /* libphonenumbermac.framework */; + productType = "com.apple.product-type.framework"; + }; D03E45892305CE830049C28B /* libphonenumber */ = { isa = PBXNativeTarget; buildConfigurationList = D03E45922305CE840049C28B /* Build configuration list for PBXNativeTarget "libphonenumber" */; @@ -215,21 +307,50 @@ projectRoot = ""; targets = ( D03E45892305CE830049C28B /* libphonenumber */, + D0208ABD2306E85800A23503 /* libphonenumbermac */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - D03E45882305CE830049C28B /* Resources */ = { + D0208ADE2306E85800A23503 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; + D03E45882305CE830049C28B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208ABC2306E84F00A23503 /* Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + D0208ACE2306E85800A23503 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0208ACF2306E85800A23503 /* NBMetadataCoreMapper.m in Sources */, + D0208AD02306E85800A23503 /* NBMetadataCoreTestMapper.m in Sources */, + D0208AD12306E85800A23503 /* NBPhoneNumberDefines.m in Sources */, + D0208AD22306E85800A23503 /* NBNumberFormat.m in Sources */, + D0208AD32306E85800A23503 /* NBAsYouTypeFormatter.m in Sources */, + D0208AD42306E85800A23503 /* NBMetadataCore.m in Sources */, + D0208AD52306E85800A23503 /* NBPhoneNumberDesc.m in Sources */, + D0208AD62306E85800A23503 /* NBPhoneNumber.m in Sources */, + D0208AD72306E85800A23503 /* NBPhoneMetaData.m in Sources */, + D0208AD82306E85800A23503 /* NBMetadataCoreTest.m in Sources */, + D0208AD92306E85800A23503 /* NBPhoneMetaDataGenerator.m in Sources */, + D0208ADA2306E85800A23503 /* NBMetadataHelper.m in Sources */, + D0208ADB2306E85800A23503 /* NBPhoneNumberUtil.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D03E45862305CE830049C28B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -253,6 +374,578 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + D0208AE12306E85800A23503 /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0208AE22306E85800A23503 /* DebugHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0208AE32306E85800A23503 /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D0208AE42306E85800A23503 /* ReleaseHockeyappInternal */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0208AE72306E86800A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStore; + }; + D0208AE82306E86800A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0208AE92306E86800A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0208AEA2306E87100A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappAlphaMac; + }; + D0208AEB2306E87100A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappAlphaMac; + }; + D0208AEC2306E87100A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappAlphaMac; + }; + D0208AED2306E87700A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStore; + }; + D0208AEE2306E87700A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0208AEF2306E87700A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0208AF02306E87E00A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyapp; + }; + D0208AF12306E87E00A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumber; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; + D0208AF22306E87E00A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libphonenumbermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.libphonenumbermac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; D03E45902305CE840049C28B /* DebugAppStoreLLC */ = { isa = XCBuildConfiguration; buildSettings = { @@ -306,6 +999,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -362,6 +1056,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -478,6 +1173,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -561,6 +1257,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -600,12 +1297,31 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + D0208AE02306E85800A23503 /* Build configuration list for PBXNativeTarget "libphonenumbermac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0208AE12306E85800A23503 /* DebugAppStoreLLC */, + D0208AE22306E85800A23503 /* DebugHockeyapp */, + D0208AEC2306E87100A23503 /* HockeyappAlphaMac */, + D0208AE92306E86800A23503 /* DebugAppStore */, + D0208AE32306E85800A23503 /* ReleaseAppStoreLLC */, + D0208AEF2306E87700A23503 /* ReleaseAppStore */, + D0208AF22306E87E00A23503 /* ReleaseHockeyapp */, + D0208AE42306E85800A23503 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; D03E45842305CE830049C28B /* Build configuration list for PBXProject "libphonenumber_Xcode" */ = { isa = XCConfigurationList; buildConfigurations = ( D03E45902305CE840049C28B /* DebugAppStoreLLC */, D03E45952305CE9A0049C28B /* DebugHockeyapp */, + D0208AEA2306E87100A23503 /* HockeyappAlphaMac */, + D0208AE72306E86800A23503 /* DebugAppStore */, D03E45912305CE840049C28B /* ReleaseAppStoreLLC */, + D0208AED2306E87700A23503 /* ReleaseAppStore */, + D0208AF02306E87E00A23503 /* ReleaseHockeyapp */, D03E45972305CEA30049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -616,7 +1332,11 @@ buildConfigurations = ( D03E45932305CE840049C28B /* DebugAppStoreLLC */, D03E45962305CE9A0049C28B /* DebugHockeyapp */, + D0208AEB2306E87100A23503 /* HockeyappAlphaMac */, + D0208AE82306E86800A23503 /* DebugAppStore */, D03E45942305CE840049C28B /* ReleaseAppStoreLLC */, + D0208AEE2306E87700A23503 /* ReleaseAppStore */, + D0208AF12306E87E00A23503 /* ReleaseHockeyapp */, D03E45982305CEA30049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; diff --git a/submodules/libphonenumber/libphonenumbermac/Info.plist b/submodules/libphonenumber/libphonenumbermac/Info.plist new file mode 100644 index 0000000000..5371a6e108 --- /dev/null +++ b/submodules/libphonenumber/libphonenumbermac/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSHumanReadableCopyright + Copyright © 2019 Telegram Messenger LLP. All rights reserved. + + diff --git a/submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h b/submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h new file mode 100644 index 0000000000..520bbb7cd2 --- /dev/null +++ b/submodules/libphonenumber/libphonenumbermac/libphonenumbermac.h @@ -0,0 +1,12 @@ +#import + +//! Project version number for libphonenumber_Mac. +FOUNDATION_EXPORT double libphonenumbermac_VersionNumber; + +//! Project version string for libphonenumber_Mac. +FOUNDATION_EXPORT const unsigned char libphonenumbermac_VersionString[]; + +#import +#import +#import +#import diff --git a/submodules/sqlcipher/Sources/sqlite3.c b/submodules/sqlcipher/Sources/sqlite3.c index 64b5ac6297..6d86b973f0 100644 --- a/submodules/sqlcipher/Sources/sqlite3.c +++ b/submodules/sqlcipher/Sources/sqlite3.c @@ -17,8 +17,11 @@ ** language. The code for the "sqlite3" command-line shell is also in a ** separate file. This file contains only code for the core SQLite library. */ +#if TARGET_OS_IOS #include - +#else +#include +#endif #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 #ifndef SQLITE_PRIVATE diff --git a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj index fca9d0b6aa..ae83a099c3 100644 --- a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj +++ b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj @@ -243,6 +243,716 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + D0208AA02306E7B400A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappAlphaMac; + }; + D0208AA12306E7B400A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappAlphaMac; + }; + D0208AA22306E7B400A23503 /* HockeyappAlphaMac */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappAlphaMac; + }; + D0208AA32306E7CA00A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStore; + }; + D0208AA42306E7CA00A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0208AA52306E7CA00A23503 /* DebugAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStore; + }; + D0208AA62306E7D400A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStore; + }; + D0208AA72306E7D400A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0208AA82306E7D400A23503 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStore; + }; + D0208AA92306E7D900A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyapp; + }; + D0208AAA2306E7D900A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlcipher; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; + D0208AAB2306E7D900A23503 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = sqlciphermac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.sqlciphermac; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyapp; + }; D03E45412305C6E40049C28B /* DebugAppStoreLLC */ = { isa = XCBuildConfiguration; buildSettings = { @@ -961,7 +1671,11 @@ buildConfigurations = ( D03E45412305C6E40049C28B /* DebugAppStoreLLC */, D03E45462305C7090049C28B /* DebugHockeyapp */, + D0208AA02306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA32306E7CA00A23503 /* DebugAppStore */, D03E45422305C6E40049C28B /* ReleaseAppStoreLLC */, + D0208AA62306E7D400A23503 /* ReleaseAppStore */, + D0208AA92306E7D900A23503 /* ReleaseHockeyapp */, D03E45482305C7130049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -972,7 +1686,11 @@ buildConfigurations = ( D03E45442305C6E40049C28B /* DebugAppStoreLLC */, D03E45472305C7090049C28B /* DebugHockeyapp */, + D0208AA12306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA42306E7CA00A23503 /* DebugAppStore */, D03E45452305C6E40049C28B /* ReleaseAppStoreLLC */, + D0208AA72306E7D400A23503 /* ReleaseAppStore */, + D0208AAA2306E7D900A23503 /* ReleaseHockeyapp */, D03E45492305C7130049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; @@ -983,7 +1701,11 @@ buildConfigurations = ( D03E461B2306DF740049C28B /* DebugAppStoreLLC */, D03E461C2306DF740049C28B /* DebugHockeyapp */, + D0208AA22306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA52306E7CA00A23503 /* DebugAppStore */, D03E461D2306DF740049C28B /* ReleaseAppStoreLLC */, + D0208AA82306E7D400A23503 /* ReleaseAppStore */, + D0208AAB2306E7D900A23503 /* ReleaseHockeyapp */, D03E461E2306DF740049C28B /* ReleaseHockeyappInternal */, ); defaultConfigurationIsVisible = 0; From e6ec0f77e72cbeb8a159aeef4e6eb669340f2474 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 16:50:31 +0300 Subject: [PATCH 06/86] no message --- .../TelegramCore_Xcode.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index f25af74257..892f4f74b5 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -184,6 +184,9 @@ D020F00722F19C8F00BE699A /* ManagedAnimatedEmojiUpdates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0925903622F0D02D003D6283 /* ManagedAnimatedEmojiUpdates.swift */; }; D021E0DF1DB539FC00C6B04F /* StickerPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0DE1DB539FC00C6B04F /* StickerPack.swift */; }; D021E0E21DB5401A00C6B04F /* StickerManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0E11DB5401A00C6B04F /* StickerManagement.swift */; }; + D021E7E82306EC03002F8BD1 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986A22FD882200915E37 /* OutgoingScheduleInfoMessageAttribute.swift */; }; + D021E7E92306EC03002F8BD1 /* ScheduledMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FC986C22FD99D400915E37 /* ScheduledMessages.swift */; }; + D021E7EA2306EC03002F8BD1 /* ValidateAddressNameInteractive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E416B2304D5B30049C28B /* ValidateAddressNameInteractive.swift */; }; D0223A981EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A971EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift */; }; D0223A991EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A971EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift */; }; D0223A9B1EA5654D00211D94 /* TelegramMediaResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A9A1EA5654D00211D94 /* TelegramMediaResource.swift */; }; @@ -2492,6 +2495,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D021E7E82306EC03002F8BD1 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */, + D021E7E92306EC03002F8BD1 /* ScheduledMessages.swift in Sources */, + D021E7EA2306EC03002F8BD1 /* ValidateAddressNameInteractive.swift in Sources */, D020F00722F19C8F00BE699A /* ManagedAnimatedEmojiUpdates.swift in Sources */, D05FDC3922CA45070060BFE3 /* AppUpdate.swift in Sources */, D014193922AE6B85008667CB /* ChannelOwnershipTransfer.swift in Sources */, From 2087a7034156f4feaf89f99ea750622fed76cd29 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 22:23:56 +0300 Subject: [PATCH 07/86] no message --- .../Crc32_Xcode.xcodeproj/project.pbxproj | 26 ++++++++++++------- .../TelegramCore/FormatPhoneNumber.m | 2 +- .../TelegramCoreMac/TelegramCoreMac.h | 4 +++ .../project.pbxproj | 16 +++++++++++- .../project.pbxproj | 18 ++++++------- .../sqlcipher_Xcode.xcodeproj/project.pbxproj | 18 ++++++------- 6 files changed, 55 insertions(+), 29 deletions(-) diff --git a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj index a393207e5e..ac6072ee0a 100644 --- a/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj +++ b/submodules/Crc32/Crc32_Xcode.xcodeproj/project.pbxproj @@ -225,7 +225,7 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */ = { + D0208AAC2306E7EB00A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -286,9 +286,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */ = { + D0208AAD2306E7EB00A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -312,9 +312,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */ = { + D0208AAE2306E7EB00A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -381,6 +381,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -393,7 +394,7 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; D0208AAF2306E7F700A23503 /* DebugAppStore */ = { isa = XCBuildConfiguration; @@ -551,6 +552,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -709,6 +711,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -866,6 +869,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1290,6 +1294,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1371,6 +1376,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1446,6 +1452,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1520,6 +1527,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1542,7 +1550,7 @@ D03E456A2305CC310049C28B /* DebugAppStoreLLC */, D03E456F2305CC4E0049C28B /* DebugHockeyapp */, D0208AAF2306E7F700A23503 /* DebugAppStore */, - D0208AAC2306E7EB00A23503 /* HockeyappAlphaMac */, + D0208AAC2306E7EB00A23503 /* HockeyappMacAlpha */, D03E456B2305CC310049C28B /* ReleaseAppStoreLLC */, D0208AB22306E7FD00A23503 /* ReleaseAppStore */, D0208AB52306E80300A23503 /* ReleaseHockeyapp */, @@ -1557,7 +1565,7 @@ D03E456D2305CC310049C28B /* DebugAppStoreLLC */, D03E45702305CC4E0049C28B /* DebugHockeyapp */, D0208AB02306E7F700A23503 /* DebugAppStore */, - D0208AAD2306E7EB00A23503 /* HockeyappAlphaMac */, + D0208AAD2306E7EB00A23503 /* HockeyappMacAlpha */, D03E456E2305CC310049C28B /* ReleaseAppStoreLLC */, D0208AB32306E7FD00A23503 /* ReleaseAppStore */, D0208AB62306E80300A23503 /* ReleaseHockeyapp */, @@ -1572,7 +1580,7 @@ D03E46372306E0BB0049C28B /* DebugAppStoreLLC */, D03E46382306E0BB0049C28B /* DebugHockeyapp */, D0208AB12306E7F700A23503 /* DebugAppStore */, - D0208AAE2306E7EB00A23503 /* HockeyappAlphaMac */, + D0208AAE2306E7EB00A23503 /* HockeyappMacAlpha */, D03E46392306E0BB0049C28B /* ReleaseAppStoreLLC */, D0208AB42306E7FD00A23503 /* ReleaseAppStore */, D0208AB72306E80300A23503 /* ReleaseHockeyapp */, diff --git a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m index 58e9d3d7e0..31f9d8c847 100644 --- a/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m +++ b/submodules/TelegramCore/TelegramCore/FormatPhoneNumber.m @@ -3,7 +3,7 @@ #if TARGET_OS_IOS #import #else -#import +#import #endif static NBPhoneNumberUtil *getNBPhoneNumberUtil() { diff --git a/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h b/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h index 2cef829046..1a7e5b057d 100644 --- a/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h +++ b/submodules/TelegramCore/TelegramCoreMac/TelegramCoreMac.h @@ -17,3 +17,7 @@ FOUNDATION_EXPORT const unsigned char TelegramCoreMacVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import +#import +#import +#import +#import diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 892f4f74b5..01709b9ca6 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -299,7 +299,7 @@ D03E416C2304D5B30049C28B /* ValidateAddressNameInteractive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E416B2304D5B30049C28B /* ValidateAddressNameInteractive.swift */; }; D03E452E2305C15A0049C28B /* FormatPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E452C2305C15A0049C28B /* FormatPhoneNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E452F2305C15A0049C28B /* FormatPhoneNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E452D2305C15A0049C28B /* FormatPhoneNumber.m */; }; - D03E45302305C1630049C28B /* FormatPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E452C2305C15A0049C28B /* FormatPhoneNumber.h */; }; + D03E45302305C1630049C28B /* FormatPhoneNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E452C2305C15A0049C28B /* FormatPhoneNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E45D42305D44A0049C28B /* libphonenumber.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E45D32305D44A0049C28B /* libphonenumber.framework */; }; D03E45D82305D66D0049C28B /* Crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = D02609BB20C6EB97006C34AC /* Crypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E45D92305D66E0049C28B /* Crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = D02609BB20C6EB97006C34AC /* Crypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -347,6 +347,8 @@ D049EAF61E44DF3300A2CD3A /* AccountState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D049EAF41E44DF3300A2CD3A /* AccountState.swift */; }; D04CAA5A1E83310D0047E51F /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CAA591E83310D0047E51F /* MD5.swift */; }; D04CAA5B1E83310D0047E51F /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CAA591E83310D0047E51F /* MD5.swift */; }; + D04D21372306EC9A00609388 /* MacInternalUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D21362306EC9A00609388 /* MacInternalUpdater.swift */; }; + D04D21382306ECF600609388 /* FormatPhoneNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E452D2305C15A0049C28B /* FormatPhoneNumber.m */; }; D04D8FF4209A4B0700865719 /* NetworkSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D8FF3209A4B0700865719 /* NetworkSettings.swift */; }; D04D8FF5209A4B0700865719 /* NetworkSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D8FF3209A4B0700865719 /* NetworkSettings.swift */; }; D050F2101E48AB0600988324 /* InteractivePhoneFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D050F20F1E48AB0600988324 /* InteractivePhoneFormatter.swift */; }; @@ -983,6 +985,7 @@ D049EAEA1E44B71B00A2CD3A /* RecentlySearchedPeerIds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentlySearchedPeerIds.swift; sourceTree = ""; }; D049EAF41E44DF3300A2CD3A /* AccountState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountState.swift; sourceTree = ""; }; D04CAA591E83310D0047E51F /* MD5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MD5.swift; sourceTree = ""; }; + D04D21362306EC9A00609388 /* MacInternalUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacInternalUpdater.swift; sourceTree = ""; }; D04D8FF3209A4B0700865719 /* NetworkSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSettings.swift; sourceTree = ""; }; D050F20F1E48AB0600988324 /* InteractivePhoneFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractivePhoneFormatter.swift; sourceTree = ""; }; D050F2501E4A59C200988324 /* JoinLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinLink.swift; sourceTree = ""; }; @@ -1636,6 +1639,14 @@ name = Accounts; sourceTree = ""; }; + D04D21352306EC8700609388 /* Mac Internal Updater */ = { + isa = PBXGroup; + children = ( + D04D21362306EC9A00609388 /* MacInternalUpdater.swift */, + ); + name = "Mac Internal Updater"; + sourceTree = ""; + }; D05A32DF1E6F096B002760B4 /* Settings */ = { isa = PBXGroup; children = ( @@ -1767,6 +1778,7 @@ D09D8C031D4FAB1D0081DBEC /* TelegramCore */ = { isa = PBXGroup; children = ( + D04D21352306EC8700609388 /* Mac Internal Updater */, D03B0CB71D62232000955575 /* Utils */, D03B0CCF1D62242200955575 /* Objects */, D03B0CFE1D62252200955575 /* State */, @@ -2495,6 +2507,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D04D21382306ECF600609388 /* FormatPhoneNumber.m in Sources */, D021E7E82306EC03002F8BD1 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */, D021E7E92306EC03002F8BD1 /* ScheduledMessages.swift in Sources */, D021E7EA2306EC03002F8BD1 /* ValidateAddressNameInteractive.swift in Sources */, @@ -2825,6 +2838,7 @@ D054648F20738626002ECC1E /* SecureIdDriversLicenseValue.swift in Sources */, D0529D2821A4141800D7C3C4 /* ManagedSynchronizeRecentlyUsedMediaOperations.swift in Sources */, D050F2641E4A5AEB00988324 /* ManagedSynchronizePinnedChatsOperations.swift in Sources */, + D04D21372306EC9A00609388 /* MacInternalUpdater.swift in Sources */, D0575AF21E9FFA5D006F2541 /* SynchronizeSavedGifsOperation.swift in Sources */, D0528E661E65C82400E2FEF5 /* UpdateContactName.swift in Sources */, D0EE7FC82098853100981319 /* SecureIdTemporaryRegistrationValue.swift in Sources */, diff --git a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj index 315dab9d6d..1a04b246b5 100644 --- a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj +++ b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj @@ -604,7 +604,7 @@ }; name = DebugAppStore; }; - D0208AEA2306E87100A23503 /* HockeyappAlphaMac */ = { + D0208AEA2306E87100A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -665,9 +665,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AEB2306E87100A23503 /* HockeyappAlphaMac */ = { + D0208AEB2306E87100A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; @@ -692,9 +692,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AEC2306E87100A23503 /* HockeyappAlphaMac */ = { + D0208AEC2306E87100A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; @@ -720,7 +720,7 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; D0208AED2306E87700A23503 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; @@ -1302,7 +1302,7 @@ buildConfigurations = ( D0208AE12306E85800A23503 /* DebugAppStoreLLC */, D0208AE22306E85800A23503 /* DebugHockeyapp */, - D0208AEC2306E87100A23503 /* HockeyappAlphaMac */, + D0208AEC2306E87100A23503 /* HockeyappMacAlpha */, D0208AE92306E86800A23503 /* DebugAppStore */, D0208AE32306E85800A23503 /* ReleaseAppStoreLLC */, D0208AEF2306E87700A23503 /* ReleaseAppStore */, @@ -1317,7 +1317,7 @@ buildConfigurations = ( D03E45902305CE840049C28B /* DebugAppStoreLLC */, D03E45952305CE9A0049C28B /* DebugHockeyapp */, - D0208AEA2306E87100A23503 /* HockeyappAlphaMac */, + D0208AEA2306E87100A23503 /* HockeyappMacAlpha */, D0208AE72306E86800A23503 /* DebugAppStore */, D03E45912305CE840049C28B /* ReleaseAppStoreLLC */, D0208AED2306E87700A23503 /* ReleaseAppStore */, @@ -1332,7 +1332,7 @@ buildConfigurations = ( D03E45932305CE840049C28B /* DebugAppStoreLLC */, D03E45962305CE9A0049C28B /* DebugHockeyapp */, - D0208AEB2306E87100A23503 /* HockeyappAlphaMac */, + D0208AEB2306E87100A23503 /* HockeyappMacAlpha */, D0208AE82306E86800A23503 /* DebugAppStore */, D03E45942305CE840049C28B /* ReleaseAppStoreLLC */, D0208AEE2306E87700A23503 /* ReleaseAppStore */, diff --git a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj index ae83a099c3..6ce127aa97 100644 --- a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj +++ b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj @@ -243,7 +243,7 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - D0208AA02306E7B400A23503 /* HockeyappAlphaMac */ = { + D0208AA02306E7B400A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -304,9 +304,9 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AA12306E7B400A23503 /* HockeyappAlphaMac */ = { + D0208AA12306E7B400A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -337,9 +337,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; - D0208AA22306E7B400A23503 /* HockeyappAlphaMac */ = { + D0208AA22306E7B400A23503 /* HockeyappMacAlpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -425,7 +425,7 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = HockeyappAlphaMac; + name = HockeyappMacAlpha; }; D0208AA32306E7CA00A23503 /* DebugAppStore */ = { isa = XCBuildConfiguration; @@ -1671,7 +1671,7 @@ buildConfigurations = ( D03E45412305C6E40049C28B /* DebugAppStoreLLC */, D03E45462305C7090049C28B /* DebugHockeyapp */, - D0208AA02306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA02306E7B400A23503 /* HockeyappMacAlpha */, D0208AA32306E7CA00A23503 /* DebugAppStore */, D03E45422305C6E40049C28B /* ReleaseAppStoreLLC */, D0208AA62306E7D400A23503 /* ReleaseAppStore */, @@ -1686,7 +1686,7 @@ buildConfigurations = ( D03E45442305C6E40049C28B /* DebugAppStoreLLC */, D03E45472305C7090049C28B /* DebugHockeyapp */, - D0208AA12306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA12306E7B400A23503 /* HockeyappMacAlpha */, D0208AA42306E7CA00A23503 /* DebugAppStore */, D03E45452305C6E40049C28B /* ReleaseAppStoreLLC */, D0208AA72306E7D400A23503 /* ReleaseAppStore */, @@ -1701,7 +1701,7 @@ buildConfigurations = ( D03E461B2306DF740049C28B /* DebugAppStoreLLC */, D03E461C2306DF740049C28B /* DebugHockeyapp */, - D0208AA22306E7B400A23503 /* HockeyappAlphaMac */, + D0208AA22306E7B400A23503 /* HockeyappMacAlpha */, D0208AA52306E7CA00A23503 /* DebugAppStore */, D03E461D2306DF740049C28B /* ReleaseAppStoreLLC */, D0208AA82306E7D400A23503 /* ReleaseAppStore */, From 7b8a1de82bc204879fcb2d4e8157c6d88a45264e Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 16 Aug 2019 22:36:50 +0300 Subject: [PATCH 08/86] - static library [skip ci] --- .../sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj index 6ce127aa97..9f8501a6de 100644 --- a/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj +++ b/submodules/sqlcipher/sqlcipher_Xcode.xcodeproj/project.pbxproj @@ -406,6 +406,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -590,6 +591,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -762,6 +764,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -933,6 +936,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1392,6 +1396,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1480,6 +1485,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1562,6 +1568,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1643,6 +1650,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; From d4060044488e9e6286f8275354eb6555bf217afa Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sun, 18 Aug 2019 23:19:55 +0300 Subject: [PATCH 09/86] Update reactions API --- .gitignore | 1 + .../MtProtoKit_Xcode.xcodeproj/project.pbxproj | 8 ++++---- .../AFNetworking/AFURLConnectionOperation.m | 2 -- submodules/TelegramApi/Sources/Api3.swift | 13 +++++-------- .../TelegramCore/MessageReactions.swift | 18 +++++++++--------- .../ReactionsMessageAttribute.swift | 18 +++++++++++------- .../TelegramUI/TelegramUI/ChatController.swift | 4 ++-- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 51c2c450ed..2294d1d1bc 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ AppBinary.xcworkspace/* Project.xcodeproj/* Watch/Watch.xcodeproj/* AppBundle.xcworkspace/* +tools/buck diff --git a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj index 60b6cfeae6..3927679786 100644 --- a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj +++ b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj @@ -461,10 +461,10 @@ D0CD98CB1D74BA9500F41187 /* MTTcpConnectionBehaviour.h in Headers */ = {isa = PBXBuildFile; fileRef = D063A39718B1650400C65116 /* MTTcpConnectionBehaviour.h */; }; D0CD98CC1D74BA9700F41187 /* MTTcpConnectionBehaviour.m in Sources */ = {isa = PBXBuildFile; fileRef = D063A39818B1650400C65116 /* MTTcpConnectionBehaviour.m */; }; D0CD98CD1D74BA9700F41187 /* MTTcpConnectionBehaviour.m in Sources */ = {isa = PBXBuildFile; fileRef = D063A39818B1650400C65116 /* MTTcpConnectionBehaviour.m */; }; - D0CD98DE1D74BAEA00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - D0CD98DF1D74BAEA00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - D0CD98E21D74BAEB00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - D0CD98E31D74BAEB00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + D0CD98DE1D74BAEA00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; }; + D0CD98DF1D74BAEA00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; }; + D0CD98E21D74BAEB00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; }; + D0CD98E31D74BAEB00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; }; D0CD98E41D74BAF400F41187 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F818AFF259007F1076 /* GCDAsyncSocket.m */; }; D0CD98E51D74BAF400F41187 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F818AFF259007F1076 /* GCDAsyncSocket.m */; }; D0CD98E81D75C0BB00F41187 /* MTMessageService.h in Headers */ = {isa = PBXBuildFile; fileRef = D063A35018B1631900C65116 /* MTMessageService.h */; settings = {ATTRIBUTES = (Public, ); }; }; diff --git a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m index 59d5fa4058..c7a03d6126 100644 --- a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m +++ b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m @@ -187,8 +187,6 @@ static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperat if (_outputStream) { [_outputStream close]; } - - [super dealloc]; } diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 2748d65e98..a5b0363284 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -3034,17 +3034,14 @@ public extension Api { }) } - public static func sendReaction(peer: Api.InputPeer, msgId: Int32, reaction: [String]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, reaction: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(666939980) + buffer.appendInt32(627641572) + serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) serializeInt32(msgId, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(reaction.count)) - for item in reaction { - serializeString(item, buffer: buffer, boxed: false) - } - return (FunctionDescription(name: "messages.sendReaction", parameters: [("peer", peer), ("msgId", msgId), ("reaction", reaction)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + if Int(flags) & Int(1 << 0) != 0 {serializeString(reaction!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.sendReaction", parameters: [("flags", flags), ("peer", peer), ("msgId", msgId), ("reaction", reaction)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) var result: Api.Updates? if let signature = reader.readInt32() { diff --git a/submodules/TelegramCore/TelegramCore/MessageReactions.swift b/submodules/TelegramCore/TelegramCore/MessageReactions.swift index b73ffb3e73..bb804ff08c 100644 --- a/submodules/TelegramCore/TelegramCore/MessageReactions.swift +++ b/submodules/TelegramCore/TelegramCore/MessageReactions.swift @@ -34,7 +34,7 @@ final class UpdateMessageReactionsAction: PendingMessageActionData { } } -public func updateMessageReactionsInteractively(postbox: Postbox, messageId: MessageId, reactions: [String]) -> Signal { +public func updateMessageReactionsInteractively(postbox: Postbox, messageId: MessageId, reaction: String?) -> Signal { return postbox.transaction { transaction -> Void in transaction.setPendingMessageAction(type: .updateReaction, id: messageId, action: UpdateMessageReactionsAction()) transaction.updateMessage(messageId, update: { currentMessage in @@ -49,7 +49,7 @@ public func updateMessageReactionsInteractively(postbox: Postbox, messageId: Mes break loop } } - attributes.append(PendingReactionsMessageAttribute(values: reactions)) + attributes.append(PendingReactionsMessageAttribute(value: reaction)) return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)) }) } @@ -61,25 +61,25 @@ private enum RequestUpdateMessageReactionError { } private func requestUpdateMessageReaction(postbox: Postbox, network: Network, stateManager: AccountStateManager, messageId: MessageId) -> Signal { - return postbox.transaction { transaction -> (Peer, [String])? in + return postbox.transaction { transaction -> (Peer, String?)? in guard let peer = transaction.getPeer(messageId.peerId) else { return nil } guard let message = transaction.getMessage(messageId) else { return nil } - var values: [String] = [] + var value: String? for attribute in message.attributes { if let attribute = attribute as? PendingReactionsMessageAttribute { - values = attribute.values + value = attribute.value break } } - return (peer, values) + return (peer, value) } |> introduceError(RequestUpdateMessageReactionError.self) - |> mapToSignal { peerAndValues in - guard let (peer, values) = peerAndValues else { + |> mapToSignal { peerAndValue in + guard let (peer, value) = peerAndValue else { return .fail(.generic) } guard let inputPeer = apiInputPeer(peer) else { @@ -88,7 +88,7 @@ private func requestUpdateMessageReaction(postbox: Postbox, network: Network, st if messageId.namespace != Namespaces.Message.Cloud { return .fail(.generic) } - return network.request(Api.functions.messages.sendReaction(peer: inputPeer, msgId: messageId.id, reaction: values)) + return network.request(Api.functions.messages.sendReaction(flags: value == nil ? 0 : 1, peer: inputPeer, msgId: messageId.id, reaction: value)) |> mapError { _ -> RequestUpdateMessageReactionError in return .generic } diff --git a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift index 83f97059b7..92cd9f78cd 100644 --- a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift +++ b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift @@ -90,7 +90,7 @@ public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsM if let pending = pending { var reactions = current?.reactions ?? [] - for value in pending.values { + if let value = pending.value { var found = false for i in 0 ..< reactions.count { if reactions[i].value == value { @@ -106,7 +106,7 @@ public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsM } } for i in (0 ..< reactions.count).reversed() { - if reactions[i].isSelected, !pending.values.contains(reactions[i].value) { + if reactions[i].isSelected, pending.value != reactions[i].value { if reactions[i].count == 1 { reactions.remove(at: i) } else { @@ -128,18 +128,22 @@ public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsM } public final class PendingReactionsMessageAttribute: MessageAttribute { - public let values: [String] + public let value: String? - init(values: [String]) { - self.values = values + init(value: String?) { + self.value = value } required public init(decoder: PostboxDecoder) { - self.values = decoder.decodeStringArrayForKey("v") + self.value = decoder.decodeOptionalStringForKey("v") } public func encode(_ encoder: PostboxEncoder) { - encoder.encodeStringArray(self.values, forKey: "v") + if let value = self.value { + encoder.encodeString(value, forKey: "v") + } else { + encoder.encodeNil(forKey: "v") + } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 81d1c74510..9d97d9bba8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -542,7 +542,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: updatedMessages[0].id, reactions: [emoji]).start() + let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: updatedMessages[0].id, reaction: emoji).start() })) } actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ @@ -1530,7 +1530,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, reactions: [reaction]).start() + let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, reaction: reaction).start() }, requestMessageUpdate: { [weak self] id in if let strongSelf = self { strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(id) From 3086bfad29de65cfc334bbf85fe52d7db030a779 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Mon, 19 Aug 2019 12:19:48 +0300 Subject: [PATCH 10/86] mtprotokit fixes --- .../MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj | 4 ++-- .../thirdparty/AFNetworking/AFURLConnectionOperation.m | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj index 60b6cfeae6..21ab23b5a9 100644 --- a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj +++ b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj @@ -461,8 +461,8 @@ D0CD98CB1D74BA9500F41187 /* MTTcpConnectionBehaviour.h in Headers */ = {isa = PBXBuildFile; fileRef = D063A39718B1650400C65116 /* MTTcpConnectionBehaviour.h */; }; D0CD98CC1D74BA9700F41187 /* MTTcpConnectionBehaviour.m in Sources */ = {isa = PBXBuildFile; fileRef = D063A39818B1650400C65116 /* MTTcpConnectionBehaviour.m */; }; D0CD98CD1D74BA9700F41187 /* MTTcpConnectionBehaviour.m in Sources */ = {isa = PBXBuildFile; fileRef = D063A39818B1650400C65116 /* MTTcpConnectionBehaviour.m */; }; - D0CD98DE1D74BAEA00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - D0CD98DF1D74BAEA00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + D0CD98DE1D74BAEA00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; }; + D0CD98DF1D74BAEA00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; }; D0CD98E21D74BAEB00F41187 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84EC18AFF259007F1076 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; D0CD98E31D74BAEB00F41187 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F518AFF259007F1076 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; D0CD98E41D74BAF400F41187 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = D05A84F818AFF259007F1076 /* GCDAsyncSocket.m */; }; diff --git a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m index 59d5fa4058..1f3a5635a1 100644 --- a/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m +++ b/submodules/MtProtoKit/thirdparty/AFNetworking/AFURLConnectionOperation.m @@ -188,7 +188,7 @@ static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperat [_outputStream close]; } - [super dealloc]; + //[super dealloc]; } From 0230fa9b279d6f2cf079e7fd48666850b4e2a49d Mon Sep 17 00:00:00 2001 From: Peter <> Date: Mon, 19 Aug 2019 23:27:00 +0300 Subject: [PATCH 11/86] Update reactions animation --- .../Sources/ReactionGestureItem.swift | 21 +--- .../Sources/ReactionSelectionNode.swift | 113 ++++++++++++------ .../ReactionSwipeGestureRecognizer.swift | 44 ++++++- .../ReactionReply.imageset/Contents.json | 22 ++++ .../ReplyReaction@2x.png | Bin 0 -> 9714 bytes .../ReplyReaction@3x.png | Bin 0 -> 15430 bytes .../ChatMessageBubbleItemNode.swift | 48 ++++++-- 7 files changed, 179 insertions(+), 69 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@3x.png diff --git a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift index a9ec62c03f..5a941f316c 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift @@ -2,22 +2,7 @@ import Foundation import Postbox import TelegramCore -public struct ReactionGestureItemValue { - public var value: String - public var text: String - public var file: TelegramMediaFile - - public init(value: String, text: String, file: TelegramMediaFile) { - self.value = value - self.text = text - self.file = file - } -} - -public final class ReactionGestureItem { - public let value: ReactionGestureItemValue - - public init(value: ReactionGestureItemValue) { - self.value = value - } +public enum ReactionGestureItem { + case reaction(value: String, text: String, file: TelegramMediaFile) + case reply } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift index 340530113c..1694dca4de 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -5,11 +5,7 @@ import Display import Postbox import TelegramCore -private let shadowBlur: CGFloat = 8.0 -private let minimizedReactionSize: CGFloat = 30.0 -private let maximizedReactionSize: CGFloat = 60.0 - -private func generateBubbleImage(foreground: UIColor, diameter: CGFloat) -> UIImage? { +private func generateBubbleImage(foreground: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? { return generateImage(CGSize(width: diameter + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) context.setFillColor(foreground.cgColor) @@ -17,7 +13,7 @@ private func generateBubbleImage(foreground: UIColor, diameter: CGFloat) -> UIIm })?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0)) } -private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat) -> UIImage? { +private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? { return generateImage(CGSize(width: diameter + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) context.setFillColor(UIColor.white.cgColor) @@ -34,11 +30,12 @@ private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat) -> UI private final class ReactionNode: ASDisplayNode { let reaction: ReactionGestureItem private let animationNode: AnimatedStickerNode + private let imageNode: ASImageNode var isMaximized: Bool? private let intrinsicSize: CGSize private let intrinsicOffset: CGPoint - init(account: Account, reaction: ReactionGestureItem) { + init(account: Account, reaction: ReactionGestureItem, maximizedReactionSize: CGFloat) { self.reaction = reaction self.animationNode = AnimatedStickerNode() @@ -47,18 +44,29 @@ private final class ReactionNode: ASDisplayNode { //self.animationNode.backgroundColor = .lightGray var intrinsicSize = CGSize(width: maximizedReactionSize + 18.0, height: maximizedReactionSize + 18.0) - switch reaction.value.value { - case "😳": - intrinsicSize.width += 8.0 - intrinsicSize.height += 8.0 - self.intrinsicOffset = CGPoint(x: 0.0, y: -4.0) - case "👍": - intrinsicSize.width += 20.0 - intrinsicSize.height += 20.0 - self.intrinsicOffset = CGPoint(x: 0.0, y: 4.0) - default: + + self.imageNode = ASImageNode() + switch reaction { + case let .reaction(value, _, file): + switch value { + case "😳": + intrinsicSize.width += 8.0 + intrinsicSize.height += 8.0 + self.intrinsicOffset = CGPoint(x: 0.0, y: -4.0) + case "👍": + intrinsicSize.width += 20.0 + intrinsicSize.height += 20.0 + self.intrinsicOffset = CGPoint(x: 0.0, y: 4.0) + default: + self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) + } + self.animationNode.visibility = true + self.animationNode.setup(account: account, resource: file.resource, width: Int(intrinsicSize.width) * 2, height: Int(intrinsicSize.height) * 2, mode: .direct) + case .reply: self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) + self.imageNode.image = UIImage(named: "Chat/Context Menu/ReactionReply", in: Bundle(for: ReactionNode.self), compatibleWith: nil) } + self.intrinsicSize = intrinsicSize super.init() @@ -66,15 +74,17 @@ private final class ReactionNode: ASDisplayNode { //self.backgroundColor = .green self.addSubnode(self.animationNode) - self.animationNode.visibility = true - self.animationNode.setup(account: account, resource: reaction.value.file.resource, width: Int(self.intrinsicSize.width) * 2, height: Int(self.intrinsicSize.height) * 2, mode: .direct) + self.addSubnode(self.imageNode) self.animationNode.updateLayout(size: self.intrinsicSize) self.animationNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicSize) + self.imageNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicSize) } func updateLayout(size: CGSize, scale: CGFloat, transition: ContainedViewLayoutTransition) { transition.updatePosition(node: self.animationNode, position: CGPoint(x: size.width / 2.0 + self.intrinsicOffset.x * scale, y: size.height / 2.0 + self.intrinsicOffset.y * scale), beginWithCurrentState: true) transition.updateTransformScale(node: self.animationNode, scale: scale, beginWithCurrentState: true) + transition.updatePosition(node: self.imageNode, position: CGPoint(x: size.width / 2.0 + self.intrinsicOffset.x * scale, y: size.height / 2.0 + self.intrinsicOffset.y * scale), beginWithCurrentState: true) + transition.updateTransformScale(node: self.imageNode, scale: scale, beginWithCurrentState: true) } func updateIsAnimating(_ isAnimating: Bool, animated: Bool) { @@ -87,43 +97,46 @@ private final class ReactionNode: ASDisplayNode { } final class ReactionSelectionNode: ASDisplayNode { + private let account: Account + private let reactions: [ReactionGestureItem] + private let backgroundNode: ASImageNode private let backgroundShadowNode: ASImageNode private let bubbleNodes: [(ASImageNode, ASImageNode)] - private let reactionNodes: [ReactionNode] + private var reactionNodes: [ReactionNode] = [] private var hasSelectedNode = false private let hapticFeedback = HapticFeedback() + private var shadowBlur: CGFloat = 8.0 + private var minimizedReactionSize: CGFloat = 30.0 + private var maximizedReactionSize: CGFloat = 60.0 + private var smallCircleSize: CGFloat = 8.0 + public init(account: Account, reactions: [ReactionGestureItem]) { + self.account = account + self.reactions = reactions + self.backgroundNode = ASImageNode() self.backgroundNode.displaysAsynchronously = false self.backgroundNode.displayWithoutProcessing = true - self.backgroundNode.image = generateBubbleImage(foreground: .white, diameter: 42.0) self.backgroundShadowNode = ASImageNode() self.backgroundShadowNode.displaysAsynchronously = false self.backgroundShadowNode.displayWithoutProcessing = true - self.backgroundShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: 42.0) self.bubbleNodes = (0 ..< 2).map { i -> (ASImageNode, ASImageNode) in let imageNode = ASImageNode() - imageNode.image = generateBubbleImage(foreground: .white, diameter: CGFloat(i + 1) * 8.0) imageNode.displaysAsynchronously = false imageNode.displayWithoutProcessing = true let shadowNode = ASImageNode() - shadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: CGFloat(i + 1) * 8.0) shadowNode.displaysAsynchronously = false shadowNode.displayWithoutProcessing = true return (imageNode, shadowNode) } - self.reactionNodes = reactions.map { reaction -> ReactionNode in - return ReactionNode(account: account, reaction: reaction) - } - super.init() self.bubbleNodes.forEach { _, shadow in @@ -134,18 +147,50 @@ final class ReactionSelectionNode: ASDisplayNode { self.addSubnode(foreground) } self.addSubnode(self.backgroundNode) - self.reactionNodes.forEach(self.addSubnode(_:)) } func updateLayout(constrainedSize: CGSize, startingPoint: CGPoint, offsetFromStart: CGFloat, isInitial: Bool) { - let backgroundHeight: CGFloat = 42.0 - let reactionSpacing: CGFloat = 6.0 + let initialAnchorX = startingPoint.x + + if isInitial && self.reactionNodes.isEmpty { + //let contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing + + //contentWidth = CGFloat(self.reactionNodes.count - 1) * X + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * 0.2 * X + // contentWidth - maximizedReactionSize = CGFloat(self.reactionNodes.count - 1) * X + CGFloat(self.reactionNodes.count + 1) * 0.2 * X + // (contentWidth - maximizedReactionSize) / (CGFloat(self.reactionNodes.count - 1) + CGFloat(self.reactionNodes.count + 1) * 0.2) = X + let availableContentWidth = max(100.0, initialAnchorX) + var minimizedReactionSize = (availableContentWidth - self.maximizedReactionSize) / (CGFloat(self.reactions.count - 1) + CGFloat(self.reactions.count + 1) * 0.2) + minimizedReactionSize = max(16.0, floor(minimizedReactionSize)) + minimizedReactionSize = min(30.0, minimizedReactionSize) + + self.minimizedReactionSize = minimizedReactionSize + self.shadowBlur = floor(minimizedReactionSize * 0.26) + self.smallCircleSize = 8.0 + + let backgroundHeight = floor(minimizedReactionSize * 1.4) + + self.backgroundNode.image = generateBubbleImage(foreground: .white, diameter: backgroundHeight, shadowBlur: self.shadowBlur) + self.backgroundShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: backgroundHeight, shadowBlur: self.shadowBlur) + for i in 0 ..< self.bubbleNodes.count { + self.bubbleNodes[i].0.image = generateBubbleImage(foreground: .white, diameter: CGFloat(i + 1) * self.smallCircleSize, shadowBlur: self.shadowBlur) + self.bubbleNodes[i].1.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: CGFloat(i + 1) * self.smallCircleSize, shadowBlur: self.shadowBlur) + } + + self.reactionNodes = self.reactions.map { reaction -> ReactionNode in + return ReactionNode(account: self.account, reaction: reaction, maximizedReactionSize: self.maximizedReactionSize) + } + self.reactionNodes.forEach(self.addSubnode(_:)) + } + + let backgroundHeight: CGFloat = floor(self.minimizedReactionSize * 1.4) + + let reactionSpacing: CGFloat = floor(self.minimizedReactionSize * 0.2) let minimizedReactionVerticalInset: CGFloat = floor((backgroundHeight - minimizedReactionSize) / 2.0) let contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing var backgroundFrame = CGRect(origin: CGPoint(x: -shadowBlur, y: -shadowBlur), size: CGSize(width: contentWidth + shadowBlur * 2.0, height: backgroundHeight + shadowBlur * 2.0)) - backgroundFrame = backgroundFrame.offsetBy(dx: startingPoint.x - contentWidth + backgroundHeight / 2.0 - 52.0, dy: startingPoint.y - backgroundHeight - 16.0) + backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - contentWidth + backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0) self.backgroundNode.frame = backgroundFrame self.backgroundShadowNode.frame = backgroundFrame @@ -201,11 +246,11 @@ final class ReactionSelectionNode: ASDisplayNode { reactionX += reactionSize + reactionSpacing } - let mainBubbleFrame = CGRect(origin: CGPoint(x: anchorX - 8.0 - shadowBlur, y: backgroundFrame.maxY - shadowBlur - 8.0 - shadowBlur), size: CGSize(width: 16.0 + shadowBlur * 2.0, height: 16.0 + shadowBlur * 2.0)) + let mainBubbleFrame = CGRect(origin: CGPoint(x: anchorX - self.smallCircleSize - shadowBlur, y: backgroundFrame.maxY - shadowBlur - self.smallCircleSize - shadowBlur), size: CGSize(width: self.smallCircleSize * 2.0 + shadowBlur * 2.0, height: self.smallCircleSize * 2.0 + shadowBlur * 2.0)) self.bubbleNodes[1].0.frame = mainBubbleFrame self.bubbleNodes[1].1.frame = mainBubbleFrame - let secondaryBubbleFrame = CGRect(origin: CGPoint(x: mainBubbleFrame.midX - 9.0 - (8.0 + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + 12.0 - (8.0 + shadowBlur * 2.0) / 2.0), size: CGSize(width: 8.0 + shadowBlur * 2.0, height: 8.0 + shadowBlur * 2.0)) + let secondaryBubbleFrame = CGRect(origin: CGPoint(x: mainBubbleFrame.midX - floor(self.smallCircleSize * 0.88) - (self.smallCircleSize + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + floor(self.smallCircleSize * 4.0 / 3.0) - (self.smallCircleSize + shadowBlur * 2.0) / 2.0), size: CGSize(width: self.smallCircleSize + shadowBlur * 2.0, height: self.smallCircleSize + shadowBlur * 2.0)) self.bubbleNodes[0].0.frame = secondaryBubbleFrame self.bubbleNodes[0].1.frame = secondaryBubbleFrame } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift index 61b67da170..d9a0cc59bf 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift @@ -6,13 +6,16 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { private var validatedGesture = false private var firstLocation: CGPoint = CGPoint() + private var currentLocation: CGPoint = CGPoint() private var currentReactions: [ReactionGestureItem] = [] private var isActivated = false private var isAwaitingCompletion = false private weak var currentContainer: ReactionSelectionParentNode? + private var activationTimer: Timer? public var availableReactions: (() -> [ReactionGestureItem])? public var getReactionContainer: (() -> ReactionSelectionParentNode?)? + public var began: (() -> Void)? public var updateOffset: ((CGFloat, Bool) -> Void)? public var completed: ((ReactionGestureItem?) -> Void)? public var displayReply: ((CGFloat) -> Void)? @@ -31,6 +34,8 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { self.currentReactions = [] self.isActivated = false self.isAwaitingCompletion = false + self.activationTimer?.invalidate() + self.activationTimer = nil } override public func touchesBegan(_ touches: Set, with event: UIEvent) { @@ -40,6 +45,7 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { self.currentReactions = availableReactions let touch = touches.first! self.firstLocation = touch.location(in: nil) + self.currentLocation = self.firstLocation } else { self.state = .failed } @@ -55,6 +61,7 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { guard let location = touches.first?.location(in: nil) else { return } + self.currentLocation = location var translation = CGPoint(x: location.x - self.firstLocation.x, y: location.y - self.firstLocation.y) @@ -72,8 +79,38 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { self.validatedGesture = true self.firstLocation = location translation = CGPoint() + self.began?() self.updateOffset?(0.0, false) updatedOffset = true + + self.activationTimer?.invalidate() + final class TimerTarget: NSObject { + let f: () -> Void + + init(_ f: @escaping () -> Void) { + self.f = f + } + + @objc func event() { + self.f() + } + } + let activationTimer = Timer(timeInterval: 0.3, target: TimerTarget { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.activationTimer = nil + if strongSelf.validatedGesture { + let location = strongSelf.currentLocation + if !strongSelf.currentReactions.isEmpty, let reactionContainer = strongSelf.getReactionContainer?() { + strongSelf.currentContainer = reactionContainer + let reactionContainerLocation = reactionContainer.view.convert(location, from: nil) + reactionContainer.displayReactions(strongSelf.currentReactions, at: reactionContainerLocation) + } + } + }, selector: #selector(TimerTarget.event), userInfo: nil, repeats: false) + self.activationTimer = activationTimer + RunLoop.main.add(activationTimer, forMode: .common) } } @@ -85,11 +122,6 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { if absTranslationX > 40.0 { self.isActivated = true self.displayReply?(-min(0.0, translation.x)) - if !self.currentReactions.isEmpty, let reactionContainer = self.getReactionContainer?() { - self.currentContainer = reactionContainer - let reactionContainerLocation = reactionContainer.view.convert(location, from: nil) - reactionContainer.displayReactions(self.currentReactions, at: reactionContainerLocation) - } } } else { if let reactionContainer = self.currentContainer { @@ -111,8 +143,8 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { if self.validatedGesture { let translation = CGPoint(x: location.x - self.firstLocation.x, y: location.y - self.firstLocation.y) if let reaction = self.currentContainer?.selectedReaction() { - self.completed?(reaction) self.isAwaitingCompletion = true + self.completed?(reaction) } else { if translation.x < -40.0 { self.currentContainer?.dismissReactions(into: nil, hideTarget: false) diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json new file mode 100644 index 0000000000..41e8c1ebb6 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ReplyReaction@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ReplyReaction@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6578625abe9d2ed7fae04517643d19f26d4e072a GIT binary patch literal 9714 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/ReactionReply.imageset/ReplyReaction@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d149f552b9a09e10fd2132151b70e4adb6ed6dfc GIT binary patch literal 15430 zcmb7rRajh2uq_@mxLc6mGJ`uog1Zx(fx$hvI|L8z3GVK$gAMK;Ah^53&42FwzVmz^ zdiQ>+?&^}gYxSx~6(wm5R1#De7#Iv$8A-K&GvvR4jP&mrnfY$;Z$hvTQxt=Nsf|N> zF+qfZ5qy=E6w~m4J&|8Q`0DOG@o3IKrG2m#|=h7{vk$-(bxedL3=&gpD6U{Dut5N zy73o51DVRSb6IOyDHjUV2}{~aCC{`FgWZ9tdx|y_&P9;53&ue7v}tIL@AwWqZT1Z_ z;s85Ne6F6>QId0MN0$yuadKHe=b$tKtuo)?_qsHN&vCTLUTSHFuqHL$W0Bj7{@?qR zPd>^JZK9S2rUAv7hP!-M+H=;^#-N?tztyVQ@yGTFe|&y?a?gN0Q47hY&r%TJPL-oS zchNYcBtVrg^0=waabaN5^zm;+GKJ_=MYa7_-?$xk&=K$~Oq4NHWy3e>&|!#c%)~Y; zDfr3Z7c|OI_4Bt@CgYYF=SZm;)9Y)9dY5^b&f83)zw41%CMAc;@?f-TF~71`d!iBN z)toB_ODou^w#DGrilcC$n(SvIyX27qO`b$Gj=!oLb56uCbXdA#eX_~a7JU7*ThTuO z(yjUgbWZxo1nOXf|vDt%re{K3{?#k`sfKRY4 zy3hCWuSjpc@J1IM_h)VTUcsBX3`vHx&Ozv_{V0x@yBti32BtyZzoo$RD3e*2H_w%i;^p>=KkmTNREBw}8&QZ22K^lQV~NK{w7u z1~LV27YWD89)Joqq({GMZmY$kj14iaf?Rza9U&1Fa6HNAK9d38j+LN$g-!1PuJKyu=g_+{JmSpc=XB6{g>@TOZHeR__e%5430V2}?_wn)Zkfynpw z+f~u|JMkOiF!*tzylL4i_tS|@*5s^BRy?_U*JC4VV>1~qq(ky}Vp~MjbuNPrz6|A( zdn18@g}BdO?H%W~O6xMx+~%+!vAgzb^D=TU$q2tPvG%iu>8j5}L7|a9N9o5D=(w}x zK8v`$-_rXlaM_5|QVZ7=(_pZGgw7XpJVKF2n4LS(|U=PR_V&ftR7&Y1D^r{OB zdBwjTms#<%mD)1zTiP-!Zk1Ue+LJwIUuK20J>jP_so2pfjVI5CzfD%G2<2#0`}j$b zXFJVJz<<8I$oXkmmf?-~7*Ud+$Z5|G*FQ(2dao3L`uKzLeYf;o>)fx~h?Eb)_vYKa z=)i#IkeSPFs1T<*`vtCtdq%K=oKovh!<$(ASG8G_?$xe#di(HjYl#HDDJqG+!KX0k ztd{UX8gs<(fa$^f7n<>7!;-nX7`eT#OxUArvl^z9nXYrv_UY>9kB=1sR%2JsWLYfb zqR*oh8TkC|x=bm?@w%=GUf9hlT2g&bC6U~&YezcY$I*cc;=>5(GOS4MZPqjZ>XX`Q`PT0ptfMLB7t=X254Lv44irZ+uFF3jBItaPa|x2LU^qT+b# zz7@IR~Zh1$&dfq|x#H&KCgWdZYb0s6hQ;bX(j>z7t882EEq)v;?N9aq+XK zIh`O)q8B4KZK4-P>*?FKu~x%U(r&jIy22(q73)Nz$`heqbG($Mb;@BHp+SO=^b2&X zsmpi%HRah5w0Ew>yQ@^`Q?cn;Dx>kow1FZG4qY71M0b&g z!$gO=^V=s+BcPP|LBnxVYv{JkSNUy5LD2g+DFm;-SPF&8OJ@%N33IXLOI0zL+Ti&% z5DOtZt;jHNoSQod%1CZSXYnNc9H#lr*%l`VKUzVSCU-0cePW5fk((*E*p%wAEieFNnr_xi2x&$m*x8eoy-9^;Mq-%k zOBJ}O-{T9J1{!rq)B)8B%c0ob{_*(b;{s0o{xhc10tqAC&sYVIx2j?C_kLa{%(aVv z$`7MEj6rE(M(k1cRkgd3wFy**j8f%byc|gpdcX|Hp>EhURFq}%%d=!0JNrD$rcWBk zt*anbRv8N%W1~ez#~LnKDaZ{%*{fPhXcbdfspj6fS8K5#-dVG8+n__UWxLf#@wwt1 znLI4NN&IrEGYG%ZeQWokSTVnA^t^5RHsH z|AZy7qsg_a-Fw9XQ@E7fNAfaK(~^H;wHhB6aaSQ$cnUK_8w*os6!}Qa)i|+ZYiK5% z9d3XOD|{>@gF^!-l55u1-7nIjBRa2su)MWNb7>LYWCaYDf{j>2rH*#@jG! zSv*Xw&kE|jM;Ik00Z0l!fexF+ZSh{vIW4Z_5x?HTkJK2;G8!l^#QY#B*-+fS6f zMkPXhmHW#%6-VnZS!_nqZ+x_zym$p@nZ-RNz61RR@x3iuy}#F8L84bE{|X39QYZzt z4e-e;u1SX@Ew+z(3DH{SOYv==ONY@)4{Io|Qeuk8V@@tWjP z*a%M5@rrtiX9XVR%xCg`;$zrD@$Bq>A=TxdS;4Oa@i@KOg%+k_Qrg*JmiHhmATarTn1904>uO%gsstVwgTG)Ye9a>bx1+A zI?QV)V}wirNhxx(3}BkGlkS_CBl`s%bL?<>mg4m$g}#5L`P%OxtuRJe0zXxqbCWY2 zPB(9ZuYLnGBpq&0G-co>A_9;7*=BdI9%g?+8X#Us7*Gy`bI2nEZWb=8_*t! z9ki#JyqRt8JJ~qoL8p*ZswkooB)FkZ?g_Kdiu`x#?_5QDxb$wto4>+B?y}$((8U77 zbD2@3ne-!pzy=7wGmsfRf>+T2N=R^%*X_18qe=k8QDko0vVc*$Gmc)58_4aDr;ALk z$&BHn1Mn4%ky%_NHV*hef9^-zocf*T0RFXJQkj>Dx}|MDw?XgoUv78k?0z)D*^x;a zBUGdzr1T_tR^o2Oav)K_Ifa1Bkn)kBJcTh< z#{f7^V`PZn;a|KvEG;IfX>6aV!g80Mhqzj}1GuYr z`m(Vcj!dGm9Y;W3LIYz@wFzq}O15HC2^7Jvj0#0lU1q@_Pltw@bA1{AT-X3tQMIG8;8 zFQNm`oue<+Hf_-fERlW@>{u&m89U`j0-#cY|KWj+)#uq$5KXfbZ{CReFX$wUKiPuG zSkm7jk4>t6>e;-njuP1-Se<(|GfJX`S`*N44wH*xr0Mr=tR$*8W(srEGrP`zJI0W) z&M?9(?SV@}roIybqCf+MufLUVHE|%d=Vu_A($g#tOm%4BLg=I>?dz({jL?`)n_QX)Mx=wAZY1h#w zLtfNPWCMONtEXKGw%g+9Y^wBI-~GwmImN}864GjN)$@4AVcvWr!$#KKf>T#fSh}03 z6?T`JLeY`|Sa0JgcE9|^e^PDP97M8WJ_YkQY?Vi{>nb9fw3*&C`Uxw^vICiO`nXN7 zU%VZN)I?okxmqeBCn6`yQ{^90+0c0+rw+CI6Pgx-_|DOIzE6HTf9)k8;v9ke@~obA z)FawiJI?VsHmz-GdUEunag)Z#OYo^`n@B|^LJrgmld^pkWOfcMYNSEA{cS{{ChDZm zireup*QC+yr?E-d8vsUH2nbI269mslb}pu*IQ=M8PQx^#JpIKQJgvPG zE|b{QHn;!kA(|QaXAPmBQ=Jw{cfnmhMAr@Ac9l}_G*yjW?wZf4?I5bHIBU)e++wp>$Wo)1u0h&Ur~_JU zM3LB+?oPD0-SeZNMGa|F?%fgeF8oa15T{1%J(Rx-nrC@pR3Y#^9{8JOA^(RnPPt69 zMLgx?qvl3!?nbfpC@S4|_MV`^3quKjg$8dLLS|)$vV3#`GodJTd!R-X7e^ANet@I{ z&=y(aRVbtne;50Z5xRVQt*lhK>DS3;hb27(Y}A6Mic(T8e|NLm&>T9lxvYI80o1~R zdz7%2m+EVYlbSX>CV(4B+(_pZPWV(!Ej*d^KvIW3T)s3qZKj3ST0 zR;$|$BP{hWKcC+@CG#udD#?3*)l+Wh<YBIMGjVSMeF;mjZu>7`>w@xj;_x0`p)&9b}P}nOVNZ0&R<9 z^xk+*4##5!4^;C!Ena&e&bdDwulW`100**(lH-gs{Fwhkm??-Sv%}^oIja6h+eqt_ z>vs2HsfYxIMv5Mbk9sSC2dS4q$F7J^5eUghD6V2o9i4AjYOHyhh~wahvQm0T-;wU- z>ikY#??iXbCI1P@@b*Vm+s)_Roee{;a6i_lNPGZ7$_p}j29K68Ud7WOW}6|RyGlWZ zxA}hOUgI>@Z$SrO48I%K_2FQR9nZwleTMe_++_CtJJrG9{lOx~vQBNSS+_O@0c*v| zy(t9K$f^zBa57WD)}@!Uw=kH{)K z!qt0S&rK89d?S09(&qP7<1jcO|A9`2IP|&K*6=4EW;;K}GN7x zUR$NT$MRluO4gXQ=%GL!PQ7ti3r5(YS@E^*{<@bOrr7ufvG*HJCb=pu=Qz>5C|{ z7#YVd>-N(JdnXUferF(_w{TM)zauUG-wuOg!haCseWiu_9RT=TWX(V;5RaTI_W)6G z=kan3N3Z6sPpCbAiC({V7JsveHBla3Ri;x0kn|kcw}MTGgd;a>6poSY+nv)J>x=Iz&qVE zkbw1?_)x~LUy}U2QY0x;Pivq|d8uGmJt=TEhpBUR%8oVQE3BZg%wlXLYrWt1e@UGa z$*R{roG4#|CAXRqI!)jV_2&A;PduBb5V*|umV^GTWI>UucHYghSx-=xmjB1iLe(F= za3=ksk5pa+tslLL1tBa&-=*~&1)^|GhU?G6V|S9_bR0@EMr2`h{eTi`TH5xsrkS~X z1h<2-+|bN<)OdHrOL}fl1Sng?4XJ$;pukQ{4&L6ysw9EL221gT*+!?Ik3qQhYH&}2 zOgNQPmZCNS(q!ph<#g?p9QJ;;w|d?x7#WDH7#OhM5~al`536a+ir*Dl6wG@Y&ikS* zv%f83>khDU>&52;bnspQHYa_r}5QmOYu7RLe6#yY+exRd*|0wCHsd8iP_jNJ#-g^cbR zBPIqr`t!@rgJ&ZrK|s=>yOA69xe<;uPZ~;NE)rL#L|gG>~IerWL&9_Khina4E&~) zGt%4*tbL~U_sTW?cV12R1JZSqu_@PIfhyCLk8z1ZG z+mAdI4-aM8^=lnf-}|jR=|PlWg*G-nrp(4)(?`5;^60$WfsJ(=W)epF0xLv~K-;hP zSyEth;Ff_y5!CF3dH#e|2IL+H7FkCI@qGNm1xzzOxT%M?q{>Wbjdf`%Uf(2Tclw7h zv6NJAYCD?ay}q5LAk?Xjm9zj!u!#$DhaosRpkbXj+vpXds#GbXD6T(3|6%{3p(CJ` zOW3e)t8w?aGGvMKJ}bfenBPWTTY;p!YJMt@N+hZ2mvhmiPSps-St2Nl4-q6fTZlxVa)XpE4vq(4>8h`^r)TAp1oq_@@ zpX`R$AU|WcpRo-q^3vhPw(uf>8l$bl&`|eyG~ z_xf__wNR~ZVxi5rX&@>Y%(YXb8_%4W&!jePbtDzvbeeXKuVtbWSOnRpQ216{@b-lJ zis;1+9^JB(a#q1REPw&q7f*Ugf>Ht94*W@Pu3Sg+inuOS9(4ToHY~YF*;=@R4|@Qh zx#_qs_Hk~^d_lg@0;$%`krgc@UT#%Qkt*<$9a3Msu44jXyR@2$sKZX}vWFdK7Io2$ z|J9z!t&bDl2a_sp#v)`6XG*zUqU{9L* zsT<@DL9IEY%?rGfITYL(vubV>vwuTDiM3i|)FzX)C5w2F6U?7$_?c9lXAkPU*jx5t z46M&d76}|6TG@%`Dfx6K?5$ua(qU&}HBRENL;AA{?QLn*!-I7e41iR36TItW@OLc0 zZnb`A4~tX6zwH#3(>SB7K$=nn6fBuepojDv361$#xhLuUjZXzOUb|2kGboB=Aa1{2MjIN z|0g0oVYF@)QP#j>O>4Zq=+nGlHX48}jA;Y%JZamZ_O$Vc>GCIvuuraeG4%2ibXljd z_C))5ny8=A`vfVdjjf%tcJdWDXZ2nMz{&r;kiSujXF4m3u_TgMS}|()cWP>t#`;oP9nd0mY@j02TrkIzA`%Ei zfQ9Nt5@^XOgD+*P7kgF`3fhr!mb;f*J#{Io@kW_y|7b&y8kwI-Ow#K48O5z=fMGJP z^RRT*9iQrk@=VM>jxry0zOONM$*16}t0oR!QZMxA(ihB)P0F?(51UI6@Z#UbxRU^D zofmyVdZ@P(^S;*qXNHNv|J_7^bfr>o8;4H7C$P2(F4Q`OUG1TU2z&GHHI1KIQ!6oH zf^|1A{qt=?J@X}{M6^pBrMB088Q2?2=lFs+3<%ARJ_3L6fgLH?A0aqzaEQaGUO;O z9%piW;+)db!8PIy-iV~wb3*oV!~E@%hK~`+*HbdXi7U5$!#bViA!pD@{^45*?2Cil zPj0fP&_9O#J|SSN6#$F?_-9Ye{{*KgY5D&RP8?8)v+S>Cg}eTg^C=0BD009NN8&t2 zB5n{l46iq$AjjoL1=MSz*A+3{-+nvINe3IJOP8L^++V5#$EeI=q#}6=Sgq9ASL#Xn4FJPZfA~OOiOcbj{1!+j#9I}i$qsSzp{a# zizz$=1xkg7tBPKp!(XTW#y9s3;}7@c{-nIO!Yk=`ZE_P25OG1Fc+HL9y2jdMIktL| z=9Xx18yfc=E_P1@XU~wJB4I(CwZ^H2YI?2g$iBOb@l%a@wjm78!d!EfxKe~`U^{q z$|D;Pxuq!l8*O4gCr8*Wff6cRmd_E*v5SV#)BWaN=q7X=Ns!B>3twz2TdD{eqwJxp zFQuEMl&*oHgBprS!%6I^q#yGveAoAF_|GYa>f;iKcK*Qgz7{XdX*nJ5KPp^C5RZdmF^eeUX^=dxnm>@-L{ETQtoW z5gI@aF!MLItC;`0tJ|LA$fVN*n$M9ojUFLyRw$m0Jlcnyw7(mOOm8&0mm+?2p2gQ{ zg(@rsUNmUz^_K2F;xXM(7QDCLk9-ueO*Z$uOz$JwYbhE($CMhTfO=fm2@PS|NW$ii z86scWCo%+@)3iDOa6lL6x`NF0@M9VbGLgO|iOIXy!#!hAmtS4;asDy{J)NM*rMKZW3w}Hk zf_ljjL2RShO!#J0n94X8ul`mEb_u&dRzp{r#`O0eUi!S7oLC2Htz-rRZcv4c;kT3xk?c7!T2uKr6NPSwRC zYJCqa>0kG4slq0QvJ(j$?l?Dypk29|sPWB)Icgu#5*K%I9s83IQ3~}F+K|-aasEm~ z4c>Q7d0M%MGWO}_{egn{I3STb$L7|0?w8_|7#azBvshM}i$8{pxb-{GpWTl*g<--Q z4PN=sq#$Qb(f)HF|NF*Ha-H4Jdp=pBkWDuef{qUN;2dxLyyIxtrXVxY8mk!`x7Im7 z2*U*BTbZ0)2?s<7(}*UQjWVzN*c|d}33(eZ1cptvwLO}tm;a|0{+{vD410)N#^!x) zNfMD1|Gi}4#46kPT<`r-Q`hrOTaQUnM^}_${+9lU)&vbuiYEVXOO5|}Zn!D6OZv*) zCg||tlAET>uSlmsBt-MEE~D;T=dUa}Nqyl1>DY0f z_x@%RlPAAyMKVfo=Q@6T*)R6@^?UD}8DjGLjpxenRcbKugNTdS>eusJLlyy${x4<_ zxAum`m)N#waktto1}$~k!SCaYE;{5(-CGbnj}Wye1Y?|+C76WO+8 zq%45iZ#&T84OAyTq;`;A;fij=Q2ZS%)(UxKm_&=JH(_C%O#SV`$O860Q@3bhT7VKO zWb{|q3IH+OJ}VV$1a%a6(afq9eSYL&!OawX!VcOMAAU0KZeVuptXh6*_8zm%-hjs- z@$T;L@ctTE^XzC|yHIc=Bo@^M=zETnPHuZUmU|t8k3o4Av#T=~qSpRkj&n)z4;lB< zh#Fx63l0$#ru#N$BG!eHT~lneQe;ooj9KM8r&n^a9BRTbK+h#V5#NinkU_1U0k;mz*1rVtY=!S0#^!G-)hruA?4 zU390`Szh2{k57k$^{!#0!$d5P>omd08^t+P6w%k*>1~}`Mv_HdMUN}1ZB362F$Ld? zQQ$jIbo1lE^h}^W&V1zaE zu11SkacO>mE;PzD?4y#YeUcRU%g~^41{nMC-d~*bw7IGBW6O-D0X!^y^eau@HIKQnxul+b?988r;mlWgwY*5&B89#gm znUdUWj$1d52B0q!A>=0~e0TNA{db!!tj4^!%RX@}tF`nA+5>Ri*OAxbUe%Cgrw*y^?pcyaWf* z$m(5PS_EY_7UF&&p)L2@G84hi;)u$P#cGL!E%?b&8x@lo(?{5z=q^>5@-Sdt8*)ag zvTh};Z@z{Q`DjT0TB@!=tfHJI|0rJF`)pP3dXmOvRevjzd9pZoPiC+z!KKYdJv9)I zTA55~QZ|F)?2XpONeSm-?2wM5gqS(ctO?bs4nfH9Og@sxd0Y{s95Gin4Xl?`yUTYI ztvF{Tw;1TPjhFw*?4_JbT|w=VhRSc(H1YRaH?A->>W4)Bt}EX{icRhJ@fEwQVf7x= zG!$w=7o^Pq*&3^YQqzSN0wUWmAW^yIvWwGpEoO%D7Z_AGD{Ap1)~$5n8(p2u%1q%- zo2IwZACv_m-q{)3SAKwS3Z9_u)w4>`4?k^@6uFge3}KkXzs{;1MoN@wC?aPmBc|&gl5IcE{1?Z3hg-(4-~6_lQ1^62!y!AelXuO4etU{YYh5e1XB!BZJjSG#i=_VT{E>V%2k?W))M89rRD8 zu6MjqhUkUUwWoR=ZDoNd`(8{T;M|2};GssTuB+v*Mbkvn7{loU_8UE{RyVedu+BAX zFCO57-H2m(b}&qhiE-D}mmSe1I1t@3QIa=BbcR!ZU*$JHyMzw~Hxd(1jr0`wdIU~4 zYQMQn>1&)i+n1D$%J{3uN$(6`b#PlJ*=oorntAC|w<;|EW(Fp1M*WJ=$;>py>xD|&iUOd~vp+90d zGlFOzM9oFAgThbec|Pxzi+Pu%Ki=vs@#q!5^kL4=TYO79ZNAUz2p?$r;U1`>S|3zH zjzG{Oi51A0$QWS*QfBk4Ax<*t^seLx+sANwT^|!o9xpP(Yg723DEcy%TK@Z|#=tL> z?fKNi0K2BDbJ#MskHX)()&-~?Y931EDr1FHIGhpBegTsP>Vb%RJ%)`e$pIfS7doeA zwTOc~r;kp?PEIN^mc2KtBb$+5fliA)lxUA|zkYI#hf2t=TVU7Nf!MxG{;XFX65~I2 zUxydY%h_e;bhJw7`I6>Ez>@BV&_j|2?~N2FTeHm77(D63RzJS?<=&5bTt_SnkL3^qw4_>ZmZZ$3{i@)RStCb6&%ugQ+%2 z?Rf6F7cX6!I4R&RdT}^w@a2{1X9<$F4OC9S2dV0ox9^7J~f~S-hS`9edKZP6j7J#Bw5RVlZZbrog>%lj8E~#W}B?{Ai02z;$5n~cmdM7Ba z^4nt8OScm{O%yfP$Y^&hodJt7$`cRs<<7!T6cAQVAuff=5H-lhTjwE5Kq=)n1u%TB-wcq|3P&;`9~}X zF~R*RY={+by=oJQ8&-BlPgn;YJ*scPLH$I+6u9M7)mw16wz27Rbk`iwJwPHrtsT^! zn?c)4xUvqq;3DehB5;(i*>Nzub8pqyGFne8^jGI};ogzH?)u0{DnR;2;OkIST&Dqi zgUJ$<#{uR#03)&IBN0b6YiKV?nhmpS5Rl>1PA5s}(IvaS^FJQ)O-60l%@?9a8= zP(dD&m2AbN&Bqh-l~^8hnt#=*!aowjP)8FU5@=)Cm73e7R6SZOFqM#vH95L=tCzgF zi!NP()!myzX@&myOMivqNKmcSnhT32n35cT9!VLY^c+jj1ottt$;W*bm2$59LG4io+~ z`&b(CIZeMOXB6LBAxY17AExbZ24*N>%1v|}sj_EYFMDWgchg@k>2C1m@$<8N8rzI6 zJ_^SZmf097d=+v#o@Y;OY^O*xVLBrQ@-_|S`t9bM(3y_ucOM-NyM`&vd1@5>`iDVf zGFo~AuzK)}iAO-)`W^Iqv0rg)$2^7{3k@gD#W_z%SL;+N)1oSfDZlW!@3 zu2o1n`do}T#(i2Fhd4dxH+U4MiE9PL0gTb>ao=%#Pk!kCri9e4M)z{U?_z{$PWrAI zyqk@Y4U-I$4O6IEnMM3ghQ>%@ZRhV15B0w)57x`$U4Jw%8pavMYl2{>Z`WqBdl`ID zp5|^9PfgyD10YS_CiAwS%+G55E?j9aQHUAQm(~ymP?D09=oH(l9{)DDbPNmIEM|af z@}o=isY(z3oD^=E`~9kF1pg_JO#27W<1YSX0sA7qe)F=2lC|u2^O#0+aTbj4&XejE z?xcCQ?bUjC~7>Q=) zzj8I}@3vjU$=2yxt5TJYCbrk(`919(ThJXmW)g35_;s72Kuz!l^~Cdo1lLhKoC5_P z+n1sml-bMRIG^3d=kD7~<<oziTCiiI{>tmqspD{Mq&jTtFD2mplgV-j=ZBb;vK4+W`!PR|xsmMcj%gO}zZ zhpvZH*bMr0GDke;uMcyrO4GkV)c~YwY2Ae}%oxp2*>6SXFV3cBtMsFv&!>J!+DHP7 zn(eu!$V-g&WEuOWR2DQ*#zdz5rjd>Wso!LL{|LRD?1fdCZ-}LNlvd$>d)_W zJuNIo{*udUXlF4p=&%FB*pw|N#Re)LrBW6yH<;EPwyxxAq#(e{$fNR#lM;#Y?fjdFI?{6QxZyEzYlQ(#6(VY;Y zq$rNxrKm~#5eFYDH?Gce4Oq+#cMrZQujx>SX=X~^4L7xLdMhpXqL0MAJZTb$xf!=` z(nAB7=d>(U?|4NR>Ou}(_4mU$xn4xJw(0t&BF%>JEPr|B761C8!pQRix={Dxzi)cEoTBNE6T zo8}v}`w}h1$f=^<_o9~Z0SRMr3rm3?zWPq5i3Xp1H^!pHh$Z&hODK0~!1e&|4pW=I=??XbxuRiBR zRr`vX#B=9+HoB1^m2OdTmWTBtpO^k)k7HfYL9wUNDp%DCj5N}*>vE_IHidatMtnvvfGH$&ZQB{eLIJi`VHS)8$61lgN(-( zWqxt?do<7mwa!@$KM=fVm7&7^>H*ajBY`OF5XNqo^c|{!`=RAX) z{n*rACAZ7#|7C$X?zs@O{-JaDz*0#+h(|>AAk~50NLqqhxbx55$2$R(`ZZg&Ns$%I zO`mDSz1s*A0%9u5=Ni2M{WhY?O(F?x#eNCq?2DUbpJR;l1Y8jYIP3A3@YsHAnnBgW zuK?c2wuS|T%`p?Ap4)rcPKlU=Tunz+7BVL2$=kvIRDqRxs!Gq`1G8?0ZVsgL>5HjR zpU2tim#6Z&r$cI`0(gHy_YWu%?bCa2cmX zp`+xR)p2YM{mq5im~o6$r6(9~s4@({ghKTIk=i;et+5kARcyzdCo_%zV5JGVtPccq zxi1=Moxy%^od_wl;9p`|Yd}Molz% z?a{fBJd?GCq+gCIc*<#g)JhxFTx2V?Heu3swP}QtpwwsxAmwJobxqEP>J9rK;(D;* z4ny7Idu&r>bEBM>Mv8DJ@%Ax&{r1VbT|oi3aM`pc5iGqS2FjC)A)O(fo7OnjTAN`e zs9{>rjAjK;u@TViC91lUg}d&yF;-5vTje|LCQN!kBt3O~&nFf0iM&V!xJ2524S~Q! zl|srC@ZEaX{`2A{PvZ_jnBeIrt>pymeR`c0)s+ZObZXFnw)Cdl`Si?%oJCRG@xLFd zCsuZkRrbPbQomj&wSBxF=DHFyhEmg$)^Er(wEMV`Gr@z8{YLBW!I|%V+kunDGwVvG zOOou<8DC8W<>w$BNa?^5x{bI&<(p5#RCdKXepmOooPIOqeoUNPeqD(pxm2TdxaJ4- zRXX1#Z5FJ;WdAil=Fy_Urt>iiXEQ)W)zUIM9Gn-)H#eTwMg5vi+4V+L1dkvZ9S)(# zHEqP-A%IOIP8n_R*+SM+RDWjfdn}6Hb3!qGT;TsGHj*se4qMT>0KJIqfwe2 zF1UxGywD!&mk9!qspj3ss}1gkZzSD&gA!~i?8wIeX*_kgUa(Hi|3pIHh*xONkNbwiXi}6ChEViEzZQQd3YY zPH{#2N23Vh{%-rc4Kd?z{sY5^rWvJ;mR2QtM3V0Z zRu4|uMx8bKZWf7;Z8Uh-_5E2kQh#K!(pL20-zk6L3@0nDt1|p+42F^Ysw7z@ZXEP~ E0B3SAvj6}9 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 314bc7f4bc..6326abbc23 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -418,9 +418,6 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } } - if !item.controllerInteraction.canSetupReply(item.message) { - //return [] - } let reactions: [(String, String)] = [ ("😒", "Sad"), @@ -433,14 +430,23 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode var result: [ReactionGestureItem] = [] for (value, text) in reactions { if let file = item.associatedData.animatedEmojiStickers[value]?.file { - result.append(ReactionGestureItem(value: ReactionGestureItemValue(value: value, text: text, file: file))) + result.append(.reaction(value: value, text: text, file: file)) } } + if item.controllerInteraction.canSetupReply(item.message) { + result.append(.reply) + } return result } reactionRecognizer.getReactionContainer = { [weak self] in return self?.item?.controllerInteraction.reactionContainerNode() } + reactionRecognizer.began = { [weak self] in + guard let strongSelf = self, let item = strongSelf.item else { + return + } + item.controllerInteraction.cancelInteractiveKeyboardGestures() + } reactionRecognizer.updateOffset = { [weak self] offset, animated in guard let strongSelf = self else { return @@ -479,11 +485,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode guard let strongSelf = self, let item = strongSelf.item else { return } - if strongSelf.swipeToReplyNode == nil { - if strongSelf.swipeToReplyFeedback == nil { - strongSelf.swipeToReplyFeedback = HapticFeedback() - } - strongSelf.swipeToReplyFeedback?.tap() + if strongSelf.swipeToReplyFeedback == nil { + strongSelf.swipeToReplyFeedback = HapticFeedback() + } + strongSelf.swipeToReplyFeedback?.tap() + if strongSelf.swipeToReplyNode == nil, false { let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.shareButtonFillColor, wallpaper: item.presentationData.theme.wallpaper), strokeColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.shareButtonStrokeColor, wallpaper: item.presentationData.theme.wallpaper), foregroundColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.shareButtonForegroundColor, wallpaper: item.presentationData.theme.wallpaper)) strongSelf.swipeToReplyNode = swipeToReplyNode strongSelf.insertSubnode(swipeToReplyNode, belowSubnode: strongSelf.messageAccessibilityArea) @@ -497,8 +503,28 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode return } if let item = strongSelf.item, let reaction = reaction { - strongSelf.awaitingAppliedReaction = reaction.value.value - item.controllerInteraction.updateMessageReaction(item.message.id, reaction.value.value) + switch reaction { + case let .reaction(value, _, _): + strongSelf.awaitingAppliedReaction = value + item.controllerInteraction.updateMessageReaction(item.message.id, value) + case .reply: + strongSelf.reactionRecognizer?.complete(into: nil, hideTarget: false) + var bounds = strongSelf.bounds + let offset = bounds.origin.x + bounds.origin.x = 0.0 + strongSelf.bounds = bounds + if !offset.isZero { + strongSelf.layer.animateBoundsOriginXAdditive(from: offset, to: 0.0, duration: 0.2, timingFunction: kCAMediaTimingFunctionSpring) + } + if let swipeToReplyNode = strongSelf.swipeToReplyNode { + strongSelf.swipeToReplyNode = nil + swipeToReplyNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak swipeToReplyNode] _ in + swipeToReplyNode?.removeFromSupernode() + }) + swipeToReplyNode.layer.animateScale(from: 1.0, to: 0.2, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + } + item.controllerInteraction.setupReply(item.message.id) + } } else { strongSelf.reactionRecognizer?.complete(into: nil, hideTarget: false) var bounds = strongSelf.bounds From e85f81962362f104fa76e93768585c1d9ac6e39a Mon Sep 17 00:00:00 2001 From: overtake <> Date: Tue, 20 Aug 2019 19:05:30 +0300 Subject: [PATCH 12/86] - was scheduled flag for message. and local notifications either. [skip ci] --- submodules/Postbox/Postbox/Message.swift | 8 ++++++ .../AccountIntermediateState.swift | 10 +++++-- .../TelegramCore/AccountManager.swift | 1 + .../AccountStateManagementUtils.swift | 28 +++++++++++++++---- .../TelegramCore/AccountStateManager.swift | 9 ++++++ .../TelegramCore/StoreMessage_Telegram.swift | 11 ++++++++ .../WasScheduledMessageAttribute.swift | 17 +++++++++++ .../project.pbxproj | 6 ++++ 8 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift diff --git a/submodules/Postbox/Postbox/Message.swift b/submodules/Postbox/Postbox/Message.swift index d2f402bd53..e8aeba4e1a 100644 --- a/submodules/Postbox/Postbox/Message.swift +++ b/submodules/Postbox/Postbox/Message.swift @@ -370,6 +370,9 @@ public struct MessageFlags: OptionSet { if flags.contains(StoreMessageFlags.CanBeGroupedIntoFeed) { rawValue |= MessageFlags.CanBeGroupedIntoFeed.rawValue } + if flags.contains(StoreMessageFlags.WasScheduled) { + rawValue |= MessageFlags.WasScheduled.rawValue + } self.rawValue = rawValue } @@ -380,6 +383,7 @@ public struct MessageFlags: OptionSet { public static let TopIndexable = MessageFlags(rawValue: 16) public static let Sending = MessageFlags(rawValue: 32) public static let CanBeGroupedIntoFeed = MessageFlags(rawValue: 64) + public static let WasScheduled = MessageFlags(rawValue: 128) } @@ -564,6 +568,9 @@ public struct StoreMessageFlags: OptionSet { if flags.contains(.CanBeGroupedIntoFeed) { rawValue |= StoreMessageFlags.CanBeGroupedIntoFeed.rawValue } + if flags.contains(.WasScheduled) { + rawValue |= StoreMessageFlags.WasScheduled.rawValue + } self.rawValue = rawValue } @@ -574,6 +581,7 @@ public struct StoreMessageFlags: OptionSet { public static let TopIndexable = StoreMessageFlags(rawValue: 16) public static let Sending = StoreMessageFlags(rawValue: 32) public static let CanBeGroupedIntoFeed = StoreMessageFlags(rawValue: 64) + public static let WasScheduled = StoreMessageFlags(rawValue: 128) } public enum StoreMessageId { diff --git a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift index 447163567f..1856238d8e 100644 --- a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift +++ b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift @@ -498,6 +498,7 @@ struct AccountFinalState { struct AccountReplayedFinalState { let state: AccountFinalState let addedIncomingMessageIds: [MessageId] + let wasScheduledMessageIds: [MessageId] let addedSecretMessageIds: [MessageId] let updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]] let updatedWebpages: [MediaId: TelegramMediaWebpage] @@ -509,6 +510,7 @@ struct AccountReplayedFinalState { struct AccountFinalStateEvents { let addedIncomingMessageIds: [MessageId] + let wasScheduledMessageIds:[MessageId] let updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]] let updatedWebpages: [MediaId: TelegramMediaWebpage] let updatedCalls: [Api.PhoneCall] @@ -521,11 +523,12 @@ struct AccountFinalStateEvents { let externallyUpdatedPeerId: Set var isEmpty: Bool { - return self.addedIncomingMessageIds.isEmpty && self.updatedTypingActivities.isEmpty && self.updatedWebpages.isEmpty && self.updatedCalls.isEmpty && self.updatedPeersNearby?.isEmpty ?? true && self.isContactUpdates.isEmpty && self.displayAlerts.isEmpty && delayNotificatonsUntil == nil && self.updatedMaxMessageId == nil && self.updatedQts == nil && self.externallyUpdatedPeerId.isEmpty + return self.addedIncomingMessageIds.isEmpty && self.wasScheduledMessageIds.isEmpty && self.updatedTypingActivities.isEmpty && self.updatedWebpages.isEmpty && self.updatedCalls.isEmpty && self.updatedPeersNearby?.isEmpty ?? true && self.isContactUpdates.isEmpty && self.displayAlerts.isEmpty && delayNotificatonsUntil == nil && self.updatedMaxMessageId == nil && self.updatedQts == nil && self.externallyUpdatedPeerId.isEmpty } - init(addedIncomingMessageIds: [MessageId] = [], updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set = Set()) { + init(addedIncomingMessageIds: [MessageId] = [], wasScheduledMessageIds: [MessageId] = [], updatedTypingActivities: [PeerId: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set = Set()) { self.addedIncomingMessageIds = addedIncomingMessageIds + self.wasScheduledMessageIds = wasScheduledMessageIds self.updatedTypingActivities = updatedTypingActivities self.updatedWebpages = updatedWebpages self.updatedCalls = updatedCalls @@ -540,6 +543,7 @@ struct AccountFinalStateEvents { init(state: AccountReplayedFinalState) { self.addedIncomingMessageIds = state.addedIncomingMessageIds + self.wasScheduledMessageIds = state.wasScheduledMessageIds self.updatedTypingActivities = state.updatedTypingActivities self.updatedWebpages = state.updatedWebpages self.updatedCalls = state.updatedCalls @@ -574,6 +578,6 @@ struct AccountFinalStateEvents { let externallyUpdatedPeerId = self.externallyUpdatedPeerId.union(other.externallyUpdatedPeerId) - return AccountFinalStateEvents(addedIncomingMessageIds: self.addedIncomingMessageIds + other.addedIncomingMessageIds, updatedTypingActivities: self.updatedTypingActivities, updatedWebpages: self.updatedWebpages, updatedCalls: self.updatedCalls + other.updatedCalls, isContactUpdates: self.isContactUpdates + other.isContactUpdates, displayAlerts: self.displayAlerts + other.displayAlerts, delayNotificatonsUntil: delayNotificatonsUntil, updatedMaxMessageId: updatedMaxMessageId, updatedQts: updatedQts, externallyUpdatedPeerId: externallyUpdatedPeerId) + return AccountFinalStateEvents(addedIncomingMessageIds: self.addedIncomingMessageIds + other.addedIncomingMessageIds, wasScheduledMessageIds: self.wasScheduledMessageIds + other.wasScheduledMessageIds, updatedTypingActivities: self.updatedTypingActivities, updatedWebpages: self.updatedWebpages, updatedCalls: self.updatedCalls + other.updatedCalls, isContactUpdates: self.isContactUpdates + other.isContactUpdates, displayAlerts: self.displayAlerts + other.displayAlerts, delayNotificatonsUntil: delayNotificatonsUntil, updatedMaxMessageId: updatedMaxMessageId, updatedQts: updatedQts, externallyUpdatedPeerId: externallyUpdatedPeerId) } } diff --git a/submodules/TelegramCore/TelegramCore/AccountManager.swift b/submodules/TelegramCore/TelegramCore/AccountManager.swift index 4e7f876d51..e7053b31fe 100644 --- a/submodules/TelegramCore/TelegramCore/AccountManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountManager.swift @@ -149,6 +149,7 @@ private var declaredEncodables: Void = { declareEncodable(CloudStickerPackThumbnailMediaResource.self, f: { CloudStickerPackThumbnailMediaResource(decoder: $0) }) declareEncodable(AccountBackupDataAttribute.self, f: { AccountBackupDataAttribute(decoder: $0) }) declareEncodable(ContentRequiresValidationMessageAttribute.self, f: { ContentRequiresValidationMessageAttribute(decoder: $0) }) + declareEncodable(WasScheduledMessageAttribute.self, f: { WasScheduledMessageAttribute(decoder: $0) }) declareEncodable(OutgoingScheduleInfoMessageAttribute.self, f: { OutgoingScheduleInfoMessageAttribute(decoder: $0) }) declareEncodable(UpdateMessageReactionsAction.self, f: { UpdateMessageReactionsAction(decoder: $0) }) declareEncodable(RestrictedContentMessageAttribute.self, f: { RestrictedContentMessageAttribute(decoder: $0) }) diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index 244df06a7f..5cb8d5b003 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -2110,16 +2110,24 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } } + var wasOpearationScheduledMessegeIds: [MessageId] = [] + + var addedOperationIncomingMessageIds: [MessageId] = [] for operation in finalState.state.operations { switch operation { case let .AddMessages(messages, location): if case .UpperHistoryBlock = location { for message in messages { - if case let .Id(id) = message.id, message.flags.contains(.Incoming) { - addedOperationIncomingMessageIds.append(id) - if let authorId = message.authorId { - recordPeerActivityTimestamp(peerId: authorId, timestamp: message.timestamp, into: &peerActivityTimestamps) + if case let .Id(id) = message.id { + if message.flags.contains(.Incoming) { + addedOperationIncomingMessageIds.append(id) + if let authorId = message.authorId { + recordPeerActivityTimestamp(peerId: authorId, timestamp: message.timestamp, into: &peerActivityTimestamps) + } + } + if message.flags.contains(.WasScheduled) { + wasOpearationScheduledMessegeIds.append(id) } } } @@ -2128,7 +2136,17 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP break } } + var wasScheduledMessageIds:[MessageId] = [] var addedIncomingMessageIds: [MessageId] = [] + + if !wasOpearationScheduledMessegeIds.isEmpty { + let existingIds = transaction.filterStoredMessageIds(Set(wasOpearationScheduledMessegeIds)) + for id in wasOpearationScheduledMessegeIds { + if !existingIds.contains(id) { + wasScheduledMessageIds.append(id) + } + } + } if !addedOperationIncomingMessageIds.isEmpty { let existingIds = transaction.filterStoredMessageIds(Set(addedOperationIncomingMessageIds)) for id in addedOperationIncomingMessageIds { @@ -2888,5 +2906,5 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP addedIncomingMessageIds.append(contentsOf: addedSecretMessageIds) - return AccountReplayedFinalState(state: finalState, addedIncomingMessageIds: addedIncomingMessageIds, addedSecretMessageIds: addedSecretMessageIds, updatedTypingActivities: updatedTypingActivities, updatedWebpages: updatedWebpages, updatedCalls: updatedCalls, updatedPeersNearby: updatedPeersNearby, isContactUpdates: isContactUpdates, delayNotificatonsUntil: delayNotificatonsUntil) + return AccountReplayedFinalState(state: finalState, addedIncomingMessageIds: addedIncomingMessageIds, wasScheduledMessageIds: wasScheduledMessageIds, addedSecretMessageIds: addedSecretMessageIds, updatedTypingActivities: updatedTypingActivities, updatedWebpages: updatedWebpages, updatedCalls: updatedCalls, updatedPeersNearby: updatedPeersNearby, isContactUpdates: isContactUpdates, delayNotificatonsUntil: delayNotificatonsUntil) } diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManager.swift b/submodules/TelegramCore/TelegramCore/AccountStateManager.swift index 51882c6f63..ea9df950c1 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManager.swift @@ -681,6 +681,15 @@ public final class AccountStateManager { messageList.append((messages, .root, notify)) } } + var wasScheduledMessages: [Message] = [] + for id in events.wasScheduledMessageIds { + if let message = transaction.getMessage(id) { + wasScheduledMessages.append(message) + } + } + if !wasScheduledMessages.isEmpty { + messageList.append((wasScheduledMessages, .root, true)) + } return messageList } diff --git a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift index 748231955d..bf568a19d6 100644 --- a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift @@ -537,6 +537,8 @@ extension StoreMessage { attributes.append(ContentRequiresValidationMessageAttribute()) } + + if let reactions = reactions { attributes.append(ReactionsMessageAttribute(apiReactions: reactions)) } @@ -565,6 +567,10 @@ extension StoreMessage { storeFlags.insert(.Incoming) } + if (flags & (1 << 18)) != 0 { + storeFlags.insert(.WasScheduled) + } + if (flags & (1 << 4)) != 0 || (flags & (1 << 13)) != 0 { var notificationFlags: NotificationInfoMessageAttributeFlags = [] if (flags & (1 << 4)) != 0 { @@ -621,6 +627,7 @@ extension StoreMessage { attributes.append(ContentRequiresValidationMessageAttribute()) } + var storeFlags = StoreMessageFlags() if (flags & 2) == 0 { let _ = storeFlags.insert(.Incoming) @@ -646,6 +653,10 @@ extension StoreMessage { storeFlags.insert(.CanBeGroupedIntoFeed) + if (flags & (1 << 18)) != 0 { + storeFlags.insert(.WasScheduled) + } + self.init(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, groupingKey: nil, timestamp: date, flags: storeFlags, tags: tags, globalTags: globalTags, localTags: [], forwardInfo: nil, authorId: authorId, text: "", attributes: attributes, media: media) } } diff --git a/submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift new file mode 100644 index 0000000000..1bff00104e --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/WasScheduledMessageAttribute.swift @@ -0,0 +1,17 @@ +import Foundation +#if os(macOS) +import PostboxMac +#else +import Postbox +#endif + +public class WasScheduledMessageAttribute: MessageAttribute { + public init() { + } + + required public init(decoder: PostboxDecoder) { + } + + public func encode(_ encoder: PostboxEncoder) { + } +} diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 01709b9ca6..93fa992764 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -349,6 +349,8 @@ D04CAA5B1E83310D0047E51F /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CAA591E83310D0047E51F /* MD5.swift */; }; D04D21372306EC9A00609388 /* MacInternalUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D21362306EC9A00609388 /* MacInternalUpdater.swift */; }; D04D21382306ECF600609388 /* FormatPhoneNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = D03E452D2305C15A0049C28B /* FormatPhoneNumber.m */; }; + D04D213C230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */; }; + D04D213D230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */; }; D04D8FF4209A4B0700865719 /* NetworkSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D8FF3209A4B0700865719 /* NetworkSettings.swift */; }; D04D8FF5209A4B0700865719 /* NetworkSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D8FF3209A4B0700865719 /* NetworkSettings.swift */; }; D050F2101E48AB0600988324 /* InteractivePhoneFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D050F20F1E48AB0600988324 /* InteractivePhoneFormatter.swift */; }; @@ -986,6 +988,7 @@ D049EAF41E44DF3300A2CD3A /* AccountState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountState.swift; sourceTree = ""; }; D04CAA591E83310D0047E51F /* MD5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MD5.swift; sourceTree = ""; }; D04D21362306EC9A00609388 /* MacInternalUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacInternalUpdater.swift; sourceTree = ""; }; + D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WasScheduledMessageAttribute.swift; sourceTree = ""; }; D04D8FF3209A4B0700865719 /* NetworkSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSettings.swift; sourceTree = ""; }; D050F20F1E48AB0600988324 /* InteractivePhoneFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractivePhoneFormatter.swift; sourceTree = ""; }; D050F2501E4A59C200988324 /* JoinLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinLink.swift; sourceTree = ""; }; @@ -1409,6 +1412,7 @@ 09FC986A22FD882200915E37 /* OutgoingScheduleInfoMessageAttribute.swift */, D0329EA422FC5A9600F9F071 /* ReactionsMessageAttribute.swift */, D03E3D27230447960049C28B /* RestrictedContentMessageAttribute.swift */, + D04D213B230AC35A00609388 /* WasScheduledMessageAttribute.swift */, ); name = Attributes; sourceTree = ""; @@ -2273,6 +2277,7 @@ D049EAD81E43DAD200A2CD3A /* ManagedRecentStickers.swift in Sources */, D0BE303A20619EE800FBE6D8 /* SecureIdForm.swift in Sources */, D03DC9131F82F89D001D584C /* RegularChatState.swift in Sources */, + D04D213C230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */, 0962E66721B59BAA00245FD9 /* ManagedAppConfigurationUpdates.swift in Sources */, D0613FCF1E60520700202CDB /* ChannelMembers.swift in Sources */, D0B2F7742052DEF700D3BFB9 /* TelegramDeviceContactImportInfo.swift in Sources */, @@ -2725,6 +2730,7 @@ 9F06831121A40DEC001D8EDB /* NotificationExceptionsList.swift in Sources */, D0AB262C21C3CE80008F6685 /* Polls.swift in Sources */, D073CE6C1DCBCF17007511FD /* TextEntitiesMessageAttribute.swift in Sources */, + D04D213D230AC35A00609388 /* WasScheduledMessageAttribute.swift in Sources */, D03C53751DAD5CA9004C17B3 /* TelegramUserPresence.swift in Sources */, D00580AF21E2A08900CB7CD3 /* AccountEnvironmentAttribute.swift in Sources */, D03E3D29230447960049C28B /* RestrictedContentMessageAttribute.swift in Sources */, From 606edad6cd68f8b55e6a59eb079aeaf2d944e385 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 20 Aug 2019 23:17:09 +0300 Subject: [PATCH 13/86] Reactions in context menu --- .../Sources/AnimatedStickerNode.swift | 48 +- .../ContextUI_Xcode.xcodeproj/project.pbxproj | 8 + .../ContextUI/Sources/ContextActionNode.swift | 2 +- .../Sources/ContextContentSourceNode.swift | 1 + .../ContextUI/Sources/ContextController.swift | 190 +++++++- .../ContainedViewLayoutTransition.swift | 9 +- ...pLongTapOrDoubleTapGestureRecognizer.swift | 2 +- submodules/Display/Display/UIKitUtils.swift | 1 + .../Sources/ItemListStickerPackItem.swift | 2 +- .../project.pbxproj | 10 +- .../Sources/ReactionContextNode.swift | 423 ++++++++++++++++++ .../Sources/ReactionGestureItem.swift | 2 +- .../Sources/ReactionSelectionNode.swift | 134 ++++-- .../Sources/ReactionSelectionParentNode.swift | 7 +- .../Sources/StickerPackPreviewGridItem.swift | 2 +- .../Sources/StickerPreviewPeekContent.swift | 2 +- .../Report.imageset/ic_lt_report.pdf | Bin 4498 -> 4091 bytes .../TelegramUI/ChatController.swift | 68 +-- .../TelegramUI/ChatControllerNode.swift | 2 +- .../ChatInterfaceStateContextMenus.swift | 4 +- .../ChatMediaInputStickerGridItem.swift | 2 +- .../ChatMediaInputStickerPackItem.swift | 2 +- .../ChatMessageAnimatedStickerItemNode.swift | 2 +- .../ChatMessageBubbleContentNode.swift | 2 + .../ChatMessageBubbleItemNode.swift | 43 +- .../ChatMessageInteractiveMediaNode.swift | 2 +- .../TelegramUI/ChatMessageItemView.swift | 6 + .../ChatMessageTextBubbleContentNode.swift | 5 +- ...ListContextResultsChatInputPanelItem.swift | 2 +- .../HorizontalStickerGridItem.swift | 2 +- .../MediaInputPaneTrendingItem.swift | 2 +- .../NotificationContentContext.swift | 2 +- .../Resources/BuiltinReactions/celebrate.tgs | Bin 0 -> 21678 bytes .../Resources/BuiltinReactions/cry.tgs | Bin 0 -> 15707 bytes .../Resources/BuiltinReactions/heart.tgs | Bin 0 -> 56205 bytes .../Resources/BuiltinReactions/lol.tgs | Bin 0 -> 13754 bytes .../Resources/BuiltinReactions/meh.tgs | Bin 0 -> 5601 bytes .../Resources/BuiltinReactions/ok.tgs | Bin 0 -> 4938 bytes .../Resources/BuiltinReactions/poker.tgs | Bin 0 -> 2896 bytes .../Resources/BuiltinReactions/poop.tgs | Bin 0 -> 24522 bytes .../Resources/BuiltinReactions/sad.tgs | Bin 0 -> 3210 bytes .../Resources/BuiltinReactions/smile.tgs | Bin 0 -> 15364 bytes .../Resources/BuiltinReactions/surprised.tgs | Bin 0 -> 8648 bytes .../Resources/BuiltinReactions/thumbsup.tgs | Bin 0 -> 17922 bytes .../StickerPaneSearchStickerItem.swift | 2 +- .../project.pbxproj | 4 + .../Sources/TextSelectionNode.swift | 6 +- 47 files changed, 867 insertions(+), 134 deletions(-) create mode 100644 submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/celebrate.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/cry.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/heart.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/lol.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/meh.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/ok.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/poker.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/poop.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/sad.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/smile.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/surprised.tgs create mode 100755 submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/thumbsup.tgs diff --git a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift b/submodules/AnimationUI/Sources/AnimatedStickerNode.swift index e6a1df697b..9efaa25127 100644 --- a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift +++ b/submodules/AnimationUI/Sources/AnimatedStickerNode.swift @@ -301,6 +301,11 @@ public struct AnimatedStickerStatus: Equatable { } } +public enum AnimatedStickerNodeResource { + case resource(MediaResource) + case localFile(String) +} + public final class AnimatedStickerNode: ASDisplayNode { private let queue: Queue private var account: Account? @@ -381,28 +386,38 @@ public final class AnimatedStickerNode: ASDisplayNode { self.addSubnode(self.renderer!) } - public func setup(account: Account, resource: MediaResource, fitzModifier: EmojiFitzModifier? = nil, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) { + public func setup(account: Account, resource: AnimatedStickerNodeResource, fitzModifier: EmojiFitzModifier? = nil, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) { if width < 2 || height < 2 { return } self.playbackMode = playbackMode switch mode { - case .direct: + case .direct: + let f: (MediaResourceData) -> Void = { [weak self] data in + guard let strongSelf = self, data.complete else { + return + } + if let directData = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.mappedRead]) { + strongSelf.directData = Tuple(directData, data.path, width, height) + } + if strongSelf.isPlaying { + strongSelf.play() + } else if strongSelf.canDisplayFirstFrame { + strongSelf.play(firstFrame: true) + } + } + switch resource { + case let .resource(resource): self.disposable.set((account.postbox.mediaBox.resourceData(resource) - |> deliverOnMainQueue).start(next: { [weak self] data in - guard let strongSelf = self, data.complete else { - return - } - if let directData = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.mappedRead]) { - strongSelf.directData = Tuple(directData, data.path, width, height) - } - if strongSelf.isPlaying { - strongSelf.play() - } else if strongSelf.canDisplayFirstFrame { - strongSelf.play(firstFrame: true) - } + |> deliverOnMainQueue).start(next: { data in + f(data) })) - case .cached: + case let .localFile(path): + f(MediaResourceData(path: path, offset: 0, size: Int(Int32.max - 1), complete: true)) + } + case .cached: + switch resource { + case let .resource(resource): self.disposable.set((chatMessageAnimationData(postbox: account.postbox, resource: resource, fitzModifier: fitzModifier, width: width, height: height, synchronousLoad: false) |> deliverOnMainQueue).start(next: { [weak self] data in if let strongSelf = self, data.complete { @@ -414,6 +429,9 @@ public final class AnimatedStickerNode: ASDisplayNode { } } })) + case .localFile: + break + } } } diff --git a/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj b/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj index 9f3333daec..1bb4fb705e 100644 --- a/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/ContextUI/ContextUI_Xcode.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ D038AC7522F8A06200320981 /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D038AC7422F8A06200320981 /* Display.framework */; }; D038AC7722F8A07000320981 /* ContextController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D038AC7622F8A07000320981 /* ContextController.swift */; }; D038AC7922F8A08A00320981 /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D038AC7822F8A08A00320981 /* AsyncDisplayKit.framework */; }; + D0624F93230C0CB7000FC2BD /* ReactionSelectionNode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0624F92230C0CB7000FC2BD /* ReactionSelectionNode.framework */; }; + D0624F95230C0D2C000FC2BD /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0624F94230C0D2C000FC2BD /* TelegramCore.framework */; }; D09E777F22F8E47000B9CCA7 /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E777E22F8E47000B9CCA7 /* TelegramPresentationData.framework */; }; D09E778122F8E62000B9CCA7 /* ContextActionsContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09E778022F8E62000B9CCA7 /* ContextActionsContainerNode.swift */; }; D09E778322F8E67300B9CCA7 /* ContextActionNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09E778222F8E67300B9CCA7 /* ContextActionNode.swift */; }; @@ -30,6 +32,8 @@ D038AC7422F8A06200320981 /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D038AC7622F8A07000320981 /* ContextController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextController.swift; sourceTree = ""; }; D038AC7822F8A08A00320981 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0624F92230C0CB7000FC2BD /* ReactionSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ReactionSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0624F94230C0D2C000FC2BD /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D09E777E22F8E47000B9CCA7 /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D09E778022F8E62000B9CCA7 /* ContextActionsContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextActionsContainerNode.swift; sourceTree = ""; }; D09E778222F8E67300B9CCA7 /* ContextActionNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextActionNode.swift; sourceTree = ""; }; @@ -43,6 +47,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D0624F95230C0D2C000FC2BD /* TelegramCore.framework in Frameworks */, + D0624F93230C0CB7000FC2BD /* ReactionSelectionNode.framework in Frameworks */, D0C9CBE42302D45F00FAB518 /* TextSelectionNode.framework in Frameworks */, D09E777F22F8E47000B9CCA7 /* TelegramPresentationData.framework in Frameworks */, D038AC7922F8A08A00320981 /* AsyncDisplayKit.framework in Frameworks */, @@ -89,6 +95,8 @@ D038AC6F22F8A05A00320981 /* Frameworks */ = { isa = PBXGroup; children = ( + D0624F94230C0D2C000FC2BD /* TelegramCore.framework */, + D0624F92230C0CB7000FC2BD /* ReactionSelectionNode.framework */, D0C9CBE32302D45F00FAB518 /* TextSelectionNode.framework */, D09E777E22F8E47000B9CCA7 /* TelegramPresentationData.framework */, D038AC7822F8A08A00320981 /* AsyncDisplayKit.framework */, diff --git a/submodules/ContextUI/Sources/ContextActionNode.swift b/submodules/ContextUI/Sources/ContextActionNode.swift index 7881690856..46ca6f16b0 100644 --- a/submodules/ContextUI/Sources/ContextActionNode.swift +++ b/submodules/ContextUI/Sources/ContextActionNode.swift @@ -103,7 +103,7 @@ final class ContextActionNode: ASDisplayNode { func updateLayout(constrainedWidth: CGFloat, previous: ContextActionSibling, next: ContextActionSibling) -> (CGSize, (CGSize, ContainedViewLayoutTransition) -> Void) { let sideInset: CGFloat = 16.0 - let iconSideInset: CGFloat = 8.0 + let iconSideInset: CGFloat = 12.0 let verticalInset: CGFloat = 12.0 let iconSize = self.iconNode.image.flatMap({ $0.size }) ?? CGSize() diff --git a/submodules/ContextUI/Sources/ContextContentSourceNode.swift b/submodules/ContextUI/Sources/ContextContentSourceNode.swift index 3c37d7090b..a2f91e3cd3 100644 --- a/submodules/ContextUI/Sources/ContextContentSourceNode.swift +++ b/submodules/ContextUI/Sources/ContextContentSourceNode.swift @@ -12,6 +12,7 @@ public final class ContextContentContainingNode: ASDisplayNode { public var applyAbsoluteOffset: ((CGFloat, ContainedViewLayoutTransitionCurve, Double) -> Void)? public var applyAbsoluteOffsetSpring: ((CGFloat, Double, CGFloat) -> Void)? public var layoutUpdated: ((CGSize) -> Void)? + public var updateDistractionFreeMode: ((Bool) -> Void)? public override init() { self.contentNode = ContextContentNode() diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 2e045b0cdf..e1a9e3b786 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -4,6 +4,8 @@ import AsyncDisplayKit import Display import TelegramPresentationData import TextSelectionNode +import ReactionSelectionNode +import TelegramCore public enum ContextMenuActionItemTextLayout { case singleLine @@ -48,6 +50,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi private let source: ContextControllerContentSource private var items: [ContextMenuItem] private let beginDismiss: (ContextMenuActionResult) -> Void + private let reactionSelected: (String) -> Void private var validLayout: ContainerViewLayout? @@ -64,20 +67,26 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi private var contentParentNode: ContextContentContainingNode? private let contentContainerNode: ContextContentContainerNode private var actionsContainerNode: ContextActionsContainerNode + private var reactionContextNode: ReactionContextNode? + private var reactionContextNodeIsAnimatingOut = false private var didCompleteAnimationIn = false private var initialContinueGesturePoint: CGPoint? private var didMoveFromInitialGesturePoint = false private var highlightedActionNode: ContextActionNode? + private var highlightedReaction: String? private let hapticFeedback = HapticFeedback() - init(controller: ContextController, theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], beginDismiss: @escaping (ContextMenuActionResult) -> Void, recognizer: TapLongTapOrDoubleTapGestureRecognizer?) { + private var isAnimatingOut = false + + init(account: Account, controller: ContextController, theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], reactionItems: [ReactionContextItem], beginDismiss: @escaping (ContextMenuActionResult) -> Void, recognizer: TapLongTapOrDoubleTapGestureRecognizer?, reactionSelected: @escaping (String) -> Void) { self.theme = theme self.strings = strings self.source = source self.items = items self.beginDismiss = beginDismiss + self.reactionSelected = reactionSelected self.effectView = UIVisualEffectView() if #available(iOS 9.0, *) { @@ -114,16 +123,14 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi beginDismiss(result) }) - super.init() + if !reactionItems.isEmpty { + let reactionContextNode = ReactionContextNode(account: account, theme: theme, items: reactionItems) + self.reactionContextNode = reactionContextNode + } else { + self.reactionContextNode = nil + } - /*if #available(iOS 10.0, *) { - let propertyAnimator = UIViewPropertyAnimator(duration: 0.4, curve: .linear) - propertyAnimator.isInterruptible = true - propertyAnimator.addAnimations { - self.effectView.effect = makeCustomZoomBlurEffect() - } - self.propertyAnimator = propertyAnimator - }*/ + super.init() self.scrollNode.view.delegate = self @@ -136,6 +143,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi self.scrollNode.addSubnode(self.actionsContainerNode) self.scrollNode.addSubnode(self.contentContainerNode) + self.reactionContextNode.flatMap(self.addSubnode) getController = { [weak controller] in return controller @@ -172,6 +180,24 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi strongSelf.hapticFeedback.tap() } } + + if let reactionContextNode = strongSelf.reactionContextNode { + let highlightedReaction = reactionContextNode.reaction(at: strongSelf.view.convert(localPoint, to: reactionContextNode.view)).flatMap { value -> String? in + switch value { + case let .reaction(reaction, _, _): + return reaction + default: + return nil + } + } + if strongSelf.highlightedReaction != highlightedReaction { + strongSelf.highlightedReaction = highlightedReaction + reactionContextNode.setHighlightedReaction(highlightedReaction) + if let _ = highlightedReaction { + strongSelf.hapticFeedback.tap() + } + } + } } } } @@ -181,21 +207,43 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } recognizer.externalUpdated = nil if strongSelf.didMoveFromInitialGesturePoint { - if let (view, point) = viewAndPoint { - let _ = strongSelf.view.convert(point, from: view) + if let (_, _) = viewAndPoint { if let highlightedActionNode = strongSelf.highlightedActionNode { strongSelf.highlightedActionNode = nil highlightedActionNode.performAction() } + if let _ = strongSelf.reactionContextNode { + if let reaction = strongSelf.highlightedReaction { + strongSelf.reactionSelected(reaction) + } + } } else { if let highlightedActionNode = strongSelf.highlightedActionNode { strongSelf.highlightedActionNode = nil highlightedActionNode.setIsHighlighted(false) } + if let reactionContextNode = strongSelf.reactionContextNode, let _ = strongSelf.highlightedReaction { + strongSelf.highlightedReaction = nil + reactionContextNode.setHighlightedReaction(nil) + } } } } } + + if let reactionContextNode = self.reactionContextNode { + reactionContextNode.reactionSelected = { [weak self] reaction in + guard let _ = self else { + return + } + switch reaction { + case let .reaction(value, _, _): + reactionSelected(value) + default: + break + } + } + } } deinit { @@ -229,11 +277,34 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi guard let strongSelf = self, let contentParentNode = contentParentNode, let parentSupernode = contentParentNode.supernode else { return } + if strongSelf.isAnimatingOut { + return + } strongSelf.originalProjectedContentViewFrame = (parentSupernode.view.convert(contentParentNode.frame, to: strongSelf.view), contentParentNode.view.convert(contentParentNode.contentRect, to: strongSelf.view)) if let validLayout = strongSelf.validLayout { strongSelf.updateLayout(layout: validLayout, transition: .animated(duration: 0.2, curve: .easeInOut), previousActionsContainerNode: nil) } } + takenViewInfo.contentContainingNode.updateDistractionFreeMode = { [weak self] value in + guard let strongSelf = self, let reactionContextNode = strongSelf.reactionContextNode else { + return + } + if value { + if !reactionContextNode.alpha.isZero { + reactionContextNode.alpha = 0.0 + reactionContextNode.allowsGroupOpacity = true + reactionContextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, completion: { [weak reactionContextNode] _ in + reactionContextNode?.allowsGroupOpacity = false + }) + } + } else if reactionContextNode.alpha != 1.0 { + reactionContextNode.alpha = 1.0 + reactionContextNode.allowsGroupOpacity = true + reactionContextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, completion: { [weak reactionContextNode] _ in + reactionContextNode?.allowsGroupOpacity = false + }) + } + } self.contentContainerNode.contentNode = takenViewInfo.contentContainingNode.contentNode self.contentAreaInScreenSpace = takenViewInfo.contentAreaInScreenSpace self.contentContainerNode.addSubnode(takenViewInfo.contentContainingNode.contentNode) @@ -264,6 +335,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } else { UIView.animate(withDuration: 0.2, animations: { self.effectView.effect = makeCustomZoomBlurEffect() + }, completion: { [weak self] _ in + self?.didCompleteAnimationIn = true }) } self.actionsContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) @@ -274,6 +347,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode { let localSourceFrame = self.view.convert(originalProjectedContentViewFrame.1, to: self.scrollNode.view) + if let reactionContextNode = self.reactionContextNode { + reactionContextNode.animateIn(from: CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: contentParentNode.contentRect.size)) + } + self.actionsContainerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true) let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y - contentParentNode.contentRect.minY) self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true) @@ -283,6 +360,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi func animateOut(result: ContextMenuActionResult, completion: @escaping () -> Void) { self.isUserInteractionEnabled = false + self.isAnimatingOut = true var completedEffect = false var completedContentNode = false @@ -357,6 +435,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi }) contentParentNode.updateAbsoluteRect?(self.contentContainerNode.frame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y + contentContainerOffset.y), self.bounds.size) contentParentNode.applyAbsoluteOffset?(-contentContainerOffset.y, .easeInOut, 0.2) + + if let reactionContextNode = self.reactionContextNode { + reactionContextNode.animateOut(to: CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: contentParentNode.contentRect.size), animatingOutToReaction: self.reactionContextNodeIsAnimatingOut) + } } else if let contentParentNode = self.contentParentNode { if let snapshotView = contentParentNode.contentNode.view.snapshotContentTree() { self.contentContainerNode.view.addSubview(snapshotView) @@ -370,9 +452,46 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi completedContentNode = true intermediateCompletion() }) + + if let reactionContextNode = self.reactionContextNode { + reactionContextNode.animateOut(to: nil, animatingOutToReaction: self.reactionContextNodeIsAnimatingOut) + } } } + func animateOutToReaction(value: String, into targetNode: ASImageNode, hideNode: Bool, completion: @escaping () -> Void) { + guard let reactionContextNode = self.reactionContextNode else { + self.animateOut(result: .default, completion: completion) + return + } + var contentCompleted = false + var reactionCompleted = false + let intermediateCompletion: () -> Void = { + if contentCompleted && reactionCompleted { + completion() + } + } + + self.reactionContextNodeIsAnimatingOut = true + self.animateOut(result: .default, completion: { + contentCompleted = true + intermediateCompletion() + }) + reactionContextNode.animateOutToReaction(value: value, targetNode: targetNode, hideNode: hideNode, completion: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.reactionContextNode?.removeFromSupernode() + strongSelf.reactionContextNode = nil + reactionCompleted = true + intermediateCompletion() + /*strongSelf.animateOut(result: .default, completion: { + reactionCompleted = true + intermediateCompletion() + })*/ + }) + } + func setItems(controller: ContextController, items: [ContextMenuItem]) { self.items = items @@ -406,9 +525,12 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(), size: layout.size)) - let contentActionsSpacing: CGFloat = 11.0 + let contentActionsSpacing: CGFloat = 7.0 let actionsSideInset: CGFloat = 11.0 - let contentTopInset: CGFloat = max(11.0, layout.statusBarHeight ?? 0.0) + var contentTopInset: CGFloat = max(11.0, layout.statusBarHeight ?? 0.0) + if let _ = self.reactionContextNode { + contentTopInset += 34.0 + } let actionsBottomInset: CGFloat = 11.0 if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode { @@ -452,7 +574,13 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } } - contentParentNode.updateAbsoluteRect?(contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y), layout.size) + let absoluteContentRect = contentContainerFrame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y) + + contentParentNode.updateAbsoluteRect?(absoluteContentRect, layout.size) + + if let reactionContextNode = self.reactionContextNode { + reactionContextNode.updateLayout(size: layout.size, anchorRect: CGRect(origin: CGPoint(x: absoluteContentRect.minX + contentParentNode.contentRect.minX, y: absoluteContentRect.minY + contentParentNode.contentRect.minY), size: contentParentNode.contentRect.size), transition: transition) + } } if let previousActionsContainerNode = previousActionsContainerNode { @@ -483,6 +611,11 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if !self.bounds.contains(point) { return nil } + if let reactionContextNode = self.reactionContextNode { + if let result = reactionContextNode.hitTest(self.view.convert(point, to: reactionContextNode.view), with: event) { + return result + } + } let mappedPoint = self.view.convert(point, to: self.scrollNode.view) if self.actionsContainerNode.frame.contains(mappedPoint) { return self.actionsContainerNode.hitTest(self.view.convert(point, to: self.actionsContainerNode.view), with: event) @@ -524,10 +657,12 @@ public protocol ContextControllerContentSource: class { } public final class ContextController: ViewController { + private let account: Account private var theme: PresentationTheme private var strings: PresentationStrings private let source: ContextControllerContentSource private var items: [ContextMenuItem] + private var reactionItems: [ReactionContextItem] private weak var recognizer: TapLongTapOrDoubleTapGestureRecognizer? @@ -538,11 +673,15 @@ public final class ContextController: ViewController { return self.displayNode as! ContextControllerNode } - public init(theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], recognizer: TapLongTapOrDoubleTapGestureRecognizer? = nil) { + public var reactionSelected: ((String) -> Void)? + + public init(account: Account, theme: PresentationTheme, strings: PresentationStrings, source: ContextControllerContentSource, items: [ContextMenuItem], reactionItems: [ReactionContextItem], recognizer: TapLongTapOrDoubleTapGestureRecognizer? = nil) { + self.account = account self.theme = theme self.strings = strings self.source = source self.items = items + self.reactionItems = reactionItems self.recognizer = recognizer super.init(navigationBarPresentationData: nil) @@ -555,9 +694,14 @@ public final class ContextController: ViewController { } override public func loadDisplayNode() { - self.displayNode = ContextControllerNode(controller: self, theme: self.theme, strings: self.strings, source: self.source, items: self.items, beginDismiss: { [weak self] result in + self.displayNode = ContextControllerNode(account: self.account, controller: self, theme: self.theme, strings: self.strings, source: self.source, items: self.items, reactionItems: self.reactionItems, beginDismiss: { [weak self] result in self?.dismiss(result: result, completion: nil) - }, recognizer: self.recognizer) + }, recognizer: self.recognizer, reactionSelected: { [weak self] value in + guard let strongSelf = self else { + return + } + strongSelf.reactionSelected?(value) + }) self.displayNodeDidLoad() } @@ -600,4 +744,14 @@ public final class ContextController: ViewController { override public func dismiss(completion: (() -> Void)? = nil) { self.dismiss(result: .default, completion: completion) } + + public func dismissWithReaction(value: String, into targetNode: ASImageNode, hideNode: Bool, completion: (() -> Void)?) { + if !self.wasDismissed { + self.wasDismissed = true + self.controllerNode.animateOutToReaction(value: value, into: targetNode, hideNode: hideNode, completion: { [weak self] in + self?.presentingViewController?.dismiss(animated: false, completion: nil) + completion?() + }) + } + } } diff --git a/submodules/Display/Display/ContainedViewLayoutTransition.swift b/submodules/Display/Display/ContainedViewLayoutTransition.swift index ec438b5a21..147c8e762a 100644 --- a/submodules/Display/Display/ContainedViewLayoutTransition.swift +++ b/submodules/Display/Display/ContainedViewLayoutTransition.swift @@ -378,7 +378,7 @@ public extension ContainedViewLayoutTransition { } } - func updateAlpha(node: ASDisplayNode, alpha: CGFloat, completion: ((Bool) -> Void)? = nil) { + func updateAlpha(node: ASDisplayNode, alpha: CGFloat, beginWithCurrentState: Bool = false, completion: ((Bool) -> Void)? = nil) { if node.alpha.isEqual(to: alpha) { if let completion = completion { completion(true) @@ -393,7 +393,12 @@ public extension ContainedViewLayoutTransition { completion(true) } case let .animated(duration, curve): - let previousAlpha = node.alpha + let previousAlpha: CGFloat + if beginWithCurrentState, let presentation = node.layer.presentation() { + previousAlpha = CGFloat(presentation.opacity) + } else { + previousAlpha = node.alpha + } node.alpha = alpha node.layer.animateAlpha(from: previousAlpha, to: alpha, duration: duration, timingFunction: curve.timingFunction, mediaTimingFunction: curve.mediaTimingFunction, completion: { result in if let completion = completion { diff --git a/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift b/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift index 930240dcfd..add9373781 100644 --- a/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift +++ b/submodules/Display/Display/TapLongTapOrDoubleTapGestureRecognizer.swift @@ -120,9 +120,9 @@ public final class TapLongTapOrDoubleTapGestureRecognizer: UIGestureRecognizer, self.lastRecognizedGestureAndLocation = (.longTap, location) if let longTap = self.longTap { self.recognizedLongTap = true + self.state = .began longTap(location, self) cancelScrollViewGestures(view: self.view?.superview) - self.state = .began return } } else { diff --git a/submodules/Display/Display/UIKitUtils.swift b/submodules/Display/Display/UIKitUtils.swift index db471b3670..3c9f5ac627 100644 --- a/submodules/Display/Display/UIKitUtils.swift +++ b/submodules/Display/Display/UIKitUtils.swift @@ -329,6 +329,7 @@ private func makeLayerSubtreeSnapshot(layer: CALayer) -> CALayer? { for sublayer in sublayers { let subtree = makeLayerSubtreeSnapshot(layer: sublayer) if let subtree = subtree { + subtree.transform = sublayer.transform subtree.frame = sublayer.frame subtree.bounds = sublayer.bounds layer.addSublayer(subtree) diff --git a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift index 91b50ea909..ce5115a171 100644 --- a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift +++ b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift @@ -582,7 +582,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { animationNode = AnimatedStickerNode() strongSelf.animationNode = animationNode strongSelf.addSubnode(animationNode) - animationNode.setup(account: item.account, resource: resource, width: 80, height: 80, mode: .cached) + animationNode.setup(account: item.account, resource: .resource(resource), width: 80, height: 80, mode: .cached) } animationNode.visibility = strongSelf.visibility != .none && item.playAnimatedStickers animationNode.isHidden = !item.playAnimatedStickers diff --git a/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj b/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj index e16fea7138..e892d700cf 100644 --- a/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj +++ b/submodules/ReactionSelectionNode/ReactionSelectionNode_Xcode.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ D03E46082305EEDD0049C28B /* ReactionSelectionParentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46072305EEDD0049C28B /* ReactionSelectionParentNode.swift */; }; D03E460A2305EF900049C28B /* ReactionSwipeGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E46092305EF900049C28B /* ReactionSwipeGestureRecognizer.swift */; }; D03E460C2305EFD80049C28B /* ReactionGestureItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E460B2305EFD80049C28B /* ReactionGestureItem.swift */; }; + D0624F8F230C0316000FC2BD /* ReactionContextNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0624F8E230C0316000FC2BD /* ReactionContextNode.swift */; }; + D0624F91230C0472000FC2BD /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0624F90230C0472000FC2BD /* TelegramPresentationData.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -36,6 +38,8 @@ D03E46072305EEDD0049C28B /* ReactionSelectionParentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionSelectionParentNode.swift; sourceTree = ""; }; D03E46092305EF900049C28B /* ReactionSwipeGestureRecognizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionSwipeGestureRecognizer.swift; sourceTree = ""; }; D03E460B2305EFD80049C28B /* ReactionGestureItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionGestureItem.swift; sourceTree = ""; }; + D0624F8E230C0316000FC2BD /* ReactionContextNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionContextNode.swift; sourceTree = ""; }; + D0624F90230C0472000FC2BD /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -43,6 +47,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D0624F91230C0472000FC2BD /* TelegramPresentationData.framework in Frameworks */, D03E46042305EE790049C28B /* TelegramCore.framework in Frameworks */, D03E46022305EE750049C28B /* Postbox.framework in Frameworks */, D03E46002305EE710049C28B /* AnimationUI.framework in Frameworks */, @@ -78,10 +83,11 @@ isa = PBXGroup; children = ( D03E45F42305EB7C0049C28B /* ReactionSelectionNode.swift */, - D03E45E82305E3F30049C28B /* ReactionSelectionNode.h */, + D0624F8E230C0316000FC2BD /* ReactionContextNode.swift */, D03E46072305EEDD0049C28B /* ReactionSelectionParentNode.swift */, D03E46092305EF900049C28B /* ReactionSwipeGestureRecognizer.swift */, D03E460B2305EFD80049C28B /* ReactionGestureItem.swift */, + D03E45E82305E3F30049C28B /* ReactionSelectionNode.h */, ); path = Sources; sourceTree = ""; @@ -89,6 +95,7 @@ D03E45F62305EB870049C28B /* Frameworks */ = { isa = PBXGroup; children = ( + D0624F90230C0472000FC2BD /* TelegramPresentationData.framework */, D03E46032305EE790049C28B /* TelegramCore.framework */, D03E46012305EE750049C28B /* Postbox.framework */, D03E45FF2305EE710049C28B /* AnimationUI.framework */, @@ -183,6 +190,7 @@ D03E460A2305EF900049C28B /* ReactionSwipeGestureRecognizer.swift in Sources */, D03E46082305EEDD0049C28B /* ReactionSelectionParentNode.swift in Sources */, D03E460C2305EFD80049C28B /* ReactionGestureItem.swift in Sources */, + D0624F8F230C0316000FC2BD /* ReactionContextNode.swift in Sources */, D03E45F52305EB7C0049C28B /* ReactionSelectionNode.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift new file mode 100644 index 0000000000..8c958722c4 --- /dev/null +++ b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift @@ -0,0 +1,423 @@ +import Foundation +import AsyncDisplayKit +import Display +import AnimationUI +import TelegramCore +import TelegramPresentationData + +public final class ReactionContextItem { + public let value: String + public let text: String + public let path: String + + public init(value: String, text: String, path: String) { + self.value = value + self.text = text + self.path = path + } +} + +private let largeCircleSize: CGFloat = 16.0 +private let smallCircleSize: CGFloat = 8.0 + +private func generateBackgroundImage(foreground: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? { + return generateImage(CGSize(width: diameter * 2.0 + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setBlendMode(.copy) + context.setFillColor(foreground.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur + diameter, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.fill(CGRect(origin: CGPoint(x: shadowBlur + diameter / 2.0, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + })?.stretchableImage(withLeftCapWidth: Int(diameter + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0)) +} + +private func generateBackgroundShadowImage(shadow: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? { + return generateImage(CGSize(width: diameter * 2.0 + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(UIColor.white.cgColor) + context.setShadow(offset: CGSize(), blur: shadowBlur, color: shadow.cgColor) + + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur + diameter, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.fill(CGRect(origin: CGPoint(x: shadowBlur + diameter / 2.0, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + + context.setFillColor(UIColor.clear.cgColor) + context.setBlendMode(.copy) + + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur + diameter, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.fill(CGRect(origin: CGPoint(x: shadowBlur + diameter / 2.0, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + })?.stretchableImage(withLeftCapWidth: Int(diameter + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0)) +} + +private func generateBubbleImage(foreground: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? { + return generateImage(CGSize(width: diameter + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(foreground.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + })?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0)) +} + +private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? { + return generateImage(CGSize(width: diameter + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(UIColor.white.cgColor) + context.setShadow(offset: CGSize(), blur: shadowBlur, color: shadow.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.setShadow(offset: CGSize(), blur: 1.0, color: shadow.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + context.setFillColor(UIColor.clear.cgColor) + context.setBlendMode(.copy) + context.fillEllipse(in: CGRect(origin: CGPoint(x: shadowBlur, y: shadowBlur), size: CGSize(width: diameter, height: diameter))) + })?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0)) +} + +public final class ReactionContextNode: ASDisplayNode { + private let theme: PresentationTheme + private let items: [ReactionContextItem] + + private let backgroundNode: ASImageNode + private let backgroundShadowNode: ASImageNode + private let backgroundContainerNode: ASDisplayNode + + private let largeCircleNode: ASImageNode + private let largeCircleShadowNode: ASImageNode + + private let smallCircleNode: ASImageNode + private let smallCircleShadowNode: ASImageNode + + private var itemNodes: [ReactionNode] = [] + + private var isExpanded: Bool = false + private var highlightedReaction: String? + private var validLayout: (CGSize, CGRect)? + + public var reactionSelected: ((ReactionGestureItem) -> Void)? + + private let hapticFeedback = HapticFeedback() + + public init(account: Account, theme: PresentationTheme, items: [ReactionContextItem]) { + self.theme = theme + self.items = items + + let shadowBlur: CGFloat = 5.0 + + self.backgroundNode = ASImageNode() + self.backgroundNode.displayWithoutProcessing = true + self.backgroundNode.displaysAsynchronously = false + + self.backgroundShadowNode = ASImageNode() + self.backgroundShadowNode.displayWithoutProcessing = true + self.backgroundShadowNode.displaysAsynchronously = false + + self.backgroundContainerNode = ASDisplayNode() + self.backgroundContainerNode.allowsGroupOpacity = true + + self.largeCircleNode = ASImageNode() + self.largeCircleNode.displayWithoutProcessing = true + self.largeCircleNode.displaysAsynchronously = false + + self.largeCircleShadowNode = ASImageNode() + self.largeCircleShadowNode.displayWithoutProcessing = true + self.largeCircleShadowNode.displaysAsynchronously = false + + self.smallCircleNode = ASImageNode() + self.smallCircleNode.displayWithoutProcessing = true + self.smallCircleNode.displaysAsynchronously = false + + self.smallCircleShadowNode = ASImageNode() + self.smallCircleShadowNode.displayWithoutProcessing = true + self.smallCircleShadowNode.displaysAsynchronously = false + + self.backgroundNode.image = generateBackgroundImage(foreground: theme.contextMenu.backgroundColor.withAlphaComponent(1.0), diameter: 52.0, shadowBlur: shadowBlur) + + self.backgroundShadowNode.image = generateBackgroundShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: 52.0, shadowBlur: shadowBlur) + + self.largeCircleNode.image = generateBubbleImage(foreground: theme.contextMenu.backgroundColor.withAlphaComponent(1.0), diameter: largeCircleSize, shadowBlur: shadowBlur) + self.smallCircleNode.image = generateBubbleImage(foreground: theme.contextMenu.backgroundColor.withAlphaComponent(1.0), diameter: smallCircleSize, shadowBlur: shadowBlur) + + self.largeCircleShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: largeCircleSize, shadowBlur: shadowBlur) + self.smallCircleShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: smallCircleSize, shadowBlur: shadowBlur) + + super.init() + + self.addSubnode(self.smallCircleShadowNode) + self.addSubnode(self.largeCircleShadowNode) + self.addSubnode(self.backgroundShadowNode) + + self.backgroundContainerNode.addSubnode(self.smallCircleNode) + self.backgroundContainerNode.addSubnode(self.largeCircleNode) + self.backgroundContainerNode.addSubnode(self.backgroundNode) + self.addSubnode(self.backgroundContainerNode) + + self.itemNodes = self.items.map { item in + return ReactionNode(account: account, theme: theme, reaction: .reaction(value: item.value, text: item.text, path: item.path), maximizedReactionSize: 30.0 - 18.0, loadFirstFrame: false) + } + self.itemNodes.forEach(self.addSubnode) + } + + override public func didLoad() { + super.didLoad() + + self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:)))) + } + + public func updateLayout(size: CGSize, anchorRect: CGRect, transition: ContainedViewLayoutTransition) { + self.updateLayout(size: size, anchorRect: anchorRect, transition: transition, animateInFromAnchorRect: nil, animateOutToAnchorRect: nil) + } + + private func calculateBackgroundFrame(containerSize: CGSize, anchorRect: CGRect, contentSize: CGSize) -> (CGRect, Bool) { + let sideInset: CGFloat = 12.0 + let backgroundOffset: CGPoint = CGPoint(x: 22.0, y: -7.0) + + var rect: CGRect + let isLeftAligned: Bool + if anchorRect.maxX < containerSize.width - backgroundOffset.x - sideInset { + rect = CGRect(origin: CGPoint(x: anchorRect.maxX - contentSize.width + backgroundOffset.x, y: anchorRect.minY - contentSize.height + backgroundOffset.y), size: contentSize) + isLeftAligned = true + } else { + rect = CGRect(origin: CGPoint(x: anchorRect.minX - backgroundOffset.x, y: anchorRect.minY - contentSize.height + backgroundOffset.y), size: contentSize) + isLeftAligned = false + } + rect.origin.x = max(sideInset, rect.origin.x) + rect.origin.y = max(sideInset, rect.origin.y) + rect.origin.x = min(containerSize.width - contentSize.width - sideInset, rect.origin.x) + return (rect, isLeftAligned) + } + + private func updateLayout(size: CGSize, anchorRect: CGRect, transition: ContainedViewLayoutTransition, animateInFromAnchorRect: CGRect?, animateOutToAnchorRect: CGRect?, animateReactionHighlight: Bool = false) { + self.validLayout = (size, anchorRect) + + let sideInset: CGFloat = 10.0 + let itemSpacing: CGFloat = 6.0 + let minimizedItemSize: CGFloat = 30.0 + let maximizedItemSize: CGFloat = 30.0 - 18.0 + let shadowBlur: CGFloat = 5.0 + let rowHeight: CGFloat = 52.0 + + let columnCount = min(7, self.items.count) + let contentWidth = CGFloat(columnCount) * minimizedItemSize + (CGFloat(columnCount) - 1.0) * itemSpacing + sideInset * 2.0 + let rowCount = self.items.count / columnCount + (self.items.count % columnCount == 0 ? 0 : 1) + let contentHeight = rowHeight * CGFloat(rowCount) + + let (backgroundFrame, isLeftAligned) = self.calculateBackgroundFrame(containerSize: size, anchorRect: anchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)) + + for i in 0 ..< self.items.count { + let row = CGFloat(i / columnCount) + let column = CGFloat(i % columnCount) + + var reactionValue: String? + switch self.itemNodes[i].reaction { + case let .reaction(value, _, _): + reactionValue = value + default: + break + } + + let isHighlighted = reactionValue != nil && self.highlightedReaction == reactionValue + + var itemSize: CGFloat = minimizedItemSize + var itemOffset: CGFloat = 0.0 + if isHighlighted { + let updatedSize = itemSize * 1.15 + itemOffset = (updatedSize - itemSize) / 2.0 + itemSize = updatedSize + } + + transition.updateFrame(node: self.itemNodes[i], frame: CGRect(origin: CGPoint(x: backgroundFrame.minX + sideInset + column * (minimizedItemSize + itemSpacing) - itemOffset, y: backgroundFrame.minY + row * rowHeight + floor((rowHeight - minimizedItemSize) / 2.0) - itemOffset), size: CGSize(width: itemSize, height: itemSize)), beginWithCurrentState: true) + self.itemNodes[i].updateLayout(size: CGSize(width: itemSize, height: itemSize), scale: itemSize / (maximizedItemSize + 18.0), transition: transition, displayText: false) + self.itemNodes[i].updateIsAnimating(true, animated: false) + if row != 0 { + if self.isExpanded { + self.itemNodes[i].alpha = 1.0 + } else { + self.itemNodes[i].alpha = 0.0 + } + } else { + self.itemNodes[i].alpha = 1.0 + } + } + + let isInOverflow = backgroundFrame.maxY > anchorRect.minY + let backgroundAlpha: CGFloat = isInOverflow ? 1.0 : 0.8 + let shadowAlpha: CGFloat = isInOverflow ? 1.0 : 0.0 + transition.updateAlpha(node: self.backgroundContainerNode, alpha: backgroundAlpha) + transition.updateAlpha(node: self.backgroundShadowNode, alpha: shadowAlpha) + transition.updateAlpha(node: self.largeCircleShadowNode, alpha: shadowAlpha) + transition.updateAlpha(node: self.smallCircleShadowNode, alpha: shadowAlpha) + + transition.updateFrame(node: self.backgroundContainerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: size.width, height: size.height))) + + transition.updateFrame(node: self.backgroundNode, frame: backgroundFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur)) + transition.updateFrame(node: self.backgroundShadowNode, frame: backgroundFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur)) + + let largeCircleFrame: CGRect + let smallCircleFrame: CGRect + if isLeftAligned { + largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.maxX + 22.0 - rowHeight + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize)) + smallCircleFrame = CGRect(origin: CGPoint(x: largeCircleFrame.maxX - 3.0, y: largeCircleFrame.maxY + 2.0), size: CGSize(width: smallCircleSize, height: smallCircleSize)) + } else { + largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.minX - 24.0 + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize)) + smallCircleFrame = CGRect(origin: CGPoint(x: largeCircleFrame.minX + 3.0 - smallCircleSize, y: largeCircleFrame.maxY + 2.0), size: CGSize(width: smallCircleSize, height: smallCircleSize)) + } + + transition.updateFrame(node: self.largeCircleNode, frame: largeCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur)) + transition.updateFrame(node: self.largeCircleShadowNode, frame: largeCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur)) + transition.updateFrame(node: self.smallCircleNode, frame: smallCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur)) + transition.updateFrame(node: self.smallCircleShadowNode, frame: smallCircleFrame.insetBy(dx: -shadowBlur, dy: -shadowBlur)) + + if let animateInFromAnchorRect = animateInFromAnchorRect { + let springDuration: Double = 0.42 + let springDamping: CGFloat = 104.0 + + let sourceBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, anchorRect: animateInFromAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0 + + self.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: sourceBackgroundFrame.minX - backgroundFrame.minX, y: sourceBackgroundFrame.minY - backgroundFrame.minY)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true) + } else if let animateOutToAnchorRect = animateOutToAnchorRect { + let targetBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, anchorRect: animateOutToAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0 + + self.layer.animatePosition(from: CGPoint(), to: CGPoint(x: targetBackgroundFrame.minX - backgroundFrame.minX, y: targetBackgroundFrame.minY - backgroundFrame.minY), duration: 0.2, removeOnCompletion: false, additive: true) + } + } + + public func animateIn(from sourceAnchorRect: CGRect) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + + if let (size, anchorRect) = self.validLayout { + self.updateLayout(size: size, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: sourceAnchorRect, animateOutToAnchorRect: nil) + } + } + + public func animateOut(to targetAnchorRect: CGRect?, animatingOutToReaction: Bool) { + for itemNode in self.itemNodes { + self.backgroundNode.layer.animateAlpha(from: self.backgroundNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.backgroundShadowNode.layer.animateAlpha(from: self.backgroundShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.largeCircleNode.layer.animateAlpha(from: self.largeCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.largeCircleShadowNode.layer.animateAlpha(from: self.largeCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.smallCircleNode.layer.animateAlpha(from: self.smallCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.smallCircleShadowNode.layer.animateAlpha(from: self.smallCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + itemNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) + } + + if let targetAnchorRect = targetAnchorRect, let (size, anchorRect) = self.validLayout { + self.updateLayout(size: size, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: nil, animateOutToAnchorRect: targetAnchorRect) + } + } + + public func animateOutToReaction(value: String, targetNode: ASImageNode, hideNode: Bool, completion: @escaping () -> Void) { + for itemNode in self.itemNodes { + switch itemNode.reaction { + case let .reaction(itemValue, _, _): + if itemValue == value { + if let snapshotView = itemNode.view.snapshotContentTree(keepTransform: true) { + let targetSnapshotView = UIImageView() + targetSnapshotView.image = targetNode.image + targetSnapshotView.frame = self.view.convert(targetNode.bounds, from: targetNode.view) + itemNode.isHidden = true + self.view.addSubview(targetSnapshotView) + self.view.addSubview(snapshotView) + + var completedTarget = false + let intermediateCompletion: () -> Void = { + if completedTarget { + completion() + } + } + + let targetPosition = self.view.convert(targetNode.bounds.center, from: targetNode.view) + let duration: Double = 0.3 + if hideNode { + targetNode.isHidden = true + } + + snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25, removeOnCompletion: false) + targetSnapshotView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + targetSnapshotView.layer.animateScale(from: snapshotView.bounds.width / targetSnapshotView.bounds.width, to: 0.5, duration: 0.3, removeOnCompletion: false) + + let sourcePoint = snapshotView.center + let midPoint = CGPoint(x: (sourcePoint.x + targetPosition.x) / 2.0, y: sourcePoint.y - 30.0) + + let x1 = sourcePoint.x + let y1 = sourcePoint.y + let x2 = midPoint.x + let y2 = midPoint.y + let x3 = targetPosition.x + let y3 = targetPosition.y + + let a = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / ((x1 - x2) * (x1 - x3) * (x2 - x3)) + let b = (x1 * x1 * (y2 - y3) + x3 * x3 * (y1 - y2) + x2 * x2 * (y3 - y1)) / ((x1 - x2) * (x1 - x3) * (x2 - x3)) + let c = (x2 * x2 * (x3 * y1 - x1 * y3) + x2 * (x1 * x1 * y3 - x3 * x3 * y1) + x1 * x3 * (x3 - x1) * y2) / ((x1 - x2) * (x1 - x3) * (x2 - x3)) + + var keyframes: [AnyObject] = [] + for i in 0 ..< 10 { + let k = CGFloat(i) / CGFloat(10 - 1) + let x = sourcePoint.x * (1.0 - k) + targetPosition.x * k + let y = a * x * x + b * x + c + keyframes.append(NSValue(cgPoint: CGPoint(x: x, y: y))) + } + + snapshotView.layer.animateKeyframes(values: keyframes, duration: 0.3, keyPath: "position", removeOnCompletion: false, completion: { [weak self] _ in + if let strongSelf = self { + strongSelf.hapticFeedback.tap() + } + completedTarget = true + if hideNode { + targetNode.isHidden = false + targetNode.layer.animateSpring(from: 0.5 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: duration, initialVelocity: 0.0, damping: 90.0) + } + intermediateCompletion() + }) + targetSnapshotView.layer.animateKeyframes(values: keyframes, duration: 0.3, keyPath: "position", removeOnCompletion: false) + + snapshotView.layer.animateScale(from: 1.0, to: (targetSnapshotView.bounds.width * 0.5) / snapshotView.bounds.width, duration: 0.3, removeOnCompletion: false) + } else { + completion() + } + return + } + default: + break + } + } + completion() + } + + override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + for itemNode in self.itemNodes { + if itemNode.frame.contains(point) { + return self.view + } + } + return nil + } + + @objc private func tapGesture(_ recognizer: UITapGestureRecognizer) { + if case .ended = recognizer.state { + let point = recognizer.location(in: self.view) + if let reaction = self.reaction(at: point) { + self.reactionSelected?(reaction) + } + } + } + + public func reaction(at point: CGPoint) -> ReactionGestureItem? { + for itemNode in self.itemNodes { + if itemNode.frame.contains(point) { + return itemNode.reaction + } + } + for itemNode in self.itemNodes { + if itemNode.frame.insetBy(dx: -8.0, dy: -8.0).contains(point) { + return itemNode.reaction + } + } + return nil + } + + public func setHighlightedReaction(_ value: String?) { + self.highlightedReaction = value + if let (size, anchorRect) = self.validLayout { + self.updateLayout(size: size, anchorRect: anchorRect, transition: .animated(duration: 0.18, curve: .easeInOut), animateInFromAnchorRect: nil, animateOutToAnchorRect: nil, animateReactionHighlight: true) + } + } +} diff --git a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift index 5a941f316c..9b058db8ca 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionGestureItem.swift @@ -3,6 +3,6 @@ import Postbox import TelegramCore public enum ReactionGestureItem { - case reaction(value: String, text: String, file: TelegramMediaFile) + case reaction(value: String, text: String, path: String) case reply } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift index 1694dca4de..d8d0a005a3 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -4,6 +4,7 @@ import AnimationUI import Display import Postbox import TelegramCore +import TelegramPresentationData private func generateBubbleImage(foreground: UIColor, diameter: CGFloat, shadowBlur: CGFloat) -> UIImage? { return generateImage(CGSize(width: diameter + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in @@ -27,41 +28,85 @@ private func generateBubbleShadowImage(shadow: UIColor, diameter: CGFloat, shado })?.stretchableImage(withLeftCapWidth: Int(diameter / 2.0 + shadowBlur / 2.0), topCapHeight: Int(diameter / 2.0 + shadowBlur / 2.0)) } -private final class ReactionNode: ASDisplayNode { +private let font = Font.medium(13.0) + +final class ReactionNode: ASDisplayNode { let reaction: ReactionGestureItem + private let textBackgroundNode: ASImageNode + private let textNode: ImmediateTextNode private let animationNode: AnimatedStickerNode private let imageNode: ASImageNode var isMaximized: Bool? private let intrinsicSize: CGSize private let intrinsicOffset: CGPoint - init(account: Account, reaction: ReactionGestureItem, maximizedReactionSize: CGFloat) { + init(account: Account, theme: PresentationTheme, reaction: ReactionGestureItem, maximizedReactionSize: CGFloat, loadFirstFrame: Bool) { self.reaction = reaction + self.textBackgroundNode = ASImageNode() + self.textBackgroundNode.displaysAsynchronously = false + self.textBackgroundNode.displayWithoutProcessing = true + self.textBackgroundNode.image = generateStretchableFilledCircleImage(diameter: 20.0, color: theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillFloating.withAlphaComponent(0.8)) + self.textBackgroundNode.alpha = 0.0 + + self.textNode = ImmediateTextNode() + self.textNode.displaysAsynchronously = false + self.textNode.isUserInteractionEnabled = false + + let reactionText: String + switch reaction { + case let .reaction(_, text, _): + reactionText = text + case .reply: + reactionText = "Reply" + } + + self.textNode.attributedText = NSAttributedString(string: reactionText, font: font, textColor: theme.chat.serviceMessage.dateTextColor.withWallpaper) + let textSize = self.textNode.updateLayout(CGSize(width: 200.0, height: 100.0)) + let textBackgroundSize = CGSize(width: textSize.width + 12.0, height: 20.0) + let textBackgroundFrame = CGRect(origin: CGPoint(), size: textBackgroundSize) + let textFrame = CGRect(origin: CGPoint(x: floor((textBackgroundFrame.width - textSize.width) / 2.0), y: floor((textBackgroundFrame.height - textSize.height) / 2.0)), size: textSize) + self.textBackgroundNode.frame = textBackgroundFrame + self.textNode.frame = textFrame + self.textNode.alpha = 0.0 + self.animationNode = AnimatedStickerNode() - self.animationNode.automaticallyLoadFirstFrame = true + self.animationNode.automaticallyLoadFirstFrame = loadFirstFrame self.animationNode.playToCompletionOnStop = true - //self.animationNode.backgroundColor = .lightGray var intrinsicSize = CGSize(width: maximizedReactionSize + 18.0, height: maximizedReactionSize + 18.0) self.imageNode = ASImageNode() switch reaction { - case let .reaction(value, _, file): + case let .reaction(value, _, path): switch value { + case "😒": + intrinsicSize.width *= 1.7 + intrinsicSize.height *= 1.7 + self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) case "😳": - intrinsicSize.width += 8.0 - intrinsicSize.height += 8.0 - self.intrinsicOffset = CGPoint(x: 0.0, y: -4.0) + intrinsicSize.width *= 1.15 + intrinsicSize.height *= 1.15 + self.intrinsicOffset = CGPoint(x: 0.0, y: -0.05 * intrinsicSize.width) + case "😂": + intrinsicSize.width *= 1.2 + intrinsicSize.height *= 1.2 + self.intrinsicOffset = CGPoint(x: 0.0 * intrinsicSize.width, y: 0.0 * intrinsicSize.width) case "👍": - intrinsicSize.width += 20.0 - intrinsicSize.height += 20.0 - self.intrinsicOffset = CGPoint(x: 0.0, y: 4.0) + intrinsicSize.width *= 1.256 + intrinsicSize.height *= 1.256 + self.intrinsicOffset = CGPoint(x: 0.0, y: 0.05 * intrinsicSize.width) default: self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) } - self.animationNode.visibility = true - self.animationNode.setup(account: account, resource: file.resource, width: Int(intrinsicSize.width) * 2, height: Int(intrinsicSize.height) * 2, mode: .direct) + + var renderSize: CGSize = CGSize(width: intrinsicSize.width * 2.0, height: intrinsicSize.height * 2.0) + if UIScreen.main.scale.isEqual(to: 3.0) { + if maximizedReactionSize < 40.0 { + renderSize = CGSize(width: intrinsicSize.width * 2.5, height: intrinsicSize.height * 2.5) + } + } + self.animationNode.setup(account: account, resource: .localFile(path), width: Int(renderSize.width), height: Int(renderSize.height), mode: .direct) case .reply: self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) self.imageNode.image = UIImage(named: "Chat/Context Menu/ReactionReply", in: Bundle(for: ReactionNode.self), compatibleWith: nil) @@ -71,7 +116,8 @@ private final class ReactionNode: ASDisplayNode { super.init() - //self.backgroundColor = .green + self.textBackgroundNode.addSubnode(self.textNode) + self.addSubnode(self.textBackgroundNode) self.addSubnode(self.animationNode) self.addSubnode(self.imageNode) @@ -80,11 +126,17 @@ private final class ReactionNode: ASDisplayNode { self.imageNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicSize) } - func updateLayout(size: CGSize, scale: CGFloat, transition: ContainedViewLayoutTransition) { + func updateLayout(size: CGSize, scale: CGFloat, transition: ContainedViewLayoutTransition, displayText: Bool) { transition.updatePosition(node: self.animationNode, position: CGPoint(x: size.width / 2.0 + self.intrinsicOffset.x * scale, y: size.height / 2.0 + self.intrinsicOffset.y * scale), beginWithCurrentState: true) transition.updateTransformScale(node: self.animationNode, scale: scale, beginWithCurrentState: true) transition.updatePosition(node: self.imageNode, position: CGPoint(x: size.width / 2.0 + self.intrinsicOffset.x * scale, y: size.height / 2.0 + self.intrinsicOffset.y * scale), beginWithCurrentState: true) transition.updateTransformScale(node: self.imageNode, scale: scale, beginWithCurrentState: true) + + transition.updatePosition(node: self.textBackgroundNode, position: CGPoint(x: size.width / 2.0, y: displayText ? -24.0 : (size.height / 2.0)), beginWithCurrentState: true) + transition.updateTransformScale(node: self.textBackgroundNode, scale: displayText ? 1.0 : 0.1, beginWithCurrentState: true) + + transition.updateAlpha(node: self.textBackgroundNode, alpha: displayText ? 1.0 : 0.0, beginWithCurrentState: true) + transition.updateAlpha(node: self.textNode, alpha: displayText ? 1.0 : 0.0, beginWithCurrentState: true) } func updateIsAnimating(_ isAnimating: Bool, animated: Bool) { @@ -98,6 +150,7 @@ private final class ReactionNode: ASDisplayNode { final class ReactionSelectionNode: ASDisplayNode { private let account: Account + private let theme: PresentationTheme private let reactions: [ReactionGestureItem] private let backgroundNode: ASImageNode @@ -113,8 +166,11 @@ final class ReactionSelectionNode: ASDisplayNode { private var maximizedReactionSize: CGFloat = 60.0 private var smallCircleSize: CGFloat = 8.0 - public init(account: Account, reactions: [ReactionGestureItem]) { + private var isRightAligned: Bool = false + + public init(account: Account, theme: PresentationTheme, reactions: [ReactionGestureItem]) { self.account = account + self.theme = theme self.reactions = reactions self.backgroundNode = ASImageNode() @@ -153,12 +209,7 @@ final class ReactionSelectionNode: ASDisplayNode { let initialAnchorX = startingPoint.x if isInitial && self.reactionNodes.isEmpty { - //let contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing - - //contentWidth = CGFloat(self.reactionNodes.count - 1) * X + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * 0.2 * X - // contentWidth - maximizedReactionSize = CGFloat(self.reactionNodes.count - 1) * X + CGFloat(self.reactionNodes.count + 1) * 0.2 * X - // (contentWidth - maximizedReactionSize) / (CGFloat(self.reactionNodes.count - 1) + CGFloat(self.reactionNodes.count + 1) * 0.2) = X - let availableContentWidth = max(100.0, initialAnchorX) + let availableContentWidth = constrainedSize.width //max(100.0, initialAnchorX) var minimizedReactionSize = (availableContentWidth - self.maximizedReactionSize) / (CGFloat(self.reactions.count - 1) + CGFloat(self.reactions.count + 1) * 0.2) minimizedReactionSize = max(16.0, floor(minimizedReactionSize)) minimizedReactionSize = min(30.0, minimizedReactionSize) @@ -177,7 +228,7 @@ final class ReactionSelectionNode: ASDisplayNode { } self.reactionNodes = self.reactions.map { reaction -> ReactionNode in - return ReactionNode(account: self.account, reaction: reaction, maximizedReactionSize: self.maximizedReactionSize) + return ReactionNode(account: self.account, theme: self.theme, reaction: reaction, maximizedReactionSize: self.maximizedReactionSize, loadFirstFrame: true) } self.reactionNodes.forEach(self.addSubnode(_:)) } @@ -190,8 +241,15 @@ final class ReactionSelectionNode: ASDisplayNode { let contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing var backgroundFrame = CGRect(origin: CGPoint(x: -shadowBlur, y: -shadowBlur), size: CGSize(width: contentWidth + shadowBlur * 2.0, height: backgroundHeight + shadowBlur * 2.0)) - backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - contentWidth + backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0) + var isRightAligned = false + if initialAnchorX > constrainedSize.width / 2.0 { + isRightAligned = true + backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - contentWidth + backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0) + } else { + backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0) + } + self.isRightAligned = isRightAligned self.backgroundNode.frame = backgroundFrame self.backgroundShadowNode.frame = backgroundFrame @@ -200,7 +258,7 @@ final class ReactionSelectionNode: ASDisplayNode { let anchorX = max(anchorMinX, min(anchorMaxX, offsetFromStart)) var reactionX: CGFloat = backgroundFrame.minX + shadowBlur + reactionSpacing - if offsetFromStart > backgroundFrame.maxX - shadowBlur { + if offsetFromStart > backgroundFrame.maxX - shadowBlur || offsetFromStart < backgroundFrame.minX { self.hasSelectedNode = false } else { self.hasSelectedNode = true @@ -209,8 +267,12 @@ final class ReactionSelectionNode: ASDisplayNode { var maximizedIndex = Int(((anchorX - anchorMinX) / (anchorMaxX - anchorMinX)) * CGFloat(self.reactionNodes.count)) maximizedIndex = max(0, min(self.reactionNodes.count - 1, maximizedIndex)) - for i in 0 ..< self.reactionNodes.count { + for iterationIndex in 0 ..< self.reactionNodes.count { + var i = iterationIndex let isMaximized = i == maximizedIndex + if !isRightAligned { + i = self.reactionNodes.count - 1 - i + } let reactionSize: CGFloat if isMaximized { @@ -239,7 +301,7 @@ final class ReactionSelectionNode: ASDisplayNode { reactionFrame.origin.x -= 9.0 reactionFrame.size.width += 18.0 } - self.reactionNodes[i].updateLayout(size: reactionFrame.size, scale: reactionFrame.size.width / (maximizedReactionSize + 18.0), transition: transition) + self.reactionNodes[i].updateLayout(size: reactionFrame.size, scale: reactionFrame.size.width / (maximizedReactionSize + 18.0), transition: transition, displayText: isMaximized) transition.updateFrame(node: self.reactionNodes[i], frame: reactionFrame, beginWithCurrentState: true) @@ -250,7 +312,7 @@ final class ReactionSelectionNode: ASDisplayNode { self.bubbleNodes[1].0.frame = mainBubbleFrame self.bubbleNodes[1].1.frame = mainBubbleFrame - let secondaryBubbleFrame = CGRect(origin: CGPoint(x: mainBubbleFrame.midX - floor(self.smallCircleSize * 0.88) - (self.smallCircleSize + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + floor(self.smallCircleSize * 4.0 / 3.0) - (self.smallCircleSize + shadowBlur * 2.0) / 2.0), size: CGSize(width: self.smallCircleSize + shadowBlur * 2.0, height: self.smallCircleSize + shadowBlur * 2.0)) + let secondaryBubbleFrame = CGRect(origin: CGPoint(x: mainBubbleFrame.midX - 10.0 - (self.smallCircleSize + shadowBlur * 2.0) / 2.0, y: mainBubbleFrame.midY + 10.0 - (self.smallCircleSize + shadowBlur * 2.0) / 2.0), size: CGSize(width: self.smallCircleSize + shadowBlur * 2.0, height: self.smallCircleSize + shadowBlur * 2.0)) self.bubbleNodes[0].0.frame = secondaryBubbleFrame self.bubbleNodes[0].1.frame = secondaryBubbleFrame } @@ -262,15 +324,25 @@ final class ReactionSelectionNode: ASDisplayNode { self.bubbleNodes[0].0.layer.animateScale(from: 0.01, to: 1.0, duration: 0.11, delay: 0.05, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) self.bubbleNodes[0].1.layer.animateScale(from: 0.01, to: 1.0, duration: 0.11, delay: 0.05, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) - let backgroundOffset = CGPoint(x: (self.backgroundNode.frame.width - shadowBlur) / 2.0 - 42.0, y: (self.backgroundNode.frame.height - shadowBlur) / 2.0) + let backgroundOffset: CGPoint + if self.isRightAligned { + backgroundOffset = CGPoint(x: (self.backgroundNode.frame.width - shadowBlur) / 2.0 - 42.0, y: (self.backgroundNode.frame.height - shadowBlur) / 2.0) + } else { + backgroundOffset = CGPoint(x: -(self.backgroundNode.frame.width - shadowBlur) / 2.0 + 42.0, y: (self.backgroundNode.frame.height - shadowBlur) / 2.0) + } let damping: CGFloat = 100.0 for i in 0 ..< self.reactionNodes.count { let animationOffset: Double = 1.0 - Double(i) / Double(self.reactionNodes.count - 1) - var nodeOffset = CGPoint(x: self.reactionNodes[i].frame.minX - (self.backgroundNode.frame.maxX - shadowBlur) / 2.0 - 42.0, y: self.reactionNodes[i].frame.minY - self.backgroundNode.frame.maxY - shadowBlur) + var nodeOffset: CGPoint + if self.isRightAligned { + nodeOffset = CGPoint(x: self.reactionNodes[i].frame.minX - (self.backgroundNode.frame.maxX - shadowBlur) / 2.0 - 42.0, y: self.reactionNodes[i].frame.minY - self.backgroundNode.frame.maxY - shadowBlur) + } else { + nodeOffset = CGPoint(x: self.reactionNodes[i].frame.minX - (self.backgroundNode.frame.minX + shadowBlur) / 2.0 - 42.0, y: self.reactionNodes[i].frame.minY - self.backgroundNode.frame.maxY - shadowBlur) + } nodeOffset.x = -nodeOffset.x nodeOffset.y = 30.0 - self.reactionNodes[i].layer.animateSpring(from: 0.01 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.5 + animationOffset * 0.08, initialVelocity: 0.0, damping: damping) + self.reactionNodes[i].layer.animateSpring(from: 0.01 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.5 + animationOffset * 0.28, initialVelocity: 0.0, damping: damping) self.reactionNodes[i].layer.animateSpring(from: NSValue(cgPoint: nodeOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: 0.5, initialVelocity: 0.0, damping: damping, additive: true) } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift index 8a0f78779a..02719c5884 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionParentNode.swift @@ -3,17 +3,20 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData public final class ReactionSelectionParentNode: ASDisplayNode { private let account: Account + private let theme: PresentationTheme private var currentNode: ReactionSelectionNode? private var currentLocation: (CGPoint, CGFloat)? private var validLayout: (size: CGSize, insets: UIEdgeInsets)? - public init(account: Account) { + public init(account: Account, theme: PresentationTheme) { self.account = account + self.theme = theme super.init() } @@ -24,7 +27,7 @@ public final class ReactionSelectionParentNode: ASDisplayNode { self.currentNode = nil } - let reactionNode = ReactionSelectionNode(account: self.account, reactions: reactions) + let reactionNode = ReactionSelectionNode(account: self.account, theme: self.theme, reactions: reactions) self.addSubnode(reactionNode) self.currentNode = reactionNode self.currentLocation = (point, point.x) diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift index d8f5105cf4..cab64f5a93 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift @@ -108,7 +108,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode { } } let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(account: account, resource: stickerItem.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(account: account, resource: .resource(stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start()) } else { diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift index d7ee4cdc8c..9fc4f6d0e6 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift @@ -91,7 +91,7 @@ private final class StickerPreviewPeekContentNode: ASDisplayNode, PeekController let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 400.0, height: 400.0)) - self.animationNode?.setup(account: account, resource: item.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + self.animationNode?.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) self.animationNode?.visibility = true self.animationNode?.addSubnode(self.textNode) } else { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Report.imageset/ic_lt_report.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Report.imageset/ic_lt_report.pdf index e64504330fd2a86e8562113fbe81083f67a7a2c8..baf196a44059ffa95da217b175f9af9f2c307ecf 100644 GIT binary patch delta 681 zcmbQF{9ArPKz(e`?cBo#Jb$i>#4K2)IdjtAxtyP_GO~zhJ`my9WFIieN;5CvfZe3> znwk8&E;U;m4QiS3((a>>x1Z_kx!%50D>^N;HF>Xu7eI}XE_y<1x|D;@@$E`4(H4v<$)7p5HC`*275go> zRyn(v2bl|2zMPb|D}S}}?D`204nDv8HdAo6D7$7wvsnduM)gz9^C!k z`}T`%?|nAxbvmA?6}O;!3QJnm=d*K#6@KqeDwE(XO+U!Fz(XP8cKjFbT`Ip8o*{lR7YTEv=A{&u6s0ESf>`-USzM+H z1_~hB*vJ4TWHfm_pXlZUW<4GbLjwZ~LnC98$cb|+Q$KC6iHH{W*pABEnNeHua@V@Bss?%iFZ|};0r?bNJcO9sa z=eN5Z{X6H#T_5Sd-#hlZZ$D`lJnz|?Ubp$eZhQ9272I(9TIQfP`S$loE2rk}&Ak52 z=e&1R`UmStrAD?!-nC1g#~xgH^J>=qn)R=Yiz4Iq+T5=0erKdp|7F6d?-#?iC(M02 zC0yPuk?-O%flXEO?Pi2uw!3=a{o;EWOmnV2pP^D>vrt;*9aHRyPZP|3H zL+1?~;jPVqyj=$al}t*$7QRTkcJqa5o{Eu|;rrR)%bBDL7tIt*T{yefTuCYa&B_a> zo}N7y)0$mnxFK?9*@4_mS38zJW{%ypYx%R%*G5VnpAT5BVh;YZQ16iiPv7F!%a0<= zzRxL}H#2Hi@|2Gv%QdDh|0mx6{|F-^N z-1hx%pRd=Kd9~i`)%UL%_A3q~%Pdl|oqr?NC~V7<$Lx1L{=4&S`=5LNwrv03b=1Lm zav!4J^=GBZoJRAlVh6Y9^CKi+b^VaK_7#Nr-7=VC6o&pz`VPIfkVuUVcY;I~X zc@>{(y@io6x}1Tf5f=5>)L9y!>oqnvz%b9)!q^f+orMKhOaR%T#+GI#ljHd9;u8&1 z%+r!BOq0_LED{Y;fvMZjEXlyaILXjF$=D#x)Q-!Bpb~{x1v@*g;*!Lol8U0#G%gch NIB}_}y863u0RSWOx1az3 diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 9d97d9bba8..f18def73d2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -43,6 +43,7 @@ import PeerAvatarGalleryUI import PeerInfoUI import RaiseToListen import UrlHandling +import ReactionSelectionNode public enum ChatControllerPeekActions { case standard @@ -523,40 +524,49 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G break } } - let _ = contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: strongSelf.presentationInterfaceState, context: strongSelf.context, messages: updatedMessages, controllerInteraction: strongSelf.controllerInteraction, selectAll: selectAll, interfaceInteraction: strongSelf.interfaceInteraction).start(next: { actions in + let _ = combineLatest(queue: .mainQueue(), contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: strongSelf.presentationInterfaceState, context: strongSelf.context, messages: updatedMessages, controllerInteraction: strongSelf.controllerInteraction, selectAll: selectAll, interfaceInteraction: strongSelf.interfaceInteraction), loadedStickerPack(postbox: strongSelf.context.account.postbox, network: strongSelf.context.account.network, reference: .animatedEmoji, forceActualized: false)).start(next: { actions, animatedEmojiStickers in guard let strongSelf = self, !actions.isEmpty else { return } - var actions = actions - if ![Namespaces.Message.ScheduledCloud, Namespaces.Message.ScheduledLocal].contains(message.id.namespace) { - actions.insert(.action(ContextMenuActionItem(text: "Reaction", icon: { _ in nil }, action: { _, f in - guard let strongSelf = self else { - return - } - let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme) - var items: [ActionSheetItem] = [] - let emojis = ["👍", "😊", "🤔", "😔", "❤️"] - for emoji in emojis { - items.append(ActionSheetButtonItem(title: "\(emoji)", color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - guard let strongSelf = self else { - return - } - let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: updatedMessages[0].id, reaction: emoji).start() - })) - } - actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - }) - ])]) - strongSelf.chatDisplayNode.dismissInput() - strongSelf.present(actionSheet, in: .window(.root)) - f(.dismissWithoutContent) - })), at: 0) + let reactions: [(String, String, String)] = [ + ("😒", "Sad", "sad"), + ("😳", "Surprised", "surprised"), + ("😂", "Fun", "lol"), + ("👍", "Like", "thumbsup"), + ("❤", "Love", "heart"), + ] + + var reactionItems: [ReactionContextItem] = [] + for (value, text, name) in reactions { + if let path = frameworkBundle.path(forResource: name, ofType: "tgs", inDirectory: "BuiltinReactions") { + reactionItems.append(ReactionContextItem(value: value, text: text, path: path)) + } } - let controller = ContextController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, recognizer: recognizer) + let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: reactionItems, recognizer: recognizer) strongSelf.currentContextController = controller + controller.reactionSelected = { [weak controller] value in + guard let strongSelf = self, let message = updatedMessages.first else { + return + } + strongSelf.chatDisplayNode.historyNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ChatMessageItemView, let item = itemNode.item { + if item.message.id == message.id { + itemNode.awaitingAppliedReaction = (value, { [weak itemNode] in + guard let controller = controller else { + return + } + if let itemNode = itemNode, let (targetNode, count) = itemNode.targetReactionNode(value: value) { + controller.dismissWithReaction(value: value, into: targetNode, hideNode: count == 1, completion: { + }) + } else { + controller.dismiss() + } + }) + } + } + } + let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: message.id, reaction: value).start() + } strongSelf.window?.presentInGlobalOverlay(controller) }) } diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 67793a7438..3eca14e4cf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -212,7 +212,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.historyNodeContainer = ASDisplayNode() self.historyNodeContainer.addSubnode(self.historyNode) - self.reactionContainerNode = ReactionSelectionParentNode(account: context.account) + self.reactionContainerNode = ReactionSelectionParentNode(account: context.account, theme: chatPresentationInterfaceState.theme) self.historyNodeContainer.addSubnode(self.reactionContainerNode) self.loadingNode = ChatLoadingNode(theme: self.chatPresentationInterfaceState.theme, chatWallpaper: self.chatPresentationInterfaceState.chatWallpaper) diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift index 596232963e..1ea930f970 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift @@ -592,7 +592,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: } if !data.messageActions.options.intersection([.deleteLocally, .deleteGlobally]).isEmpty && isAction { actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_ContextMenuDelete, textColor: .destructive, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.primaryTextColor) + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor) }, action: { controller, f in interfaceInteraction.deleteMessages(messages, controller, f) }))) @@ -654,7 +654,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: if !data.messageActions.options.intersection([.deleteLocally, .deleteGlobally]).isEmpty && !isAction { let title = message.flags.isSending ? chatPresentationInterfaceState.strings.Conversation_ContextMenuCancelSending : chatPresentationInterfaceState.strings.Conversation_ContextMenuDelete actions.append(.action(ContextMenuActionItem(text: title, textColor: .destructive, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.primaryTextColor) + return generateTintedImage(image: UIImage(bundleImageName: message.flags.isSending ? "Chat/Context Menu/Clear" : "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor) }, action: { controller, f in interfaceInteraction.deleteMessages(selectAll ? messages : [message], controller, f) }))) diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift index d1b0ab25f5..8fa2250297 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift @@ -299,7 +299,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { self.didSetUpAnimationNode = true let dimensions = item.stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(account: item.account, resource: item.stickerItem.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(account: item.account, resource: .resource(item.stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index 6314859f33..762479af04 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -177,7 +177,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.animatedStickerNode = animatedStickerNode animatedStickerNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) self.addSubnode(animatedStickerNode) - animatedStickerNode.setup(account: account, resource: resource, width: 80, height: 80, mode: .cached) + animatedStickerNode.setup(account: account, resource: .resource(resource), width: 80, height: 80, mode: .cached) } animatedStickerNode.visibility = self.visibilityStatus && loopAnimatedStickers if let animatedStickerNode = self.animatedStickerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 9c1ba28f25..bc06ed281d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -304,7 +304,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if let file = file { let dimensions = file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedSize = isEmoji ? dimensions.aspectFilled(CGSize(width: 384.0, height: 384.0)) : dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - self.animationNode.setup(account: item.context.account, resource: file.resource, fitzModifier: fitzModifier, width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) + self.animationNode.setup(account: item.context.account, resource: .resource(file.resource), fitzModifier: fitzModifier, width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift index 9c64baca75..c1ac9f8340 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift @@ -108,6 +108,8 @@ class ChatMessageBubbleContentNode: ASDisplayNode { var item: ChatMessageBubbleContentItem? + var updateIsTextSelectionActive: ((Bool) -> Void)? + required override init() { super.init() } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 6326abbc23..32e0f85787 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -186,8 +186,6 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode private var tapRecognizer: TapLongTapOrDoubleTapGestureRecognizer? private var reactionRecognizer: ReactionSwipeGestureRecognizer? - private var awaitingAppliedReaction: String? - override var visibility: ListViewItemNodeVisibility { didSet { if self.visibility != oldValue { @@ -419,24 +417,24 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } - let reactions: [(String, String)] = [ - ("😒", "Sad"), - ("😳", "Surprised"), - //("🥳", "Fun"), - ("👍", "Like"), - ("❤", "Love"), + let reactions: [(String, String, String)] = [ + ("😒", "Sad", "sad"), + ("😳", "Surprised", "surprised"), + ("😂", "Fun", "lol"), + ("👍", "Like", "thumbsup"), + ("❤", "Love", "heart"), ] - var result: [ReactionGestureItem] = [] - for (value, text) in reactions { - if let file = item.associatedData.animatedEmojiStickers[value]?.file { - result.append(.reaction(value: value, text: text, file: file)) + var reactionItems: [ReactionGestureItem] = [] + for (value, text, name) in reactions { + if let path = frameworkBundle.path(forResource: name, ofType: "tgs", inDirectory: "BuiltinReactions") { + reactionItems.append(.reaction(value: value, text: text, path: path)) } } if item.controllerInteraction.canSetupReply(item.message) { - result.append(.reply) + reactionItems.append(.reply) } - return result + return reactionItems } reactionRecognizer.getReactionContainer = { [weak self] in return self?.item?.controllerInteraction.reactionContainerNode() @@ -505,7 +503,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode if let item = strongSelf.item, let reaction = reaction { switch reaction { case let .reaction(value, _, _): - strongSelf.awaitingAppliedReaction = value + strongSelf.awaitingAppliedReaction = (value, {}) item.controllerInteraction.updateMessageReaction(item.message.id, value) case .reply: strongSelf.reactionRecognizer?.complete(into: nil, hideTarget: false) @@ -1763,6 +1761,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode strongSelf.contextSourceNode.contentNode.addSubnode(contentNode) contentNode.visibility = strongSelf.visibility + contentNode.updateIsTextSelectionActive = { [weak strongSelf] value in + strongSelf?.contextSourceNode.updateDistractionFreeMode?(value) + } contentNode.updateIsExtractedToContextPreview(strongSelf.contextSourceNode.isExtractedToContextPreview) } } @@ -1945,7 +1946,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode strongSelf.updateSearchTextHighlightState() - if let awaitingAppliedReaction = strongSelf.awaitingAppliedReaction { + if let (awaitingAppliedReaction, f) = strongSelf.awaitingAppliedReaction { var bounds = strongSelf.bounds let offset = bounds.origin.x bounds.origin.x = 0.0 @@ -1972,6 +1973,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } strongSelf.reactionRecognizer?.complete(into: targetNode, hideTarget: hideTarget) + f() } } @@ -2801,4 +2803,13 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode override func addAccessoryItemNode(_ accessoryItemNode: ListViewAccessoryItemNode) { self.contextSourceNode.contentNode.addSubnode(accessoryItemNode) } + + override func targetReactionNode(value: String) -> (ASImageNode, Int)? { + for contentNode in self.contentNodes { + if let (reactionNode, count) = contentNode.reactionTargetNode(value: value) { + return (reactionNode, count) + } + } + return nil + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 8dca768f0c..84061192a0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -715,7 +715,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio strongSelf.animatedStickerNode = animatedStickerNode let dimensions = updatedAnimatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - animatedStickerNode.setup(account: context.account, resource: updatedAnimatedStickerFile.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animatedStickerNode.setup(account: context.account, resource: .resource(updatedAnimatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) strongSelf.insertSubnode(animatedStickerNode, aboveSubnode: strongSelf.imageNode) animatedStickerNode.visibility = strongSelf.visibility } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift index d61b357811..592d3a429e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift @@ -611,6 +611,8 @@ public class ChatMessageItemView: ListViewItemNode { var item: ChatMessageItem? var accessibilityData: ChatMessageAccessibilityData? + var awaitingAppliedReaction: (String, () -> Void)? + public required convenience init() { self.init(layerBacked: false) } @@ -788,4 +790,8 @@ public class ChatMessageItemView: ListViewItemNode { } } } + + func targetReactionNode(value: String) -> (ASImageNode, Int)? { + return nil + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 2168a835ff..37b0c219c8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -521,7 +521,9 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { override func updateIsExtractedToContextPreview(_ value: Bool) { if value { if self.textSelectionNode == nil, let item = self.item, let rootNode = item.controllerInteraction.chatControllerNode() { - let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: item.presentationData.theme.theme.list.itemAccentColor.withAlphaComponent(0.5), knob: item.presentationData.theme.theme.list.itemAccentColor), textNode: self.textNode, present: { [weak self] c, a in + let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: item.presentationData.theme.theme.list.itemAccentColor.withAlphaComponent(0.5), knob: item.presentationData.theme.theme.list.itemAccentColor), textNode: self.textNode, updateIsActive: { [weak self] value in + self?.updateIsTextSelectionActive?(value) + }, present: { [weak self] c, a in self?.item?.controllerInteraction.presentGlobalOverlayController(c, a) }, rootNode: rootNode, performAction: { [weak self] text, action in guard let strongSelf = self, let item = strongSelf.item else { @@ -535,6 +537,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { } } else if let textSelectionNode = self.textSelectionNode { self.textSelectionNode = nil + self.updateIsTextSelectionActive?(false) textSelectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak textSelectionNode] _ in textSelectionNode?.removeFromSupernode() }) diff --git a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift index 923495c013..fdc1f556ef 100644 --- a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift @@ -386,7 +386,7 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode } let dimensions = animatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: item.account, resource: animatedStickerFile.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(account: item.account, resource: .resource(animatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } diff --git a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift index 44d68c2eb5..bba9baf876 100755 --- a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift @@ -111,7 +111,7 @@ final class HorizontalStickerGridItemNode: GridItemNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: account, resource: item.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { diff --git a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift index ba165be0e8..c305fa7165 100644 --- a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift +++ b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift @@ -118,7 +118,7 @@ final class TrendingTopItemNode: ASDisplayNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: account, resource: item.file.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.loadDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { self.imageNode.setSignal(chatMessageSticker(account: account, file: item.file, small: true, synchronousLoad: synchronousLoads), attemptSynchronously: synchronousLoads) diff --git a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift index 9cc9abaa99..55a05c1cbc 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift @@ -286,7 +286,7 @@ public final class NotificationViewControllerImpl { let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 512.0, height: 512.0)) strongSelf.imageNode.setSignal(chatMessageAnimatedSticker(postbox: accountAndImage.0.postbox, file: fileReference.media, small: false, size: fittedDimensions)) - animatedStickerNode.setup(account: accountAndImage.0, resource: fileReference.media.resource, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + animatedStickerNode.setup(account: accountAndImage.0, resource: .resource(fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) animatedStickerNode.visibility = true accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/celebrate.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/celebrate.tgs new file mode 100755 index 0000000000000000000000000000000000000000..1b27435dc874a260376457ab869bd7b5d6edbe96 GIT binary patch literal 21678 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�SSeW!q^Y($?r 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
c`>pxCXL52V_A13Xp&M-i~`p*{VVN{Haxy5Sff) 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/lol.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/lol.tgs new file mode 100755 index 0000000000000000000000000000000000000000..0ef8e8530e6590dbcab579cf0d1483ee645975b6 GIT binary patch literal 13754 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 ns**!R>zS=<^wyD5BcajN%J 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

vL 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�N8s9*!L;9!5f<5?dnO*$_xY=17=*Oo(H zgR=~+ec@$SQdI4woq`=WTyCx9BRAeCl$)}-=0IHTy-b|c+B({w9+o}BYt<)xJ6;Dj z9GiQ=#qX**NU$xh@Kp^_tf){;&GU^|nDz>vj(2s{XU3mBbsBSc{`yLr*M*s4@=7J$ z_OqAZtzj$K_=Mf971ldKA3S#&%N^MJtjF0{CK7@E%|$S|cITj#ZP!4He5;Xhwb!WJ ZwLiZb$q$rgN6h@-J5Hui?v)Fy`9DvgAaDQx literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/sad.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/sad.tgs new file mode 100755 index 0000000000000000000000000000000000000000..65af870f4f2320f5a4d0bfa8643b3e7c0bc1a72e GIT binary patch literal 3210 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�uftYH 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/surprised.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/surprised.tgs new file mode 100755 index 0000000000000000000000000000000000000000..a6d874da62a025f9cb1bbcf0f9ffef17fb946bd6 GIT binary patch literal 8648 zcmV;(AvfM1iwFP!000021MOYulH|6LewB^>O)_vFdV_t2i3!K7G+Jq`D`sTN4u{@- z^Gh5AkE*VN)m>Gh!k#XIAkHrnc>sz3y!`&ZUthkF-OE2;zIm~O9n?$r^8J^WZ=C2} ze*Ep_8~XDr{gHuw{PFUQF`;|;f&Sw8m!IjQumAY++m|1|e*W&i=-t04oeKEwyYKkR zPhY=&{+-JI@Sm3-DdpwcUw{7XZ^-b|r+F<>3 zKQF)HpHH0a@AU7V-OF#2ln+XoPEnJ^$3N-ir(aWvv*v&OouB{bXD(t^v#K@!_UX&# zUnr{-C$~bTR!}dI@Gp8fIOn?;Do|3kUu&w?np5#HRiWZwwWVt4W6||eQ3vS7uly*| z!;kd=ZC+Nuzt$_kuT+tiL$E$oB<&z0Ri+1XL3Ky_qr+f~+@hM3dS&D|e0`w0+}0hk zVQ^YrS;I+vaVpp1I;v>nZg_WH;V1RLhar~97lV)(E=#bpTlYo^IXEA-scG3YS>H&0 z!!?@gi1c`WlzRgfAPbJEid%HT*ei=atrsSaP`*JgygaLT{v=Lk@6U_ZAiZ3J^mDF3 zH<`S4^>MfC$z@UsAGjcC~2P z7HvWmP{hsnW!!q?m-Hg+>2)wCQf>ark!+Vpz6!|dbu@_5a%s*2+FH@hP1l=Rv^$68 zNWD@tkkwG%ShPGxWu(P?S+tt8+SI9(_IgG+9T6KY8|>4B7C#mqwwE2;So%4`qV)-d zOLtk*SCKNEPC051QiYRj>E=LN+5IyBQ&WIYhP}fYguN zj}P)=)4dNocKHpO+>oy)6<$t82nw4&P>gf4Qlu%?uE82NFGqWOsGulkC8=Ua@Ix?u zQIbATkeausQsSbB)5k`NSk-c=!^tHrhez6D<71^h*rs_&Dl0yE@YYw@X)~F|kH^{i zDkEEG>wRzoO$n)4RJ4$1(3f~!Iw`2>L*z=FAH-R85U|!Ni4zr}BC2#n>odEe^~sFC zRwCoMm6%i5XaQs_eQ{e~^k zvBV%gs3DLtLhtZf(m*07J^DxqlEK>BK^S6@A9`wFl(Lgz2%eu6VcgLS48n4P7^3p1 z$`X_L$fNrKsZ!~V{wQOnxvZNN<5IbL2+?;mXfb6Ne286dD4UwK)5TdQB#$96GNI9e ze{u^9TC8DMQG_OqGL0Nm;3Q20!`(B)M-@9n0@WY5W)bO2Hbyx@NNybss5h8aH#l4K zaRv0w*;JYzBInX(P}1c(A%AlPUUB=refj41FaP+A8UKN1^ZQRfef`WZ!km8p(+lTl z(L&;)j81r3exiyU#@3oBl%Rr1#;6>+ejx=Qoz`Yv&DU!B9k80Y=@X*oXw9ippnaf9 z2p0V2%R+=-YtPreFS338G)wyP)8-^k?6TB#PuDT zg8bFWABu5SZK3@^0HWplKD56C{p*##1LJdv_Sa)!SxUoc9=Fr}f+F6hZ>;^5N}Ri; z_7`;S$}P3OI$pQc{$i=-rrO`d^KzE+Y-%R!E7rNiH18dr!CV7FS;i~*;7@~Zu`x%oY zpHcOLawoNFH9yEOPQ_O7lfn)$m{#$lqEr&Ti{3}o=@56d@4ckxekw-ytsLDi1nH?9 zJrkqXr0A&-J(r>9B6L5Kq5Fvt-LFc~3?S30eGD?!YJCZbs#W>`cr9J4^Ev8{Z8bha z>__-r;oG6Q5mem}60h^v{y2fEu299^Pt&SC@gk*N=k)WOM+tmFyYDq1$Zz*sEsBK!nCX9RI+UIvuq@ttaUXXp+aYnn;Y5BS}E`|h&XNF zSQ11fpXy~|l_cyyn8O;tw(~&QX<~#X4&ah7W{Cq}r>xE{01qj>NdQw)nhQ}P@htk~ zLsJS;thG%=<5%c-Q!vrLNxUi5oSz$7zie0Oe3}gj!AW4%%rZSob7rvZB+KkHpgfNA zTFG<691C+6OmMrq8Sy=Y!4A53q&CC6$zx5DHIQ3mlL2OaN{)16pd(`0tbla*>oaV-Duh1 zJf#?GPI5UDFix@^MiM4|V%90RWBP39 z*XlgCvZdZp-ddek+0ZUJeUNnV&q%qsSxmUWwk`6nl5HR^?;EnEiEw&Cw$$6?h^=Hh zrWCS;%IaIPt;LLFTWT7=qU9sDB}Z8Ao4WJ!l~ZaXdjfXe{KUMuJHEIT(2&II znY%-kRe%FUhIO-SnJxIO35-pjv3Ve+!KNa>BgaQHC=+#7j#J=W_f?SiZd_g3RGuQjguVwSM2DI{Xy zne;mH7XLcRkqr-%acgtTM){T8-NE|GD8~*y*C4B{KyrdhD<2FDA=?+^YC`^o4Gfr) zn2Za&JI?Ut+A;GiVO#UV5>A|Q6uxba*Wo)Y?@)aU_>$x@kqn!Z3RVaoW<8}9K4Jsk z@?6nczL+I!ZxPrT#Z4H+ieA2B`X-oOQAqvG$!eRIsN z%UuR$?Ck-nk{d1zLWS}~lCUy~876aIO;Fibmh)qq49mE=wDFn5?J;|P;?ka5d($u> z(Kt#w#AFQA8asX36vMl!5)*WCl45x?d;N$Qspsvlx!C$_h?x74ZYd{Gb51JXgS$FG@l#^!e4dr{EM1 zpu9Z^q8~wdyLU)GgX(s#aK3ld?H;7vk7w-<55XyKtaLVD!+^6QlAt0LHplJT!{=8( zh_m;H2PoVj-8Ept`Udf}JYSC-Dh4ZW{w)VqJK3!qr0tr2%L&$efUi*<^O)yxzgcZH zG}YTwS5GiY7Sd~V2!p!TlG|*}KjVz=xTQhc!Lr(seq?r2Q~R1cai05c_v6N+(}rT6ew9ot!T%K6rLzs0=A;y`D`qMzdQ9%^i$z_FrZ zUBrfB;_gSSwCd!8)eqXkQ{tK~_oF{6cn_Tcf2y9JGUbrZytEGp?e@6)qfgtqq(>6W znpxhlpy!>7kn?OZ%G3WMFP|m~8J%^kAP-4!R zUL6~mA|sGiR|!`$AIkfiF%q$SrQMOi(LS*+e*@X$uP`>3OD#JQZYc@vqq(tk^}NJ; zST5T^bgorzYAm^1S31a@7f+%juct8*;`Xtnzv z1{Z7KU^)k}iGzzsF?_@*ahOa`+lb!hH&PDD+Afy!V9pPorYQ{3#bXV;RQ`Rl23{nD zzWF?ddjD16`>)Or@$RUtYqt+dz0vG@+l3<6INS-TJ4axMXOqurE4RX^)UG4BQK#L@ z1XAlsMkBc=T#ZsG?N*J1!&41G6iTuYF*i8)$D)y|BH>$r?sU7_E3(!fn??q9SA@M4 z2SV^d+C49@@Y>RRY8i#yxlJMgU(t|>h9wqga|r{mZmQk7dC_vQ3^j(66+Z2NjKY-t z6D75;$<3ko<;!lps7mR?pLHzac-E;Pp!T2H^mYXzpjNJ}V)bBs_a1N8wUt-T+JDIB`V9e@fR4bwX8r6VYG! zMuZ`lb1gtCop#Ik3Bhwr0-rZFpbshs%~8j%lM>#mNe~K$YD#P0)h>>GFv*< zG94IAlLE3CL-nWguzLB|_t)|1wY z1DzF%eu~u|!imop>!`tdHQ6<4of|hb@WoDT4>^mD@&-Gz9;SnrsT|J=-PiSvC+PWg z+m`Me+3SMGW6s(+qDRyM|4|u2cgG+1P%Zm8ug5#*l}P@Hk9lp>!Tprie#-04PI+C0 z?B_q^wZ5Q-WG$dS62aDvJ?;zo%@=goj?5BeC3zKP?Kdk$jVR;0mw5lu1VTEFD8nW- zzs$l`xQ!QdIY{136$Z~1&bA+ei9SWUSL^-f+YzZhsgcd6J$7DVyFQG#YJD7Zs+p95 zc!+o8-TAoFSd=Utw@%89SN&%kg=Ed zg#Eja7dDyMzf$nP__kXW^trJE1Iet)9Nnp~mSv9|xJM4WxtUX1;;+^;Hp~pgYUWhf z^k$bC9>brs+P`RUp;y)^*ZRj99>JS*!|vU&FX_!edncZxTlV{Y{79Q)`W?MU8_(Dt zC~yxHc(Z^=Q>^k>Ljk@AsXj~)z&8iZ9{%rI^P5?i z-}H&*w}a9D8tdC0{BIBbcUQsxq`-}XwuyO#o2;UD_Z0k(n}pCFq;GNyv425!ff``$ zA@<*;?R&G(e^<@&8;Ab8QCn{o`VX!1f{&|9@AC9}$LF}63HKBIPYO4PDESzDYG=e& zDL#R&?<4jfH_>tIKWhsq#lV7KzT59cvH#9R-5&dIkNvmD{(HpOe^U5C`8J3{md{HJ z2WN=$uDri>=s%n~Rc7A%8u4tU^N1~Mmwk_eFb~#A>!Yg_wU4Te^%Rh zPf213_F$w+Ay(Lv%Dc`Eb~_9r1JkxnFw^R!5gJ7|8->oM3JX>Cx#bhvGJKW*eP zyq`AmV0gdzyKc3dN!J~7ZeO;Lc;2g=L>}t7j(E$<0N%2}fVlb10{i*JM3=+^f&Ki- zR4>Yzbl7wBM&a{ZM|3LCik#=#q#%CLmOj(mQ~qe}O@jJuFOm?`HXhaq$MLEGXD``+ z!izj6l~x_LUQAybbEEKm54KdjW9+_dneZOE@2wnib{V=)-(W-hUn_K<)G@2NC0JA* zks415KX4J=atO*MlVQ*+Ohd*Y zc+&*s3N8)P_HlNeZVavuvhy_PKQG44BX;}Z5Iau-``6>^Jjkr>!T5FoVS=hDW@^x; z3aS~VZV-tNk+k6NuE8}M24N!m1IM78)1D)T<@>&78Nec}0A|yts|><70Xu^ybej&h z{}uM&O?(>*z*F`A5yXNw!Th}m1zUIeV&lLQ!2KS?feq$!kF|HRy#;Q$w;;^+7W{hr zpzgT`bWT5AvvRCOA1EW#tgj!h8IQ1@UW%;!tW8mBS`IImV;_-iexag-V^4ODB-CKm zFH~G)xq4SdDmhcXA|gXT%YjuDKL{5{lMv|w+w?NO>(k3Vy{(+>NS^LU=`{$alw$Bs zbqxuD~U+^`7|l%B-nc1bepb((}Wn+v1dJR=EP2W)frN_quHVKo=_s;0r5p3?MU9i zi31Hd1fdcv();?l&+q$`p@Qjnw(fW}6;9D3x(L{iOLiWq_29JX0ps8lbA}3~}YyVG{KUOd3HnDDd+eA1s@$yd#d1PSR&EaXKmg?1Ub5I4aq2$ZPA7I5^?d>F2AmqE2?0yh64BRW;;%Rx zfYXTbO6((6VfqwiegzbBt_c;Gh6*@th}(=J2xc6wbYKlhNnQ&Sf|$ZWq?kU4N*Wd3 z;GCxKA|jq92=n0rh#ClR@*X53iC7(dMf#pkG(=-4*huQaPDAfYLqt80ie-{7h=|zX zmn_-D=Lo3kCiH~pz@0AA5aPBlZJ9OF$`mA-xRibaN`t(`W%8&f&4Yw^1juS&HA7cp zLw7nU3j}SIQBNucRtjlw+UH(LQQ|f;%j=m-&dmsAJo{hWPMud%=h^N^zq=#f%pHly zl9psn#}O@7(X-65tvj-xdJOxiLvrG4Ty;kt&e0t$dlC_WcyaYcN|G<4HKQ|9YH)r% z`Xa%Za4KSVMZW(6-p~Am{mdCT^)jxzB9GoX-T{o}4#Ixsh@3eX*WHjuGj*?3QlJzyy&j#A5RpWPqYqM&047Nnt1d{0 zS_0za?ty%NAkE!_{nQ6Jb1trWAdltgUa6sgC=gR2-clTpaAb!VM*pLa}c$EI)_aBO~bjAFN&*V%QMs#TzXR@u-6 zEn9?7#TMcjUEGvVB(F|78Kt>k(%G>%RIh79d@8+rLGOW7;1w)Kic5H2rVVUiVUNbm zC`hN8(^i=rFSjl@yco=UlDU=-ZIc&}cP;CaWZ@K^{wM-qdSsvD=5ey1Jn} zM5xvXpqr>@eD>-2ekfBCr&Nfb44;yzDZWiHxPnuUK4B=q;5WPf^$w^Plg(=fPc!$jC1sO9d$L6!^yAq&Mw5rgYIl%=z7s7 z9pdRTWy)0HLhb4rZ@RjAQWsZGcf1`%nnOo*Q=TTr{ak6Ram{f4=ek>s%eDe3x_ITC z!?~KSMNNCVamFyJkylssTE|SiuG!KmaMLk#d5cFRL0qUSs*>FE`tM3r@pWjNK8UYZ zSBd>ipg3MWeQ3(qyq5pD9Ec=!G!v#L7hnf*n+vcff^in>d=kneUpO;WASV~MlB^1| zI)pOGH<&0pc+Dv|6EwZJb?aMOQ<~c^0$rU#T!3t_Mi}9mOL#4b^8lZnO{F&MjtK&% z4M<3hyx*T>c-}p-&*OW{WA8yk9GVaNX+x&Jn%dXokwjNscI!n|A|~BOBbKhkE?l2a z07AaN#*U=;VJECKD_JDp2N*BXS~y}((o7_YJ9so%QL#9*yob*_x`jM#ASN|Zu)iu| z<2dYXM%i))H*bs<><{Ym`#xnDw|kG-;xb!zyqXFjhdtAV-TYQ0O9g#L3#ARno~!{P zU-1MxK=Mfil@Vkw2at?T_&{te;6f*rLN4Kq=Z>D^%tZ>5Zz{{b%GF;ry&qpRmw&Cj z?hX|=+Ic)K+u}RIR1Sy290bOha+z3!`#dc3^h$`6_A0I|LRip}aYO~!LQD$SNt{L` zz?djx^j1fG>QWW*QYF(;MSp(&DaC9&I7fT<(3>C_&O@24Z1k%lxTN>vix$Bvue(D9 zRs=_E5K%Zs6I6rWNCHw~c`_eToaLZ&9I3g`vIphhF_3Ueo83p``03NXKYvO3&D4OG zz(S8-K7aq;l<@NHuRs6xH}P`(raF#pXx4|Lc{l1;e?WC7t@8)^ix##m7BaQChjnM& a&Zyq8ncTj~&~i!{-2VsDfB_=MQ2_v3Z15NW literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/thumbsup.tgs b/submodules/TelegramUI/TelegramUI/Resources/BuiltinReactions/thumbsup.tgs new file mode 100755 index 0000000000000000000000000000000000000000..614c2fe0e7261b9679069b4f026c19f77cc22a0b GIT binary patch literal 17922 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 Void private let present: (ViewController, Any?) -> Void private weak var rootNode: ASDisplayNode? private let performAction: (String, TextSelectionAction) -> Void @@ -196,9 +197,10 @@ public final class TextSelectionNode: ASDisplayNode { private var currentRange: (Int, Int)? private var currentRects: [CGRect]? - public init(theme: TextSelectionTheme, textNode: TextNode, present: @escaping (ViewController, Any?) -> Void, rootNode: ASDisplayNode, performAction: @escaping (String, TextSelectionAction) -> Void) { + public init(theme: TextSelectionTheme, textNode: TextNode, updateIsActive: @escaping (Bool) -> Void, present: @escaping (ViewController, Any?) -> Void, rootNode: ASDisplayNode, performAction: @escaping (String, TextSelectionAction) -> Void) { self.theme = theme self.textNode = textNode + self.updateIsActive = updateIsActive self.present = present self.rootNode = rootNode self.performAction = performAction @@ -311,9 +313,11 @@ public final class TextSelectionNode: ASDisplayNode { } strongSelf.updateSelection(range: resultRange) strongSelf.displayMenu() + strongSelf.updateIsActive(true) } recognizer.clearSelection = { [weak self] in self?.dismissSelection() + self?.updateIsActive(false) } self.view.addGestureRecognizer(recognizer) } From ab4381a5204feb6169dd271efd9c99c94907a2b4 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 20 Aug 2019 23:24:40 +0300 Subject: [PATCH 14/86] Fix build --- .../libphonenumber_Xcode.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj index 1a04b246b5..0ab88d79ef 100644 --- a/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj +++ b/submodules/libphonenumber/libphonenumber_Xcode.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ D0208ABB2306E84F00A23503 /* libphonenumbermac.h in Headers */ = {isa = PBXBuildFile; fileRef = D0208AB92306E84F00A23503 /* libphonenumbermac.h */; }; - D0208ABC2306E84F00A23503 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D0208ABA2306E84F00A23503 /* Info.plist */; }; D0208ABF2306E85800A23503 /* NBMetadataCoreTest.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E459B2305D1EF0049C28B /* NBMetadataCoreTest.h */; }; D0208AC02306E85800A23503 /* NBPhoneMetaDataGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45A22305D1EF0049C28B /* NBPhoneMetaDataGenerator.h */; }; D0208AC12306E85800A23503 /* NBNumberFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E45992305D1EF0049C28B /* NBNumberFormat.h */; }; @@ -324,7 +323,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D0208ABC2306E84F00A23503 /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From caa75cbc862f9192425e4734bb8803c254b38e90 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 20 Aug 2019 23:57:30 +0300 Subject: [PATCH 15/86] Cancel reaction gesture after long tap --- .../Sources/ReactionSwipeGestureRecognizer.swift | 4 ++++ .../TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift | 1 + 2 files changed, 5 insertions(+) diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift index d9a0cc59bf..ceb67815f1 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSwipeGestureRecognizer.swift @@ -170,4 +170,8 @@ public final class ReactionSwipeGestureRecognizer: UIPanGestureRecognizer { self.state = .ended } } + + public func cancel() { + self.state = .cancelled + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 32e0f85787..99371d7cfa 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -354,6 +354,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode guard let strongSelf = self else { return } + strongSelf.reactionRecognizer?.cancel() if strongSelf.gestureRecognized(gesture: .longTap, location: point, recognizer: recognizer) { recognizer.cancel() } From b93f76b6cd31193b0123f079838cfcb838703747 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 21 Aug 2019 01:18:07 +0300 Subject: [PATCH 16/86] Fixed logs sending when unauthorized --- ...rizationSequencePhoneEntryController.swift | 1 + .../TelegramUI/DebugController.swift | 141 ++++++++++-------- 2 files changed, 79 insertions(+), 63 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift index 8bb95b3cf6..d9601dacf0 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift @@ -95,6 +95,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController { guard let strongSelf = self else { return } + strongSelf.view.endEditing(true) self?.present(debugController(sharedContext: strongSelf.sharedContext, context: nil, modal: true), in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) }, hasOtherAccounts: self.otherAccountPhoneNumbers.0 != nil) if let (code, name, number) = self.currentData { diff --git a/submodules/TelegramUI/TelegramUI/DebugController.swift b/submodules/TelegramUI/TelegramUI/DebugController.swift index 11bed23910..d8aa9ccb9e 100644 --- a/submodules/TelegramUI/TelegramUI/DebugController.swift +++ b/submodules/TelegramUI/TelegramUI/DebugController.swift @@ -13,16 +13,24 @@ import MessageUI import TelegramPresentationData import TelegramUIPreferences +@objc private final class DebugControllerMailComposeDelegate: NSObject, MFMailComposeViewControllerDelegate { + public func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { + controller.dismiss(animated: true, completion: nil) + } +} + private final class DebugControllerArguments { let sharedContext: SharedAccountContext let context: AccountContext? + let mailComposeDelegate: DebugControllerMailComposeDelegate let presentController: (ViewController, ViewControllerPresentationArguments?) -> Void let pushController: (ViewController) -> Void let getRootController: () -> UIViewController? - init(sharedContext: SharedAccountContext, context: AccountContext?, presentController: @escaping (ViewController, ViewControllerPresentationArguments?) -> Void, pushController: @escaping (ViewController) -> Void, getRootController: @escaping () -> UIViewController?) { + init(sharedContext: SharedAccountContext, context: AccountContext?, mailComposeDelegate: DebugControllerMailComposeDelegate, presentController: @escaping (ViewController, ViewControllerPresentationArguments?) -> Void, pushController: @escaping (ViewController) -> Void, getRootController: @escaping () -> UIViewController?) { self.sharedContext = sharedContext self.context = context + self.mailComposeDelegate = mailComposeDelegate self.presentController = presentController self.pushController = pushController self.getRootController = getRootController @@ -136,14 +144,13 @@ private enum DebugControllerEntry: ItemListNodeEntry { return ItemListDisclosureItem(theme: theme, title: "Send Logs", label: "", sectionId: self.section, style: .blocks, action: { let _ = (Logger.shared.collectLogs() |> deliverOnMainQueue).start(next: { logs in - guard let context = arguments.context else { - return - } - let presentationData = arguments.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) - actionSheet.setItemGroups([ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in + + var items: [ActionSheetButtonItem] = [] + + if let context = arguments.context { + items.append(ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) @@ -160,20 +167,23 @@ private enum DebugControllerEntry: ItemListNodeEntry { } } arguments.presentController(controller, ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet)) - }), - ActionSheetButtonItem(title: "Via Email", color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - - let composeController = MFMailComposeViewController() - composeController.setSubject("Telegram Logs") - for (name, path) in logs { - if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { - composeController.addAttachmentData(data, mimeType: "application/text", fileName: name) - } + })) + } + items.append(ActionSheetButtonItem(title: "Via Email", color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + let composeController = MFMailComposeViewController() + composeController.mailComposeDelegate = arguments.mailComposeDelegate + composeController.setSubject("Telegram Logs") + for (name, path) in logs { + if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { + composeController.addAttachmentData(data, mimeType: "application/text", fileName: name) } - arguments.getRootController()?.present(composeController, animated: true, completion: nil) - }) - ]), ActionSheetItemGroup(items: [ + } + arguments.getRootController()?.present(composeController, animated: true, completion: nil) + })) + + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() }) @@ -185,16 +195,15 @@ private enum DebugControllerEntry: ItemListNodeEntry { return ItemListDisclosureItem(theme: theme, title: "Send Latest Log", label: "", sectionId: self.section, style: .blocks, action: { let _ = (Logger.shared.collectLogs() |> deliverOnMainQueue).start(next: { logs in - guard let context = arguments.context else { - return - } - let presentationData = arguments.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) - actionSheet.setItemGroups([ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in + + var items: [ActionSheetButtonItem] = [] + + if let context = arguments.context { + items.append(ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - + let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) controller.peerSelected = { [weak controller] peerId in if let strongController = controller { @@ -211,24 +220,28 @@ private enum DebugControllerEntry: ItemListNodeEntry { } } arguments.presentController(controller, ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet)) - }), - ActionSheetButtonItem(title: "Via Email", color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - - let composeController = MFMailComposeViewController() - composeController.setSubject("Telegram Logs") - for (name, path) in logs { - if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { - composeController.addAttachmentData(data, mimeType: "application/text", fileName: name) - } + })) + } + + items.append(ActionSheetButtonItem(title: "Via Email", color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + let composeController = MFMailComposeViewController() + composeController.mailComposeDelegate = arguments.mailComposeDelegate + composeController.setSubject("Telegram Logs") + for (name, path) in logs { + if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { + composeController.addAttachmentData(data, mimeType: "application/text", fileName: name) } - arguments.getRootController()?.present(composeController, animated: true, completion: nil) + } + arguments.getRootController()?.present(composeController, animated: true, completion: nil) + })) + + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() }) - ]), ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - }) - ]) + ]) ]) arguments.presentController(actionSheet, nil) }) @@ -260,14 +273,13 @@ private enum DebugControllerEntry: ItemListNodeEntry { return ItemListDisclosureItem(theme: theme, title: "Send Critical Logs", label: "", sectionId: self.section, style: .blocks, action: { let _ = (Logger.shared.collectShortLogFiles() |> deliverOnMainQueue).start(next: { logs in - guard let context = arguments.context else { - return - } - let presentationData = arguments.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) - actionSheet.setItemGroups([ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in + + var items: [ActionSheetButtonItem] = [] + + if let context = arguments.context { + items.append(ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) @@ -284,20 +296,23 @@ private enum DebugControllerEntry: ItemListNodeEntry { } } arguments.presentController(controller, ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet)) - }), - ActionSheetButtonItem(title: "Via Email", color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - - let composeController = MFMailComposeViewController() - composeController.setSubject("Telegram Logs") - for (name, path) in logs { - if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { - composeController.addAttachmentData(data, mimeType: "application/text", fileName: name) - } + })) + } + + items.append(ActionSheetButtonItem(title: "Via Email", color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + let composeController = MFMailComposeViewController() + composeController.mailComposeDelegate = arguments.mailComposeDelegate + composeController.setSubject("Telegram Logs") + for (name, path) in logs { + if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { + composeController.addAttachmentData(data, mimeType: "application/text", fileName: name) } - arguments.getRootController()?.present(composeController, animated: true, completion: nil) - }) - ]), ActionSheetItemGroup(items: [ + } + arguments.getRootController()?.present(composeController, animated: true, completion: nil) + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() }) @@ -548,7 +563,7 @@ public func debugController(sharedContext: SharedAccountContext, context: Accoun var dismissImpl: (() -> Void)? var getRootControllerImpl: (() -> UIViewController?)? - let arguments = DebugControllerArguments(sharedContext: sharedContext, context: context, presentController: { controller, arguments in + let arguments = DebugControllerArguments(sharedContext: sharedContext, context: context, mailComposeDelegate: DebugControllerMailComposeDelegate(), presentController: { controller, arguments in presentControllerImpl?(controller, arguments) }, pushController: { controller in pushControllerImpl?(controller) From 34f50c85c6ba677c8f701878e1979bc0e45ea459 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 21 Aug 2019 01:59:35 +0300 Subject: [PATCH 17/86] Cleanup --- .../TGMediaAssetsMomentsCollectionLayout.h | 7 - .../TGMediaAssetsMomentsCollectionLayout.m | 71 --------- .../TGMediaAssetsMomentsCollectionView.h | 14 -- .../TGMediaAssetsMomentsCollectionView.m | 124 ---------------- .../TGMediaAssetsMomentsController.h | 12 -- .../TGMediaAssetsMomentsController.m | 137 ------------------ .../TGMediaAssetsMomentsSectionHeader.h | 10 -- .../TGMediaAssetsMomentsSectionHeader.m | 5 - .../TGMediaAssetsMomentsSectionHeaderView.h | 9 -- .../TGMediaAssetsMomentsSectionHeaderView.m | 78 ---------- .../project.pbxproj | 40 ----- 11 files changed, 507 deletions(-) delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.h delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.m delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.h delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.m delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.h delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.h delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.m delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.h delete mode 100644 submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.m diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.h deleted file mode 100644 index 2c1cc89a88..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.h +++ /dev/null @@ -1,7 +0,0 @@ -#import - -@interface TGMediaAssetsMomentsCollectionLayout : UICollectionViewFlowLayout - -- (NSArray *)sectionHeaders; - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.m deleted file mode 100644 index ac88c469ab..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionLayout.m +++ /dev/null @@ -1,71 +0,0 @@ -#import "TGMediaAssetsMomentsCollectionLayout.h" - -#import "TGMediaAssetsMomentsSectionHeader.h" - -@interface TGMediaAssetsMomentsCollectionLayout () -{ - bool _updatingCollectionItems; - NSArray *_sectionHeaders; -} -@end - -@implementation TGMediaAssetsMomentsCollectionLayout - -- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath -{ - if (_updatingCollectionItems || itemIndexPath.section != 0) - return [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath]; - - return nil; -} - -- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath -{ - if (_updatingCollectionItems || itemIndexPath.section != 0) - return [super finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath]; - - return [self layoutAttributesForItemAtIndexPath:itemIndexPath]; -} - -- (void)prepareLayout -{ - [super prepareLayout]; - - NSMutableArray *sectionHeaders = [[NSMutableArray alloc] init]; - - id dataSource = self.collectionView.dataSource; - NSUInteger numberOfSections = 1; - if ([dataSource respondsToSelector:@selector(numberOfSectionsInCollectionView:)]) - numberOfSections = [dataSource numberOfSectionsInCollectionView:self.collectionView]; - - for (NSUInteger i = 0; i < numberOfSections; i++) - { - NSUInteger itemCount = [dataSource collectionView:self.collectionView numberOfItemsInSection:i]; - if (itemCount != 0) - { - UICollectionViewLayoutAttributes *firstItemAttributes = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:i]]; - UICollectionViewLayoutAttributes *lastItemAttributes = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:itemCount - 1 inSection:i]]; - - TGMediaAssetsMomentsSectionHeader *sectionHeader = [[TGMediaAssetsMomentsSectionHeader alloc] init]; - sectionHeader.index = i; - CGFloat headerHeight = 48.0f; - sectionHeader.bounds = CGRectMake(0.0f, 0.0f, self.collectionView.bounds.size.width, headerHeight); - sectionHeader.floatingFrame = CGRectMake(0.0f, firstItemAttributes.frame.origin.y - sectionHeader.bounds.size.height, sectionHeader.bounds.size.width, CGRectGetMaxY(lastItemAttributes.frame) - (firstItemAttributes.frame.origin.y - sectionHeader.bounds.size.height)); - [sectionHeaders addObject:sectionHeader]; - } - } - - _sectionHeaders = sectionHeaders; -} - -- (NSArray *)sectionHeaders -{ - return _sectionHeaders; -} - -- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)__unused newBounds -{ - return false; -} - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.h deleted file mode 100644 index 6ddfb9adee..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.h +++ /dev/null @@ -1,14 +0,0 @@ -#import - -@class TGMediaAssetsMomentsSectionHeader; -@class TGMediaAssetsMomentsSectionHeaderView; - -@protocol TGMediaAssetsMomentsCollectionViewDelegate - -- (void)collectionView:(UICollectionView *)collectionView setupSectionHeaderView:(TGMediaAssetsMomentsSectionHeaderView *)sectionHeaderView forSectionHeader:(TGMediaAssetsMomentsSectionHeader *)sectionHeader; - -@end - -@interface TGMediaAssetsMomentsCollectionView : UICollectionView - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.m deleted file mode 100644 index bf982f31d6..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsCollectionView.m +++ /dev/null @@ -1,124 +0,0 @@ -#import "TGMediaAssetsMomentsCollectionView.h" - -#import "TGMediaAssetsMomentsCollectionLayout.h" -#import "TGMediaAssetsMomentsSectionHeader.h" -#import "TGMediaAssetsMomentsSectionHeaderView.h" - -@interface TGMediaAssetsMomentsCollectionView () -{ - NSMutableArray *_sectionHeaderViewQueue; - NSMutableArray *_visibleSectionHeaderViews; -} - -@end - -@implementation TGMediaAssetsMomentsCollectionView - -- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout -{ - self = [super initWithFrame:frame collectionViewLayout:layout]; - if (self != nil) - { - _sectionHeaderViewQueue = [[NSMutableArray alloc] init]; - _visibleSectionHeaderViews = [[NSMutableArray alloc] init]; - } - return self; -} - -- (void)reloadData -{ - for (TGMediaAssetsMomentsSectionHeaderView *headerView in _visibleSectionHeaderViews) - { - [self enqueueSectionHeaderView:headerView]; - } - [_visibleSectionHeaderViews removeAllObjects]; - - [super reloadData]; -} - -- (TGMediaAssetsMomentsSectionHeaderView *)dequeueSectionHeaderView -{ - TGMediaAssetsMomentsSectionHeaderView *headerView = [_sectionHeaderViewQueue lastObject]; - if (headerView != nil) - { - [_sectionHeaderViewQueue removeLastObject]; - return headerView; - } - else - { - headerView = [[TGMediaAssetsMomentsSectionHeaderView alloc] init]; - return headerView; - } -} - -- (void)enqueueSectionHeaderView:(TGMediaAssetsMomentsSectionHeaderView *)headerView -{ - [headerView removeFromSuperview]; - [_sectionHeaderViewQueue addObject:headerView]; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - CGRect bounds = self.bounds; - UIEdgeInsets insets = self.contentInset; - - UIView *topmostViewForHeaders = nil; - - for (TGMediaAssetsMomentsSectionHeader *sectionHeader in [(TGMediaAssetsMomentsCollectionLayout *)self.collectionViewLayout sectionHeaders]) - { - CGRect headerFloatingBounds = sectionHeader.floatingFrame; - - if (CGRectIntersectsRect(bounds, headerFloatingBounds)) - { - TGMediaAssetsMomentsSectionHeaderView *headerView = nil; - for (TGMediaAssetsMomentsSectionHeaderView *visibleHeaderView in _visibleSectionHeaderViews) - { - if (visibleHeaderView.index == sectionHeader.index) - { - headerView = visibleHeaderView; - break; - } - } - - if (headerView == nil) - { - headerView = [self dequeueSectionHeaderView]; - headerView.index = sectionHeader.index; - id delegate = (id)self.delegate; - [delegate collectionView:self setupSectionHeaderView:headerView forSectionHeader:sectionHeader]; - [_visibleSectionHeaderViews addObject:headerView]; - - if (topmostViewForHeaders == nil) - topmostViewForHeaders = [[self visibleCells] lastObject]; - - if (topmostViewForHeaders == nil) - [self insertSubview:headerView atIndex:0]; - else - [self insertSubview:headerView aboveSubview:topmostViewForHeaders]; - } - - CGRect headerFrame = sectionHeader.bounds; - headerFrame.origin.y = MIN(headerFloatingBounds.origin.y + headerFloatingBounds.size.height - headerFrame.size.height, MAX(headerFloatingBounds.origin.y, bounds.origin.y + insets.top)); - headerView.frame = headerFrame; - [headerView.layer removeAllAnimations]; - } - else - { - NSInteger index = -1; - for (TGMediaAssetsMomentsSectionHeaderView *headerView in _visibleSectionHeaderViews) - { - index++; - if (headerView.index == sectionHeader.index) - { - [self enqueueSectionHeaderView:headerView]; - [_visibleSectionHeaderViews removeObjectAtIndex:index]; - break; - } - } - } - } -} - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.h deleted file mode 100644 index 39b56df053..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.h +++ /dev/null @@ -1,12 +0,0 @@ -#import "TGMediaAssetsPickerController.h" - -#import - -@class TGMediaAssetMomentList; -@class TGViewController; - -@interface TGMediaAssetsMomentsController : TGMediaAssetsPickerController - -- (instancetype)initWithContext:(id)context assetsLibrary:(TGMediaAssetsLibrary *)assetsLibrary momentList:(TGMediaAssetMomentList *)momentList intent:(TGMediaAssetsControllerIntent)intent selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext saveEditedPhotos:(bool)saveEditedPhotos; - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m deleted file mode 100644 index b200ddd264..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsController.m +++ /dev/null @@ -1,137 +0,0 @@ -#import "TGMediaAssetsMomentsController.h" - -#import "LegacyComponentsInternal.h" - -#import -#import -#import - -#import - -#import -#import "TGMediaAssetsMomentsCollectionView.h" -#import "TGMediaAssetsMomentsCollectionLayout.h" -#import "TGMediaAssetsMomentsSectionHeaderView.h" -#import "TGMediaAssetsMomentsSectionHeader.h" - -#import "TGMediaAssetsPhotoCell.h" -#import "TGMediaAssetsVideoCell.h" -#import "TGMediaAssetsGifCell.h" - -#import - -#import - -#import - -@interface TGMediaAssetsMomentsController () -{ - TGMediaAssetMomentList *_momentList; - - TGMediaAssetsMomentsCollectionLayout *_collectionLayout; - id _context; -} -@end - -@implementation TGMediaAssetsMomentsController - -- (instancetype)initWithContext:(id)context assetsLibrary:(TGMediaAssetsLibrary *)assetsLibrary momentList:(TGMediaAssetMomentList *)momentList intent:(TGMediaAssetsControllerIntent)intent selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext saveEditedPhotos:(bool)saveEditedPhotos -{ - self = [super initWithContext:context assetsLibrary:assetsLibrary assetGroup:nil intent:intent selectionContext:selectionContext editingContext:editingContext saveEditedPhotos:saveEditedPhotos]; - if (self != nil) - { - _context = context; - _momentList = momentList; - - [self setTitle:TGLocalized(@"MediaPicker.Moments")]; - } - return self; -} - -- (Class)_collectionViewClass -{ - return [TGMediaAssetsMomentsCollectionView class]; -} - -- (UICollectionViewLayout *)_collectionLayout -{ - if (_collectionLayout == nil) - _collectionLayout = [[TGMediaAssetsMomentsCollectionLayout alloc] init]; - - return _collectionLayout; -} - -- (void)viewDidLoad -{ - CGSize frameSize = self.view.frame.size; - CGRect collectionViewFrame = CGRectMake(0.0f, 0.0f, frameSize.width, frameSize.height); - _collectionViewWidth = collectionViewFrame.size.width; - _collectionView.frame = collectionViewFrame; - - _layoutMetrics = [TGMediaPickerLayoutMetrics defaultLayoutMetrics]; - - _preheatMixin.imageSize = [_layoutMetrics imageSize]; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; - - dispatch_async(dispatch_get_main_queue(), ^ - { - [_collectionView reloadData]; - [_collectionView layoutSubviews]; - [self _adjustContentOffsetToBottom]; - }); -} - -- (void)collectionView:(UICollectionView *)__unused collectionView setupSectionHeaderView:(TGMediaAssetsMomentsSectionHeaderView *)sectionHeaderView forSectionHeader:(TGMediaAssetsMomentsSectionHeader *)sectionHeader -{ - TGMediaAssetMoment *moment = _momentList[sectionHeader.index]; - - NSString *title = @""; - NSString *location = @""; - NSString *date = @""; - if (moment.title.length > 0) - { - title = moment.title; - if (moment.locationNames.count > 0) - location = moment.locationNames.firstObject; - date = [TGMediaAssetsDateUtils formattedDateRangeWithStartDate:moment.startDate endDate:moment.endDate currentDate:[NSDate date] shortDate:true]; - } - else - { - title = [TGMediaAssetsDateUtils formattedDateRangeWithStartDate:moment.startDate endDate:moment.endDate currentDate:[NSDate date] shortDate:false]; - } - - [sectionHeaderView setTitle:title location:location date:date]; -} - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)__unused collectionView -{ - return _momentList.count; -} - -- (NSInteger)collectionView:(UICollectionView *)__unused collectionView numberOfItemsInSection:(NSInteger)__unused section -{ - return ((TGMediaAssetMoment *)_momentList[section]).assetCount; -} - -- (UIEdgeInsets)collectionView:(UICollectionView *)__unused collectionView layout:(UICollectionViewLayout *)__unused collectionViewLayout insetForSectionAtIndex:(NSInteger)__unused section -{ - return UIEdgeInsetsMake(48.0f, 0.0f, 0.0f, 0.0f); -} - -- (TGMediaPickerModernGalleryMixin *)_galleryMixinForItem:(id)item thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaption allowCaptionEntities:(bool)allowCaptionEntities asFile:(bool)asFile -{ - return [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:item momentList:_momentList parentController:self thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaption allowCaptionEntities:allowCaptionEntities hasTimer:false onlyCrop:false inhibitDocumentCaptions:false inhibitMute:false asFile:asFile itemsLimit:0 hasSilentPosting:false]; -} - -- (id)_itemAtIndexPath:(NSIndexPath *)indexPath -{ - TGMediaAssetFetchResult *fetchResult = [_momentList[indexPath.section] fetchResult]; - TGMediaAsset *asset = [fetchResult assetAtIndex:indexPath.row]; - return asset; -} - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.h deleted file mode 100644 index c378960e53..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.h +++ /dev/null @@ -1,10 +0,0 @@ -#import -#import - -@interface TGMediaAssetsMomentsSectionHeader : NSObject - -@property (nonatomic) NSInteger index; -@property (nonatomic) CGRect bounds; -@property (nonatomic) CGRect floatingFrame; - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.m deleted file mode 100644 index fc807bf3a1..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeader.m +++ /dev/null @@ -1,5 +0,0 @@ -#import "TGMediaAssetsMomentsSectionHeader.h" - -@implementation TGMediaAssetsMomentsSectionHeader - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.h deleted file mode 100644 index 7d171f6ebc..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.h +++ /dev/null @@ -1,9 +0,0 @@ -#import - -@interface TGMediaAssetsMomentsSectionHeaderView : UIView - -@property (nonatomic) NSInteger index; - -- (void)setTitle:(NSString *)title location:(NSString *)location date:(NSString *)date; - -@end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.m deleted file mode 100644 index 7e625776d6..0000000000 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsMomentsSectionHeaderView.m +++ /dev/null @@ -1,78 +0,0 @@ -#import "TGMediaAssetsMomentsSectionHeaderView.h" - -#import - -@interface TGMediaAssetsMomentsSectionHeaderView () -{ - UILabel *_titleLabel; - UILabel *_locationLabel; - UILabel *_dateLabel; -} -@end - -@implementation TGMediaAssetsMomentsSectionHeaderView - -- (instancetype)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self != nil) - { - self.backgroundColor = [UIColor colorWithWhite:1.0f alpha:0.92f]; - - _titleLabel = [[UILabel alloc] init]; - _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.textColor = [UIColor blackColor]; - _titleLabel.font = TGSystemFontOfSize(15.0f); - [self addSubview:_titleLabel]; - - _locationLabel = [[UILabel alloc] init]; - _locationLabel.backgroundColor = [UIColor clearColor]; - _locationLabel.textColor = [UIColor blackColor]; - _locationLabel.font = TGSystemFontOfSize(12.0f); - [self addSubview:_locationLabel]; - - _dateLabel = [[UILabel alloc] init]; - _dateLabel.backgroundColor = [UIColor clearColor]; - _dateLabel.textColor = [UIColor blackColor]; - _dateLabel.font = TGSystemFontOfSize(12.0f); - [self addSubview:_dateLabel]; - } - return self; -} - -- (void)setTitle:(NSString *)title location:(NSString *)location date:(NSString *)date -{ - _titleLabel.text = title; - [_titleLabel sizeToFit]; - - _locationLabel.text = location; - [_locationLabel sizeToFit]; - - _dateLabel.text = date; - [_dateLabel sizeToFit]; - - [self setNeedsLayout]; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - _dateLabel.frame = (CGRect){{self.bounds.size.width - _dateLabel.frame.size.width - 8.0f, 27.0f}, _dateLabel.frame.size}; - - CGFloat titleWidth = _titleLabel.frame.size.width; - if (_dateLabel.text.length > 0) - titleWidth = MIN(titleWidth, _dateLabel.frame.origin.x - 8.0f); - - if (_locationLabel.text.length > 0) - { - _titleLabel.frame = (CGRect){{8.0f, 8.0f}, { titleWidth, _titleLabel.frame.size.height }}; - _locationLabel.frame = (CGRect){{8.0f, 27.0f}, _locationLabel.frame.size}; - } - else - { - _titleLabel.frame = (CGRect){{8.0f, TGRetinaFloor((self.bounds.size.height - _titleLabel.frame.size.height) / 2.0f)}, { titleWidth, _titleLabel.frame.size.height }}; - } -} - -@end diff --git a/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj b/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj index 2b1ca8e737..b38c09fa04 100644 --- a/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj +++ b/submodules/LegacyComponents/LegacyComponents_Xcode.xcodeproj/project.pbxproj @@ -996,16 +996,6 @@ D07BCA891F2B443700ED97AA /* TGMediaAssetsController.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA711F2B443700ED97AA /* TGMediaAssetsController.m */; }; D07BCA8A1F2B443700ED97AA /* TGMediaAssetsGifCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA721F2B443700ED97AA /* TGMediaAssetsGifCell.h */; }; D07BCA8B1F2B443700ED97AA /* TGMediaAssetsGifCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA731F2B443700ED97AA /* TGMediaAssetsGifCell.m */; }; - D07BCA8C1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA741F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.h */; }; - D07BCA8D1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA751F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.m */; }; - D07BCA8E1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA761F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.h */; }; - D07BCA8F1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA771F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.m */; }; - D07BCA901F2B443700ED97AA /* TGMediaAssetsMomentsController.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA781F2B443700ED97AA /* TGMediaAssetsMomentsController.h */; }; - D07BCA911F2B443700ED97AA /* TGMediaAssetsMomentsController.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA791F2B443700ED97AA /* TGMediaAssetsMomentsController.m */; }; - D07BCA921F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA7A1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.h */; }; - D07BCA931F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA7B1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.m */; }; - D07BCA941F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA7C1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.h */; }; - D07BCA951F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA7D1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.m */; }; D07BCA961F2B443700ED97AA /* TGMediaAssetsPhotoCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA7E1F2B443700ED97AA /* TGMediaAssetsPhotoCell.h */; }; D07BCA971F2B443700ED97AA /* TGMediaAssetsPhotoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BCA7F1F2B443700ED97AA /* TGMediaAssetsPhotoCell.m */; }; D07BCA981F2B443700ED97AA /* TGMediaAssetsPickerController.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BCA801F2B443700ED97AA /* TGMediaAssetsPickerController.h */; }; @@ -2169,16 +2159,6 @@ D07BCA711F2B443700ED97AA /* TGMediaAssetsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsController.m; sourceTree = ""; }; D07BCA721F2B443700ED97AA /* TGMediaAssetsGifCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsGifCell.h; sourceTree = ""; }; D07BCA731F2B443700ED97AA /* TGMediaAssetsGifCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsGifCell.m; sourceTree = ""; }; - D07BCA741F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsMomentsCollectionLayout.h; sourceTree = ""; }; - D07BCA751F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsMomentsCollectionLayout.m; sourceTree = ""; }; - D07BCA761F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsMomentsCollectionView.h; sourceTree = ""; }; - D07BCA771F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsMomentsCollectionView.m; sourceTree = ""; }; - D07BCA781F2B443700ED97AA /* TGMediaAssetsMomentsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsMomentsController.h; sourceTree = ""; }; - D07BCA791F2B443700ED97AA /* TGMediaAssetsMomentsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsMomentsController.m; sourceTree = ""; }; - D07BCA7A1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsMomentsSectionHeader.h; sourceTree = ""; }; - D07BCA7B1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsMomentsSectionHeader.m; sourceTree = ""; }; - D07BCA7C1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsMomentsSectionHeaderView.h; sourceTree = ""; }; - D07BCA7D1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsMomentsSectionHeaderView.m; sourceTree = ""; }; D07BCA7E1F2B443700ED97AA /* TGMediaAssetsPhotoCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsPhotoCell.h; sourceTree = ""; }; D07BCA7F1F2B443700ED97AA /* TGMediaAssetsPhotoCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMediaAssetsPhotoCell.m; sourceTree = ""; }; D07BCA801F2B443700ED97AA /* TGMediaAssetsPickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMediaAssetsPickerController.h; sourceTree = ""; }; @@ -3627,16 +3607,6 @@ D07BCA711F2B443700ED97AA /* TGMediaAssetsController.m */, D07BCA721F2B443700ED97AA /* TGMediaAssetsGifCell.h */, D07BCA731F2B443700ED97AA /* TGMediaAssetsGifCell.m */, - D07BCA741F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.h */, - D07BCA751F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.m */, - D07BCA761F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.h */, - D07BCA771F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.m */, - D07BCA781F2B443700ED97AA /* TGMediaAssetsMomentsController.h */, - D07BCA791F2B443700ED97AA /* TGMediaAssetsMomentsController.m */, - D07BCA7A1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.h */, - D07BCA7B1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.m */, - D07BCA7C1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.h */, - D07BCA7D1F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.m */, D07BCA7E1F2B443700ED97AA /* TGMediaAssetsPhotoCell.h */, D07BCA7F1F2B443700ED97AA /* TGMediaAssetsPhotoCell.m */, D07BCA801F2B443700ED97AA /* TGMediaAssetsPickerController.h */, @@ -3952,7 +3922,6 @@ D01777511F1F8FE60044446D /* LegacyComponentsGlobals.h in Headers */, D07BC9BE1F2A722400ED97AA /* TGHistogramView.h in Headers */, D01778211F1F961D0044446D /* TGMessageEntityPre.h in Headers */, - D07BCA8C1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.h in Headers */, D07BC91B1F2A380D00ED97AA /* TGPaintRender.h in Headers */, D07BCAA41F2B445E00ED97AA /* TGMediaGroupCell.h in Headers */, D0177A661F21FB9B0044446D /* TGModernGalleryItem.h in Headers */, @@ -3983,7 +3952,6 @@ D07BC9911F2A480800ED97AA /* TGStickerKeyboardTabCell.h in Headers */, D07BC9F91F2A9A2B00ED97AA /* TGMediaPickerGalleryInterfaceView.h in Headers */, D01778BA1F2009880044446D /* Freedom.h in Headers */, - D07BCA8E1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.h in Headers */, D0177A881F2219220044446D /* TGModernGalleryZoomableItemView.h in Headers */, D0177A321F21F1980044446D /* AVURLAsset+TGMediaItem.h in Headers */, D07BC7171F2A29B700ED97AA /* TGPhotoEditorController.h in Headers */, @@ -4131,7 +4099,6 @@ D01779711F2103FD0044446D /* TGPaintUndoManager.h in Headers */, D07BCAEF1F2B507600ED97AA /* TGAttachmentPhotoCell.h in Headers */, D07BC7B61F2A2BBE00ED97AA /* PGBlurTool.h in Headers */, - D07BCA921F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.h in Headers */, D07BC7881F2A2B3700ED97AA /* TGPhotoEditorTintSwatchView.h in Headers */, D07BC8221F2A2C0B00ED97AA /* PGShadowsTool.h in Headers */, D01778311F1F961D0044446D /* TGInstantPage.h in Headers */, @@ -4194,7 +4161,6 @@ D07BC9581F2A3EBF00ED97AA /* TGModernConversationAssociatedInputPanel.h in Headers */, D017795C1F2103440044446D /* PGPhotoEditorValues.h in Headers */, D07BC89B1F2A375800ED97AA /* TGPhotoCropRotationView.h in Headers */, - D07BCA941F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.h in Headers */, D0177AEF1F23DF6D0044446D /* TGImageDataSource.h in Headers */, D01777681F1F8FE60044446D /* TGUser.h in Headers */, D07BCA551F2A9E1600ED97AA /* TGDraggableCollectionView.h in Headers */, @@ -4304,7 +4270,6 @@ D017775E1F1F8FE60044446D /* TGBotComandInfo.h in Headers */, D07BC9071F2A380D00ED97AA /* TGPaintEllipticalBrush.h in Headers */, D07BC7701F2A2B3700ED97AA /* TGPhotoEditorCollectionView.h in Headers */, - D07BCA901F2B443700ED97AA /* TGMediaAssetsMomentsController.h in Headers */, D07BC86B1F2A2F3800ED97AA /* HPGrowingTextView.h in Headers */, D07BC8761F2A2F7B00ED97AA /* TGWeakDelegate.h in Headers */, D07BC8FF1F2A380D00ED97AA /* TGPaintBrush.h in Headers */, @@ -4846,7 +4811,6 @@ D07BCB791F2B6DB900ED97AA /* TGEmbedCoubPlayerView.m in Sources */, D07BCB231F2B646A00ED97AA /* TGTextField.m in Sources */, D017780B1F1F961D0044446D /* TGViaUserAttachment.m in Sources */, - D07BCA8F1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionView.m in Sources */, D07BC8A01F2A375800ED97AA /* TGPhotoCropView.m in Sources */, D0177AF01F23DF6D0044446D /* TGImageDataSource.m in Sources */, D01778BF1F200A9A0044446D /* UIScrollView+TGHacks.m in Sources */, @@ -4892,11 +4856,9 @@ D07BC9A31F2A49C200ED97AA /* TGItemPreviewController.m in Sources */, D01779301F20FFAC0044446D /* TGMediaAssetsLegacyLibrary.m in Sources */, D01778021F1F961D0044446D /* TGMessageViewCountContentProperty.m in Sources */, - D07BCA951F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeaderView.m in Sources */, D01779F11F2139980044446D /* POPAnimator.mm in Sources */, D01779F71F2139980044446D /* POPCGUtils.mm in Sources */, D07BCBB01F2B6F6300ED97AA /* CBCoubAudioSource.m in Sources */, - D07BCA931F2B443700ED97AA /* TGMediaAssetsMomentsSectionHeader.m in Sources */, D07BC9201F2A380D00ED97AA /* TGPaintShaderSet.m in Sources */, D01778261F1F961D0044446D /* TGMessageEntityUrl.m in Sources */, D07BCBEC1F2B72DC00ED97AA /* STKAutoRecoveringHTTPDataSource.m in Sources */, @@ -4984,7 +4946,6 @@ D01778101F1F961D0044446D /* TGMessageEntity.m in Sources */, D07BC7241F2A29E400ED97AA /* TGPhotoToolsController.m in Sources */, D07BC7AF1F2A2B8900ED97AA /* GPUImageTwoInputFilter.m in Sources */, - D07BCA8D1F2B443700ED97AA /* TGMediaAssetsMomentsCollectionLayout.m in Sources */, D0F7C9C51F55DA49005B255A /* TGVideoCameraMovieRecorder.m in Sources */, D07BC8D21F2A37EC00ED97AA /* TGPhotoPaintSparseView.m in Sources */, D07BCA561F2A9E1600ED97AA /* TGDraggableCollectionView.m in Sources */, @@ -5071,7 +5032,6 @@ D07BC7281F2A2A5300ED97AA /* UICollectionView+Utils.m in Sources */, D07BCB671F2B6A5600ED97AA /* TGEmbedPlayerState.m in Sources */, 092A65CA22EC4ADC0032E20C /* TGMediaPickerSendActionSheetController.m in Sources */, - D07BCA911F2B443700ED97AA /* TGMediaAssetsMomentsController.m in Sources */, D07BCBC41F2B6F6300ED97AA /* CBJSONCoubMapper.m in Sources */, D07BC7871F2A2B3700ED97AA /* TGPhotoEditorTabController.m in Sources */, D02660631F34A7F8000E2DC5 /* TGLocationPinView.m in Sources */, From 954c6ea100b69da1d47753205f03cd1d7e19f210 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 21 Aug 2019 02:00:49 +0300 Subject: [PATCH 18/86] Legacy send options menu improvements --- .../MediaSchedule@2x.png | Bin 0 -> 1004 bytes .../MediaSchedule@3x.png | Bin 0 -> 1453 bytes .../TGAttachmentCarouselItemView.h | 5 +- .../TGAttachmentCarouselItemView.m | 6 +- .../LegacyComponents/TGCameraController.h | 1 + .../LegacyComponents/TGCameraController.m | 1 + .../TGCameraPhotoPreviewController.h | 1 + .../TGMediaAssetsController.h | 7 +- .../TGMediaAssetsController.m | 14 +- .../TGMediaAssetsPickerController.m | 8 +- .../LegacyComponents/TGMediaAssetsUtils.h | 6 + .../TGMediaGroupsController.m | 1 - .../TGMediaPickerController.h | 1 + .../TGMediaPickerGalleryModel.h | 1 + .../TGMediaPickerModernGalleryMixin.h | 6 +- .../TGMediaPickerModernGalleryMixin.m | 28 ++-- .../TGMediaPickerSendActionSheetController.h | 3 +- .../TGMediaPickerSendActionSheetController.m | 139 +++++++++++++----- .../LegacyComponents/TGPassportAttachMenu.m | 2 +- .../Sources/LegacyAttachmentMenu.swift | 5 +- .../Sources/LegacyMediaPickers.swift | 1 + .../Sources/LegacyLocationPicker.swift | 4 +- 22 files changed, 169 insertions(+), 71 deletions(-) create mode 100644 submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaSchedule@2x.png create mode 100644 submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaSchedule@3x.png diff --git a/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaSchedule@2x.png b/submodules/LegacyComponents/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaSchedule@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2829293819e4a9149270f3a4c0b139939d1963bc GIT binary patch literal 1004 zcmV@82B$$v-p)+cq7q>VawC}q%GAG1636H7t zI@BCk5~svzaan8}yJX?9*y|1CO=Pb+Cd7r5j)!Uwij9Iuz7}or*tLGb1# z#YNHd&8a>rHUe_>ooL2hsJ>rh()KLv04W4RIH1lqqUpei+TX+mDShOOJatC$9AM(? zOzGW8kJezjo;(rF3DOChwc)BXnevyaZ*!XS9LRg_L|0XD!oP_tt9mOmMkM=H!~yb^ zwDHJ`bXf<`Njlk@pd@W8)^+PIm=9vmPu-gf- zsQL}=5QY(}q|1;4eh;piK8MnV3$(ohoWU{?a^Sa<*y!p-tK_g9kFTqKv8Z5~aUll^ zMIc~oUVWEDK1yr|oLb8`;iK;7A~nUp!m%$R-+)*!Y2F07D2qCQO|$RQS&xf@^FB&A zI#)rA6WGKybBG2PaEk&rsVXSr1h&jBbBM;cBu&vow3Zb??*yB~*h<%`8n(?UyM;;r4Vj~!pR__FBf<+gzJ0XLttuLaFZfrD)A!+yNgkiQ=_U8mD4U{I)L0{==fd~oy3xU|cnUvAZiJ?P>f_6!v2r-a~BCp!>JGtn+FKeH(&%SHzy>6@*p0n55 zd+qmq*0cBe+-GK{T2-JbP!*^OR0XO6Re`ENRiG-+uL4gg+D{wwEGG8y;&_=!Ec4h*hphpx}F>5<7&w!h6D}!WE&( zA2I$GXnMph+GfS>dm$!FI5$b4rV4J+g%54IB1*`2706b4 zk21Vf!KXbk`t7uZOGv*V688m5lr$ahej&9$ayhbh^?OV3ap7`cRHA^NH^t$1!IS(_ z=bm}OFPA{L-z;1be0)S2{7rgMBz}pI`%LGowGk+cV$5|&Ph)FT_;bOFL~|RgPg!#o%9O<|R8Qo4t$b8aJt2P3)DbwJ7$?4de#1x=cdqvR} zh47R(UJzCZF=Krd%94&*DuHNjek#B`X?rYau5(|>ai}my+WMw3!C2IW@}y&yN+5jG zar@DY8Fw#62O26Hj*~i7mL*4@fOO1K3WR^A0D&Jz{P(hUqtmm2d7DyLYJuS72a)*{ zM92Bqri->B2=(f?8>YBs{gO^$%((5tB%O7umoGW%1sb<3>RgXMbf+B&)_3+4ztN6j#5o)<*6Hj<-DSBq zEtoqw4>#e|1|eulV}4@&KTtlENWBPj*HvIgN_FJx9RX2thy+*bm%1c3wlr*zy~!i| z`^MxD39gnqb!lbObkYmX;|ngIBFkRU5n<6dW4rVVVL8psbM?1VQaRdZw3Z@E*KU={+rpF1MH$sf|Ez z^L(>zxl+k_7c_TgP0V04D}(_D!^ts6xLJYVp56F#;@3@lVkylA`|N`d=LGv?n3?ji zt`r;e!yzK@8JEwwRwO#ZHNwyahf9Lx23I)uYJNn65PuvP+TdWtAr05wjWv@0$_km| zy)*eQAhEqTaD?k1#-Ee?Dj$M8#Xg%Gv0`ry+y?stm12)JT8P;LojfCaEG)(flz5JcG2`~jlJK-s9Pv#IVy#$X?KUr@ z5XAbxC%*qT#x?^pTEFRLD?KUAz4*w!WuX`&%h3k~-{X#Ry0}l+E$~NzSz(j#w1E94 zFjOxHH-ziLcLF0+wW>f>pej%ms0vgCssdGksz6nscm@6e(-FB)yp37_00000NkvXX Hu0mjfpX;>3 literal 0 HcmV?d00001 diff --git a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h index 83a96e3f62..3f218c9302 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h +++ b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h @@ -2,6 +2,8 @@ #import #import +#import + @class TGMediaSelectionContext; @class TGMediaEditingContext; @class TGSuggestionContext; @@ -29,12 +31,13 @@ @property (nonatomic) bool inhibitMute; @property (nonatomic) bool disableStickers; @property (nonatomic) bool hasSilentPosting; +@property (nonatomic) bool hasSchedule; @property (nonatomic, strong) NSArray *underlyingViews; @property (nonatomic, assign) bool openEditor; @property (nonatomic, copy) void (^cameraPressed)(TGAttachmentCameraView *cameraView); -@property (nonatomic, copy) void (^sendPressed)(TGMediaAsset *currentItem, bool asFiles, bool silentPosting); +@property (nonatomic, copy) void (^sendPressed)(TGMediaAsset *currentItem, bool asFiles, TGMediaPickerGalleryCompletionMode mode); @property (nonatomic, copy) void (^avatarCompletionBlock)(UIImage *image); @property (nonatomic, copy) void (^editorOpened)(void); diff --git a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m index 549af5be97..8f78600fb8 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m +++ b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m @@ -774,14 +774,14 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; strongSelf->_galleryMixin = nil; }; - mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, bool silentPosting) + mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, TGMediaPickerGalleryCompletionMode mode) { __strong TGAttachmentCarouselItemView *strongSelf = weakSelf; if (strongSelf != nil && strongSelf.sendPressed != nil) { if (strongSelf->_selectionContext.allowGrouping) [[NSUserDefaults standardUserDefaults] setObject:@(!strongSelf->_selectionContext.grouping) forKey:@"TG_mediaGroupingDisabled_v0"]; - strongSelf.sendPressed(item.asset, strongSelf.asFile, silentPosting); + strongSelf.sendPressed(item.asset, strongSelf.asFile, mode); } }; @@ -801,7 +801,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; if ([cell isKindOfClass:[TGAttachmentAssetCell class]]) thumbnailImage = cell.imageView.image; - TGMediaPickerModernGalleryMixin *mixin = [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:asset fetchResult:_fetchResult parentController:self.parentController thumbnailImage:thumbnailImage selectionContext:_selectionContext editingContext:_editingContext suggestionContext:self.suggestionContext hasCaptions:(_allowCaptions && !_forProfilePhoto) allowCaptionEntities:self.allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:_inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:self.asFile itemsLimit:TGAttachmentDisplayedAssetLimit recipientName:self.recipientName hasSilentPosting:self.hasSilentPosting]; + TGMediaPickerModernGalleryMixin *mixin = [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:asset fetchResult:_fetchResult parentController:self.parentController thumbnailImage:thumbnailImage selectionContext:_selectionContext editingContext:_editingContext suggestionContext:self.suggestionContext hasCaptions:(_allowCaptions && !_forProfilePhoto) allowCaptionEntities:self.allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:_inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:self.asFile itemsLimit:TGAttachmentDisplayedAssetLimit recipientName:self.recipientName hasSilentPosting:self.hasSilentPosting hasSchedule:self.hasSchedule]; __weak TGAttachmentCarouselItemView *weakSelf = self; mixin.thumbnailSignalForItem = ^SSignal *(id item) diff --git a/submodules/LegacyComponents/LegacyComponents/TGCameraController.h b/submodules/LegacyComponents/LegacyComponents/TGCameraController.h index bc792c72fb..2169853fb3 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGCameraController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGCameraController.h @@ -36,6 +36,7 @@ typedef enum { @property (nonatomic, assign) bool inhibitMute; @property (nonatomic, assign) bool hasTimer; @property (nonatomic, assign) bool hasSilentPosting; +@property (nonatomic, assign) bool hasSchedule; @property (nonatomic, strong) TGSuggestionContext *suggestionContext; @property (nonatomic, assign) bool shortcut; diff --git a/submodules/LegacyComponents/LegacyComponents/TGCameraController.m b/submodules/LegacyComponents/LegacyComponents/TGCameraController.m index f811b49866..6c104bdb28 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGCameraController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGCameraController.m @@ -1621,6 +1621,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus controller.suggestionContext = self.suggestionContext; controller.hasTimer = self.hasTimer; controller.hasSilentPosting = self.hasSilentPosting; + controller.hasSchedule = self.hasSchedule; __weak TGCameraPhotoPreviewController *weakController = controller; controller.beginTransitionIn = ^CGRect diff --git a/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h b/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h index 2824bd59de..19ad139c2a 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGCameraPhotoPreviewController.h @@ -24,6 +24,7 @@ @property (nonatomic, assign) bool shouldStoreAssets; @property (nonatomic, assign) bool hasTimer; @property (nonatomic, assign) bool hasSilentPosting; +@property (nonatomic, assign) bool hasSchedule; - (instancetype)initWithContext:(id)context image:(UIImage *)image metadata:(PGCameraShotMetadata *)metadata recipientName:(NSString *)recipientName saveCapturedMedia:(bool)saveCapturedMedia saveEditedPhotos:(bool)saveEditedPhotos; - (instancetype)initWithContext:(id)context image:(UIImage *)image metadata:(PGCameraShotMetadata *)metadata recipientName:(NSString *)recipientName backButtonTitle:(NSString *)backButtonTitle doneButtonTitle:(NSString *)doneButtonTitle saveCapturedMedia:(bool)saveCapturedMedia saveEditedPhotos:(bool)saveEditedPhotos; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h index 0abe8f975d..2264bdf0f9 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h @@ -4,6 +4,8 @@ #import #import +#import + @class TGMediaAssetsPickerController; @class TGViewController; @@ -56,6 +58,7 @@ typedef enum @property (nonatomic, assign) bool onlyCrop; @property (nonatomic, assign) bool inhibitMute; @property (nonatomic, assign) bool hasSilentPosting; +@property (nonatomic, assign) bool hasSchedule; @property (nonatomic, assign) bool liveVideoUploadEnabled; @property (nonatomic, assign) bool shouldShowFileTipIfNeeded; @@ -64,7 +67,7 @@ typedef enum @property (nonatomic, copy) NSDictionary *(^descriptionGenerator)(id, NSString *, NSArray *, NSString *); @property (nonatomic, copy) void (^avatarCompletionBlock)(UIImage *image); -@property (nonatomic, copy) void (^completionBlock)(NSArray *signals, bool silentPosting); +@property (nonatomic, copy) void (^completionBlock)(NSArray *signals, TGMediaPickerGalleryCompletionMode mode); @property (nonatomic, copy) void (^singleCompletionBlock)(id item, TGMediaEditingContext *editingContext); @property (nonatomic, copy) void (^dismissalBlock)(void); @property (nonatomic, copy) void (^selectionBlock)(TGMediaAsset *asset, UIImage *); @@ -82,7 +85,7 @@ typedef enum - (NSArray *)resultSignalsWithCurrentItem:(TGMediaAsset *)currentItem descriptionGenerator:(id (^)(id, NSString *, NSArray *, NSString *))descriptionGenerator; - (void)completeWithAvatarImage:(UIImage *)image; -- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem silentPosting:(bool)silentPosting; +- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem mode:(TGMediaPickerGalleryCompletionMode)mode; - (void)dismiss; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m index 89a4ed425f..36417330bc 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m @@ -2,7 +2,6 @@ #import "LegacyComponentsInternal.h" -#import "TGMediaAssetsMomentsController.h" #import "TGMediaGroupsController.h" #import @@ -122,6 +121,7 @@ pickerController.hasTimer = strongController.hasTimer; pickerController.onlyCrop = strongController.onlyCrop; pickerController.hasSilentPosting = strongController.hasSilentPosting; + pickerController.hasSchedule = strongController.hasSchedule; [strongController pushViewController:pickerController animated:true]; }; [groupsController loadViewIfNeeded]; @@ -207,6 +207,12 @@ self.pickerController.hasSilentPosting = hasSilentPosting; } +- (void)setHasSchedule:(bool)hasSchedule +{ + _hasSchedule = hasSchedule; + self.pickerController.hasSchedule = hasSchedule; +} + - (void)setOnlyCrop:(bool)onlyCrop { _onlyCrop = onlyCrop; @@ -451,7 +457,7 @@ { __strong TGMediaAssetsController *strongSelf = weakSelf; if (strongSelf != nil) - [strongSelf completeWithCurrentItem:nil silentPosting:false]; + [strongSelf completeWithCurrentItem:nil mode:TGMediaPickerGalleryCompletionModeGeneric]; }; } @@ -532,12 +538,12 @@ self.avatarCompletionBlock(image); } -- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem silentPosting:(bool)silentPosting +- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem mode:(TGMediaPickerGalleryCompletionMode)mode { if (self.completionBlock != nil) { NSArray *signals = [self resultSignalsWithCurrentItem:currentItem descriptionGenerator:self.descriptionGenerator]; - self.completionBlock(signals, silentPosting); + self.completionBlock(signals, mode); } else if (self.singleCompletionBlock != nil) { diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m index 77b0799cb5..acad64e531 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m @@ -10,6 +10,8 @@ #import "TGMediaAssetsVideoCell.h" #import "TGMediaAssetsGifCell.h" +#import + #import #import #import @@ -309,19 +311,19 @@ strongSelf->_galleryMixin = nil; }; - mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, bool silentPosting) + mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, TGMediaPickerGalleryCompletionMode mode) { __strong TGMediaAssetsPickerController *strongSelf = weakSelf; if (strongSelf == nil) return; - [(TGMediaAssetsController *)strongSelf.navigationController completeWithCurrentItem:item.asset silentPosting:silentPosting]; + [(TGMediaAssetsController *)strongSelf.navigationController completeWithCurrentItem:item.asset mode:mode]; }; } - (TGMediaPickerModernGalleryMixin *)_galleryMixinForContext:(id)context item:(id)item thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities inhibitDocumentCaptions:(bool)inhibitDocumentCaptions asFile:(bool)asFile { - return [[TGMediaPickerModernGalleryMixin alloc] initWithContext:context item:item fetchResult:_fetchResult parentController:self thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:asFile itemsLimit:0 recipientName:self.recipientName hasSilentPosting:self.hasSilentPosting]; + return [[TGMediaPickerModernGalleryMixin alloc] initWithContext:context item:item fetchResult:_fetchResult parentController:self thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:asFile itemsLimit:0 recipientName:self.recipientName hasSilentPosting:self.hasSilentPosting hasSchedule:self.hasSchedule]; } - (TGMediaPickerModernGalleryMixin *)galleryMixinForIndexPath:(NSIndexPath *)indexPath previewMode:(bool)previewMode outAsset:(TGMediaAsset **)outAsset diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h index b4d5ed7c8e..993fedd8a3 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h @@ -4,6 +4,12 @@ @class TGMediaAsset; @class TGMediaSelectionContext; +typedef NS_ENUM(NSUInteger, TGMediaPickerGalleryCompletionMode) { + TGMediaPickerGalleryCompletionModeGeneric, + TGMediaPickerGalleryCompletionModeSilent, + TGMediaPickerGalleryCompletionModeSchedule +}; + @interface TGMediaAssetsPreheatMixin : NSObject @property (nonatomic, copy) NSInteger (^assetCount)(void); diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaGroupsController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaGroupsController.m index 6a74569f59..eeaac76abf 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaGroupsController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaGroupsController.m @@ -6,7 +6,6 @@ #import #import "TGMediaAssetsPickerController.h" -#import "TGMediaAssetsMomentsController.h" #import diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h index 98a355ba8e..cf734aa4f2 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h @@ -28,6 +28,7 @@ @property (nonatomic, assign) bool inhibitMute; @property (nonatomic, strong) NSString *recipientName; @property (nonatomic, assign) bool hasSilentPosting; +@property (nonatomic, assign) bool hasSchedule; @property (nonatomic, strong) TGMediaAssetsPallete *pallete; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h index 0d590719df..40d8da8921 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerGalleryModel.h @@ -5,6 +5,7 @@ #import +#import #import @class TGModernGalleryController; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h index 7a2dfbdf6d..8e4401c5c8 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h @@ -22,14 +22,14 @@ @property (nonatomic, copy) void (^didTransitionOut)(); @property (nonatomic, copy) UIView *(^referenceViewForItem)(TGMediaPickerGalleryItem *); -@property (nonatomic, copy) void (^completeWithItem)(TGMediaPickerGalleryItem *item, bool silentPosting); +@property (nonatomic, copy) void (^completeWithItem)(TGMediaPickerGalleryItem *item, TGMediaPickerGalleryCompletionMode mode); @property (nonatomic, copy) void (^editorOpened)(void); @property (nonatomic, copy) void (^editorClosed)(void); -- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting; +- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule; -- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit hasSilentPosting:(bool)hasSilentPosting; +- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule; - (void)present; - (void)updateWithFetchResult:(TGMediaAssetFetchResult *)fetchResult; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m index c14a6c4602..29960e53d3 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m @@ -39,17 +39,17 @@ @implementation TGMediaPickerModernGalleryMixin -- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting +- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule { - return [self initWithContext:context item:item fetchResult:fetchResult momentList:nil parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:recipientName hasSilentPosting: hasSilentPosting]; + return [self initWithContext:context item:item fetchResult:fetchResult momentList:nil parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:recipientName hasSilentPosting:hasSilentPosting hasSchedule:hasSchedule]; } -- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit hasSilentPosting:(bool)hasSilentPosting +- (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule { - return [self initWithContext:context item:item fetchResult:nil momentList:momentList parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:nil hasSilentPosting: hasSilentPosting]; + return [self initWithContext:context item:item fetchResult:nil momentList:momentList parentController:parentController thumbnailImage:thumbnailImage selectionContext:selectionContext editingContext:editingContext suggestionContext:suggestionContext hasCaptions:hasCaptions allowCaptionEntities:allowCaptionEntities hasTimer:hasTimer onlyCrop:onlyCrop inhibitDocumentCaptions:inhibitDocumentCaptions inhibitMute:inhibitMute asFile:asFile itemsLimit:itemsLimit recipientName:nil hasSilentPosting:hasSilentPosting hasSchedule:hasSchedule]; } -- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting +- (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule { self = [super init]; if (self != nil) @@ -141,13 +141,13 @@ model.interfaceView.doneLongPressed = ^(TGMediaPickerGalleryItem *item) { __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; - if (strongSelf == nil || !hasSilentPosting) + if (strongSelf == nil || !(hasSilentPosting || hasSchedule)) return; UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium]; [generator impactOccurred]; - TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame]; + TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting]; controller.send = ^{ __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; if (strongSelf == nil) @@ -156,17 +156,27 @@ strongSelf->_galleryModel.dismiss(true, false); if (strongSelf.completeWithItem != nil) - strongSelf.completeWithItem(item, false); + strongSelf.completeWithItem(item, TGMediaPickerGalleryCompletionModeGeneric); }; controller.sendSilently = ^{ __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; if (strongSelf == nil) return; + strongSelf->_galleryModel.dismiss(true, TGMediaPickerGalleryCompletionModeSilent); + + if (strongSelf.completeWithItem != nil) + strongSelf.completeWithItem(item, true); + }; + controller.schedule = ^{ + __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; + if (strongSelf == nil) + return; + strongSelf->_galleryModel.dismiss(true, false); if (strongSelf.completeWithItem != nil) - strongSelf.completeWithItem(item, true); + strongSelf.completeWithItem(item, TGMediaPickerGalleryCompletionModeSchedule); }; TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:[strongSelf->_context makeOverlayWindowManager] parentController:strongSelf->_parentController contentController:controller]; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h index 201947a0ba..3506eb0908 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h @@ -6,8 +6,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy) void (^send)(void); @property (nonatomic, copy) void (^sendSilently)(void); +@property (nonatomic, copy) void (^schedule)(void); -- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame; +- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame canSendSilently:(bool)canSendSilently; @end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m index f4f21cb014..d27edeb0c4 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m @@ -6,30 +6,96 @@ #import "TGModernButton.h" #import "TGMediaAssetsController.h" +@interface TGMediaPickerSendActionSheetItemView : UIView +{ + TGModernButton *_buttonView; + UILabel *_buttonLabel; + UIImageView *_buttonIcon; +} + +@property (nonatomic, readonly) UILabel *buttonLabel; +@property (nonatomic, copy) void (^pressed)(void); + +@end + +@implementation TGMediaPickerSendActionSheetItemView + +- (instancetype)initWithTitle:(NSString *)title icon:(UIImage *)icon { + self = [super init]; + if (self != nil) { + _buttonView = [[TGModernButton alloc] init]; + _buttonView.adjustsImageWhenHighlighted = false; + + __weak TGMediaPickerSendActionSheetItemView *weakSelf = self; + _buttonView.highlitedChanged = ^(bool highlighted) { + __strong TGMediaPickerSendActionSheetItemView *strongSelf = weakSelf; + if (strongSelf != nil) { + if (highlighted) { + strongSelf->_buttonView.backgroundColor = UIColorRGB(0x363636); + } else { + strongSelf->_buttonView.backgroundColor = [UIColor clearColor]; + } + } + }; + [_buttonView addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; + [self addSubview:_buttonView]; + + _buttonLabel = [[UILabel alloc] init]; + _buttonLabel.font = TGSystemFontOfSize(17.0f); + _buttonLabel.text = title; + _buttonLabel.textColor = [UIColor whiteColor]; + [_buttonLabel sizeToFit]; + _buttonLabel.userInteractionEnabled = false; + [self addSubview:_buttonLabel]; + + _buttonIcon = [[UIImageView alloc] init]; + _buttonIcon.image = TGTintedImage(icon, [UIColor whiteColor]); + [_buttonIcon sizeToFit]; + [self addSubview:_buttonIcon]; + } + return self; +} + +- (void)buttonPressed { + if (self.pressed != nil) + self.pressed(); +} + +- (void)layoutSubviews { + _buttonLabel.frame = CGRectMake(16.0, 11.0, _buttonLabel.frame.size.width, _buttonLabel.frame.size.height); + _buttonView.frame = self.bounds; + _buttonIcon.frame = CGRectMake(self.bounds.size.width - _buttonIcon.frame.size.width - 12.0, 9.0, _buttonIcon.frame.size.width, _buttonIcon.frame.size.height); +} + +@end + @interface TGMediaPickerSendActionSheetController () { id _context; CGRect _sendButtonFrame; + bool _canSendSilently; bool _autorotationWasEnabled; + bool _dismissed; UIVisualEffectView *_effectView; TGModernButton *_sendButton; UIView *_containerView; - TGModernButton *_buttonView; - UILabel *_buttonLabel; - UIImageView *_buttonIcon; + UIView *_separatorView; + TGMediaPickerSendActionSheetItemView *_sendSilentlyButton; + TGMediaPickerSendActionSheetItemView *_scheduleButton; } @end @implementation TGMediaPickerSendActionSheetController -- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame { +- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame canSendSilently:(bool)canSendSilently { self = [super initWithContext:context]; if (self != nil) { _context = context; _sendButtonFrame = sendButtonFrame; + _canSendSilently = canSendSilently; } return self; } @@ -49,34 +115,13 @@ _containerView.layer.cornerRadius = 12.0; [self.view addSubview:_containerView]; - __weak TGMediaPickerSendActionSheetController *weakSelf = self; - _buttonView = [[TGModernButton alloc] init]; - _buttonView.adjustsImageWhenHighlighted = false; - _buttonView.highlitedChanged = ^(bool highlighted) { - __strong TGMediaPickerSendActionSheetController *strongSelf = weakSelf; - if (strongSelf != nil) { - if (highlighted) { - strongSelf->_buttonView.backgroundColor = UIColorRGB(0x363636); - } else { - strongSelf->_buttonView.backgroundColor = [UIColor clearColor]; - } - } - }; - [_buttonView addTarget:self action:@selector(sendSilentlyPressed) forControlEvents:UIControlEventTouchUpInside]; - [_containerView addSubview:_buttonView]; + if (_canSendSilently) { + _sendSilentlyButton = [[TGMediaPickerSendActionSheetItemView alloc] initWithTitle:TGLocalized(@"Conversation.SendMessage.SendSilently") icon:TGComponentsImageNamed(@"MediaMute")]; + [_containerView addSubview:_sendSilentlyButton]; + } - _buttonLabel = [[UILabel alloc] init]; - _buttonLabel.font = TGSystemFontOfSize(17.0f); - _buttonLabel.text = TGLocalized(@"Conversation.SendMessage.SendSilently"); - _buttonLabel.textColor = [UIColor whiteColor]; - [_buttonLabel sizeToFit]; - _buttonLabel.userInteractionEnabled = false; - [_containerView addSubview:_buttonLabel]; - - _buttonIcon = [[UIImageView alloc] init]; - _buttonIcon.image = TGTintedImage(TGComponentsImageNamed(@"MediaMute"), [UIColor whiteColor]); - [_buttonIcon sizeToFit]; - [_containerView addSubview:_buttonIcon]; + _scheduleButton = [[TGMediaPickerSendActionSheetItemView alloc] initWithTitle:TGLocalized(@"Conversation.SendMessage.ScheduleMessage") icon:TGComponentsImageNamed(@"MediaSchedule")]; + [_containerView addSubview:_scheduleButton]; TGMediaAssetsPallete *pallete = nil; if ([[LegacyComponentsGlobals provider] respondsToSelector:@selector(mediaAssetsPallete)]) @@ -136,18 +181,20 @@ CGPoint targetPosition = _containerView.center; _containerView.center = CGPointMake(targetPosition.x + 160.0, targetPosition.y + 44.0); - [UIView animateWithDuration:0.3 delay:0.0 options:7 << 16 animations:^{ + _containerView.transform = CGAffineTransformMakeScale(0.1, 0.1); + [UIView animateWithDuration:0.42 delay:0.0 usingSpringWithDamping:104.0 initialSpringVelocity:0.0 options:kNilOptions animations:^{ + _containerView.transform = CGAffineTransformIdentity; _containerView.center = targetPosition; } completion:nil]; _containerView.alpha = 0.0f; - [UIView animateWithDuration:0.3 animations:^{ + [UIView animateWithDuration:0.2 animations:^{ _containerView.alpha = 1.0f; }]; } - (void)animateOut:(bool)cancel { - [UIView animateWithDuration:0.3 animations:^{ + [UIView animateWithDuration:0.2 animations:^{ if (iosMajorVersion() >= 9) { _effectView.effect = nil; } else { @@ -162,8 +209,10 @@ }]; if (cancel) { + _dismissed = true; [UIView animateWithDuration:0.3 delay:0.0 options:7 << 16 animations:^{ _containerView.center = CGPointMake(_containerView.center.x + 160.0, _containerView.center.y + 44.0); + _containerView.transform = CGAffineTransformMakeScale(0.1, 0.1); } completion:^(BOOL finished) { [self dismiss]; }]; @@ -178,11 +227,16 @@ _effectView.frame = self.view.bounds; _sendButton.frame = _sendButtonFrame; - _buttonLabel.frame = CGRectMake(16.0, 11.0, _buttonLabel.frame.size.width, _buttonLabel.frame.size.height); - CGFloat containerWidth = MAX(240.0, _buttonLabel.frame.size.width + 84.0); - _containerView.frame = CGRectMake(CGRectGetMaxX(_sendButtonFrame) - containerWidth - 8.0, _sendButtonFrame.origin.y - 44.0 - 4.0, containerWidth, 44.0); - _buttonView.frame = _containerView.bounds; - _buttonIcon.frame = CGRectMake(_containerView.frame.size.width - _buttonIcon.frame.size.width - 12.0, 9.0, _buttonIcon.frame.size.width, _buttonIcon.frame.size.height); + CGFloat itemHeight = 44.0; + CGFloat containerWidth = 240.0; + CGFloat containerHeight = _canSendSilently ? itemHeight * 2.0 : itemHeight; + containerWidth = MAX(containerWidth, MAX(_sendSilentlyButton.buttonLabel.frame.size.width, _scheduleButton.buttonLabel.frame.size.width) + 84.0); + if (!_dismissed) { + _containerView.frame = CGRectMake(CGRectGetMaxX(_sendButtonFrame) - containerWidth - 8.0, _sendButtonFrame.origin.y - containerHeight - 4.0, containerWidth, containerHeight); + } + + _sendSilentlyButton.frame = CGRectMake(0.0, 0.0, containerWidth, itemHeight); + _scheduleButton.frame = CGRectMake(0.0, containerHeight - itemHeight, containerWidth, itemHeight); } - (void)sendPressed { @@ -199,4 +253,11 @@ self.sendSilently(); } +- (void)schedulePressed { + [self animateOut:false]; + + if (self.schedule != nil) + self.schedule(); +} + @end diff --git a/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m b/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m index 2372fe11d1..606e7184c4 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m +++ b/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m @@ -67,7 +67,7 @@ [TGPassportAttachMenu _displayCameraWithView:cameraView menuController:strongController parentController:strongParentController context:context intent:intent uploadAction:uploadAction]; }; - carouselItem.sendPressed = ^(TGMediaAsset *currentItem, __unused bool asFiles, __unused bool silentPosting) + carouselItem.sendPressed = ^(TGMediaAsset *currentItem, __unused bool asFiles, __unused TGMediaPickerGalleryCompletionMode mode) { __strong TGMenuSheetController *strongController = weakController; if (strongController == nil) diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift index ef30d071f5..fce72c2ae6 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift @@ -76,7 +76,8 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaO } carouselItem.hasSilentPosting = !isSecretChat } - carouselItem.sendPressed = { [weak controller, weak carouselItem] currentItem, asFiles, silentPosting in + carouselItem.hasSchedule = !isSecretChat + carouselItem.sendPressed = { [weak controller, weak carouselItem] currentItem, asFiles, mode in if let controller = controller, let carouselItem = carouselItem { let intent: TGMediaAssetsControllerIntent = asFiles ? TGMediaAssetsControllerSendFileIntent : TGMediaAssetsControllerSendMediaIntent let signals = TGMediaAssetsController.resultSignals(for: carouselItem.selectionContext, editingContext: carouselItem.editingContext, intent: intent, currentItem: currentItem, storeAssets: true, useMediaCache: false, descriptionGenerator: legacyAssetPickerItemGenerator(), saveEditedPhotos: saveEditedPhotos) @@ -84,7 +85,7 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaO presentCantSendMultipleFiles() } else { controller.dismiss(animated: true) - sendMessagesWithSignals(signals, silentPosting) + sendMessagesWithSignals(signals, false) } } }; diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift index a5975fa6f0..dc772c8dca 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift @@ -29,6 +29,7 @@ public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, co } controller.hasSilentPosting = !isSecretChat } + controller.hasSchedule = !isSecretChat controller.dismissalBlock = { } controller.selectionLimitExceeded = { diff --git a/submodules/LocationUI/Sources/LegacyLocationPicker.swift b/submodules/LocationUI/Sources/LegacyLocationPicker.swift index fe5e92e4e6..7e277d6947 100644 --- a/submodules/LocationUI/Sources/LegacyLocationPicker.swift +++ b/submodules/LocationUI/Sources/LegacyLocationPicker.swift @@ -13,7 +13,7 @@ private func generateClearIcon(color: UIColor) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Clear"), color: color) } -public func legacyLocationPickerController(context: AccountContext, selfPeer: Peer, peer: Peer, sendLocation: @escaping (CLLocationCoordinate2D, MapVenue?, String?) -> Void, sendLiveLocation: @escaping (CLLocationCoordinate2D, Int32) -> Void, theme: PresentationTheme, customLocationPicker: Bool = false, presentationCompleted: @escaping () -> Void = {}) -> ViewController { +public func legacyLocationPickerController(context: AccountContext, selfPeer: Peer, peer: Peer, sendLocation: @escaping (CLLocationCoordinate2D, MapVenue?, String?) -> Void, sendLiveLocation: @escaping (CLLocationCoordinate2D, Int32) -> Void, theme: PresentationTheme, customLocationPicker: Bool = false, hasLiveLocation: Bool = true, presentationCompleted: @escaping () -> Void = {}) -> ViewController { let legacyController = LegacyController(presentation: .modal(animateIn: true), theme: theme) legacyController.presentationCompleted = { presentationCompleted() @@ -27,7 +27,7 @@ public func legacyLocationPickerController(context: AccountContext, selfPeer: Pe Namespaces.Peer.CloudGroup, Namespaces.Peer.CloudUser ]) - if namespacesWithEnabledLiveLocation.contains(peer.id.namespace) && !customLocationPicker { + if namespacesWithEnabledLiveLocation.contains(peer.id.namespace) && !customLocationPicker && hasLiveLocation { controller.allowLiveLocationSharing = true } let navigationController = TGNavigationController(controllers: [controller])! From 4b6c54f84a7f5e4c70897d9e90588efa86794afd Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 21 Aug 2019 02:02:16 +0300 Subject: [PATCH 19/86] Scheduled Messages API improvements --- .../GalleryUI/Sources/GalleryController.swift | 2 +- submodules/Postbox/Postbox/Message.swift | 17 +++ .../Postbox/Postbox/MessageHistoryTable.swift | 13 +- .../Postbox/Postbox/MessageHistoryView.swift | 23 +--- .../Postbox/MessageHistoryViewState.swift | 10 +- submodules/Postbox/Postbox/Postbox.swift | 16 +-- .../AccountIntermediateState.swift | 18 ++- .../AccountStateManagementUtils.swift | 26 +++- .../TelegramCore/AccountViewTracker.swift | 27 ++-- .../TelegramCore/ApplyUpdateMessage.swift | 13 +- .../CloudChatRemoveMessagesOperation.swift | 50 +++++-- .../DeleteMessagesInteractively.swift | 41 +++--- .../TelegramCore/EnqueueMessage.swift | 2 + .../HistoryViewStateValidation.swift | 6 +- .../LoadMessagesIfNecessary.swift | 1 - ...gedCloudChatRemoveMessagesOperations.swift | 127 +++++++++--------- .../TelegramCore/MessageUtils.swift | 10 ++ .../TelegramCore/TelegramCore/Network.swift | 2 +- .../TelegramCore/PendingMessageManager.swift | 2 +- .../TelegramCore/RequestEditMessage.swift | 68 +++++----- .../TelegramCore/SingleMessageView.swift | 8 +- 21 files changed, 298 insertions(+), 184 deletions(-) diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index 5b4c9ef05d..717ea2eaca 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -368,7 +368,7 @@ public class GalleryController: ViewController { switch source { case .peerMessagesAtId: if let tags = tagsForMessage(message!) { - let namespaces: HistoryViewNamespaces + let namespaces: MessageIdNamespaces if Namespaces.Message.allScheduled.contains(message!.id.namespace) { namespaces = .just(Namespaces.Message.allScheduled) } else { diff --git a/submodules/Postbox/Postbox/Message.swift b/submodules/Postbox/Postbox/Message.swift index d2f402bd53..aef32af5b9 100644 --- a/submodules/Postbox/Postbox/Message.swift +++ b/submodules/Postbox/Postbox/Message.swift @@ -726,3 +726,20 @@ final class InternalStoreMessage { self.media = media } } + +public enum MessageIdNamespaces { + case all + case just(Set) + case not(Set) + + public func contains(_ namespace: MessageId.Namespace) -> Bool { + switch self { + case .all: + return true + case let .just(namespaces): + return namespaces.contains(namespace) + case let .not(namespaces): + return !namespaces.contains(namespace) + } + } +} diff --git a/submodules/Postbox/Postbox/MessageHistoryTable.swift b/submodules/Postbox/Postbox/MessageHistoryTable.swift index 644d81e914..701d92990a 100644 --- a/submodules/Postbox/Postbox/MessageHistoryTable.swift +++ b/submodules/Postbox/Postbox/MessageHistoryTable.swift @@ -2422,9 +2422,18 @@ final class MessageHistoryTable: Table { return messageIds } - func allMessageIndices(peerId: PeerId) -> [MessageIndex] { + func allMessageIndices(peerId: PeerId, namespace: MessageId.Namespace? = nil) -> [MessageIndex] { var messages: [MessageIndex] = [] - self.valueBox.range(self.table, start: self.key(MessageIndex.lowerBound(peerId: peerId)).predecessor, end: self.key(MessageIndex.upperBound(peerId: peerId)).successor, keys: { key in + let start: ValueBoxKey + let end: ValueBoxKey + if let namespace = namespace { + start = self.lowerBound(peerId: peerId, namespace: namespace) + end = self.upperBound(peerId: peerId, namespace: namespace) + } else { + start = self.key(MessageIndex.lowerBound(peerId: peerId)).predecessor + end = self.key(MessageIndex.upperBound(peerId: peerId)).successor + } + self.valueBox.range(self.table, start: start, end: end, keys: { key in messages.append(extractKey(key)) return true }, limit: 0) diff --git a/submodules/Postbox/Postbox/MessageHistoryView.swift b/submodules/Postbox/Postbox/MessageHistoryView.swift index c21ad9de35..0a5aed86a2 100644 --- a/submodules/Postbox/Postbox/MessageHistoryView.swift +++ b/submodules/Postbox/Postbox/MessageHistoryView.swift @@ -224,27 +224,10 @@ public enum HistoryViewInputAnchor: Equatable { case unread } -public enum HistoryViewNamespaces { - case all - case just(Set) - case not(Set) - - public func contains(_ namespace: MessageId.Namespace) -> Bool { - switch self { - case .all: - return true - case let .just(namespaces): - return namespaces.contains(namespace) - case let .not(namespaces): - return !namespaces.contains(namespace) - } - } -} - final class MutableMessageHistoryView { private(set) var peerIds: MessageHistoryViewPeerIds let tag: MessageTags? - let namespaces: HistoryViewNamespaces + let namespaces: MessageIdNamespaces private let orderStatistics: MessageHistoryViewOrderStatistics private let anchor: HistoryViewInputAnchor @@ -259,7 +242,7 @@ final class MutableMessageHistoryView { fileprivate(set) var sampledState: HistoryViewSample - init(postbox: Postbox, orderStatistics: MessageHistoryViewOrderStatistics, peerIds: MessageHistoryViewPeerIds, anchor inputAnchor: HistoryViewInputAnchor, combinedReadStates: MessageHistoryViewReadState?, transientReadStates: MessageHistoryViewReadState?, tag: MessageTags?, namespaces: HistoryViewNamespaces, count: Int, topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?], additionalDatas: [AdditionalMessageHistoryViewDataEntry], getMessageCountInRange: (MessageIndex, MessageIndex) -> Int32) { + init(postbox: Postbox, orderStatistics: MessageHistoryViewOrderStatistics, peerIds: MessageHistoryViewPeerIds, anchor inputAnchor: HistoryViewInputAnchor, combinedReadStates: MessageHistoryViewReadState?, transientReadStates: MessageHistoryViewReadState?, tag: MessageTags?, namespaces: MessageIdNamespaces, count: Int, topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?], additionalDatas: [AdditionalMessageHistoryViewDataEntry], getMessageCountInRange: (MessageIndex, MessageIndex) -> Int32) { self.anchor = inputAnchor self.orderStatistics = orderStatistics @@ -689,7 +672,7 @@ final class MutableMessageHistoryView { public final class MessageHistoryView { public let tagMask: MessageTags? - public let namespaces: HistoryViewNamespaces + public let namespaces: MessageIdNamespaces public let anchorIndex: MessageHistoryAnchorIndex public let earlierId: MessageIndex? public let laterId: MessageIndex? diff --git a/submodules/Postbox/Postbox/MessageHistoryViewState.swift b/submodules/Postbox/Postbox/MessageHistoryViewState.swift index 10a6084cfb..c00bb54ef6 100644 --- a/submodules/Postbox/Postbox/MessageHistoryViewState.swift +++ b/submodules/Postbox/Postbox/MessageHistoryViewState.swift @@ -748,7 +748,7 @@ struct HistoryViewLoadedSample { final class HistoryViewLoadedState { let anchor: HistoryViewAnchor let tag: MessageTags? - let namespaces: HistoryViewNamespaces + let namespaces: MessageIdNamespaces let statistics: MessageHistoryViewOrderStatistics let halfLimit: Int let seedConfiguration: SeedConfiguration @@ -756,7 +756,7 @@ final class HistoryViewLoadedState { var holes: HistoryViewHoles var spacesWithRemovals = Set() - init(anchor: HistoryViewAnchor, tag: MessageTags?, namespaces: HistoryViewNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewPeerIds, postbox: Postbox, holes: HistoryViewHoles) { + init(anchor: HistoryViewAnchor, tag: MessageTags?, namespaces: MessageIdNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewPeerIds, postbox: Postbox, holes: HistoryViewHoles) { precondition(halfLimit >= 3) self.anchor = anchor self.tag = tag @@ -1178,7 +1178,7 @@ final class HistoryViewLoadedState { } } -private func fetchHoles(postbox: Postbox, locations: MessageHistoryViewPeerIds, tag: MessageTags?, namespaces: HistoryViewNamespaces) -> [PeerIdAndNamespace: IndexSet] { +private func fetchHoles(postbox: Postbox, locations: MessageHistoryViewPeerIds, tag: MessageTags?, namespaces: MessageIdNamespaces) -> [PeerIdAndNamespace: IndexSet] { var holesBySpace: [PeerIdAndNamespace: IndexSet] = [:] var peerIds: [PeerId] = [] switch locations { @@ -1217,7 +1217,7 @@ final class HistoryViewLoadingState { let halfLimit: Int var holes: HistoryViewHoles - init(postbox: Postbox, locations: MessageHistoryViewPeerIds, tag: MessageTags?, namespaces: HistoryViewNamespaces, messageId: MessageId, halfLimit: Int) { + init(postbox: Postbox, locations: MessageHistoryViewPeerIds, tag: MessageTags?, namespaces: MessageIdNamespaces, messageId: MessageId, halfLimit: Int) { self.messageId = messageId self.tag = tag self.halfLimit = halfLimit @@ -1261,7 +1261,7 @@ enum HistoryViewState { case loaded(HistoryViewLoadedState) case loading(HistoryViewLoadingState) - init(postbox: Postbox, inputAnchor: HistoryViewInputAnchor, tag: MessageTags?, namespaces: HistoryViewNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewPeerIds) { + init(postbox: Postbox, inputAnchor: HistoryViewInputAnchor, tag: MessageTags?, namespaces: MessageIdNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewPeerIds) { switch inputAnchor { case let .index(index): self = .loaded(HistoryViewLoadedState(anchor: .index(index), tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces)))) diff --git a/submodules/Postbox/Postbox/Postbox.swift b/submodules/Postbox/Postbox/Postbox.swift index 005b38a090..c7216d6498 100644 --- a/submodules/Postbox/Postbox/Postbox.swift +++ b/submodules/Postbox/Postbox/Postbox.swift @@ -82,8 +82,8 @@ public final class Transaction { self.postbox?.deleteMessagesInRange(peerId: peerId, namespace: namespace, minId: minId, maxId: maxId) } - public func withAllMessages(peerId: PeerId, _ f: (Message) -> Bool) { - self.postbox?.withAllMessages(peerId: peerId, f) + public func withAllMessages(peerId: PeerId, namespace: MessageId.Namespace? = nil, _ f: (Message) -> Bool) { + self.postbox?.withAllMessages(peerId: peerId, namespace: namespace, f) } public func clearHistory(_ peerId: PeerId) { @@ -1507,8 +1507,8 @@ public final class Postbox { self.messageHistoryTable.removeMessagesInRange(peerId: peerId, namespace: namespace, minId: minId, maxId: maxId, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations) } - fileprivate func withAllMessages(peerId: PeerId, _ f: (Message) -> Bool) { - for index in self.messageHistoryTable.allMessageIndices(peerId: peerId) { + fileprivate func withAllMessages(peerId: PeerId, namespace: MessageId.Namespace?, _ f: (Message) -> Bool) { + for index in self.messageHistoryTable.allMessageIndices(peerId: peerId, namespace: namespace) { if let message = self.messageHistoryTable.getMessage(index) { if !f(self.renderIntermediateMessage(message)) { break @@ -2219,7 +2219,7 @@ public final class Postbox { return peerIds } - public func aroundMessageOfInterestHistoryViewForChatLocation(_ chatLocation: ChatLocation, count: Int, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: HistoryViewNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { + public func aroundMessageOfInterestHistoryViewForChatLocation(_ chatLocation: ChatLocation, count: Int, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { return self.transactionSignal(userInteractive: true, { subscriber, transaction in let peerIds = self.peerIdsForLocation(chatLocation, tagMask: tagMask) @@ -2267,14 +2267,14 @@ public final class Postbox { }) } - public func aroundIdMessageHistoryViewForLocation(_ chatLocation: ChatLocation, count: Int, messageId: MessageId, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: HistoryViewNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { + public func aroundIdMessageHistoryViewForLocation(_ chatLocation: ChatLocation, count: Int, messageId: MessageId, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { return self.transactionSignal { subscriber, transaction in let peerIds = self.peerIdsForLocation(chatLocation, tagMask: tagMask) return self.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: peerIds, count: count, anchor: .message(messageId), fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, namespaces: namespaces, orderStatistics: orderStatistics, additionalData: additionalData) } } - public func aroundMessageHistoryViewForLocation(_ chatLocation: ChatLocation, anchor: HistoryViewInputAnchor, count: Int, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: HistoryViewNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { + public func aroundMessageHistoryViewForLocation(_ chatLocation: ChatLocation, anchor: HistoryViewInputAnchor, count: Int, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { return self.transactionSignal { subscriber, transaction in let peerIds = self.peerIdsForLocation(chatLocation, tagMask: tagMask) @@ -2282,7 +2282,7 @@ public final class Postbox { } } - private func syncAroundMessageHistoryViewForPeerId(subscriber: Subscriber<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>, peerIds: MessageHistoryViewPeerIds, count: Int, anchor: HistoryViewInputAnchor, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: HistoryViewNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Disposable { + private func syncAroundMessageHistoryViewForPeerId(subscriber: Subscriber<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>, peerIds: MessageHistoryViewPeerIds, count: Int, anchor: HistoryViewInputAnchor, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Disposable { var topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?] = [:] var mainPeerId: PeerId? switch peerIds { diff --git a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift index 447163567f..4ba684656c 100644 --- a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift +++ b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift @@ -66,6 +66,7 @@ enum AccountStateGlobalNotificationSettingsSubject { enum AccountStateMutationOperation { case AddMessages([StoreMessage], AddMessagesLocation) + case AddScheduledMessages([StoreMessage]) case DeleteMessagesWithGlobalIds([Int32]) case DeleteMessages([MessageId]) case EditMessage(MessageId, StoreMessage) @@ -200,6 +201,10 @@ struct AccountMutableState { self.addOperation(.AddMessages(messages, location)) } + mutating func addScheduledMessages(_ messages: [StoreMessage]) { + self.addOperation(.AddScheduledMessages(messages)) + } + mutating func addDisplayAlert(_ text: String, isDropAuth: Bool) { self.displayAlerts.append((text: text, isDropAuth: isDropAuth)) } @@ -427,7 +432,18 @@ struct AccountMutableState { break inner } } - + } + case let .AddScheduledMessages(messages): + for message in messages { + if case let .Id(id) = message.id { + self.storedMessages.insert(id) + } + inner: for attribute in message.attributes { + if let attribute = attribute as? ReplyMessageAttribute { + self.referencedMessageIds.insert(attribute.messageId) + break inner + } + } } case let .UpdateState(state): self.state = state diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index 244df06a7f..d5a5384b50 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -1306,7 +1306,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo updatedState.updatePeersNearby(peersNearby) case let .updateNewScheduledMessage(apiMessage): if let message = StoreMessage(apiMessage: apiMessage, namespace: Namespaces.Message.ScheduledCloud) { - updatedState.addMessages([message], location: .Random) + updatedState.addScheduledMessages([message]) } case let .updateDeleteScheduledMessages(peer, messages): var messageIds: [MessageId] = [] @@ -2025,12 +2025,16 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation]) var updatedChannelStates: [PeerId: ChannelState] = [:] var currentAddMessages: OptimizeAddMessagesState? + var currentAddScheduledMessages: OptimizeAddMessagesState? for operation in operations { switch operation { case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .MergeApiChats, .MergeApiUsers, .MergePeerPresences, .UpdatePeer, .ReadInbox, .ReadOutbox, .ReadGroupFeedInbox, .ResetReadState, .ResetIncomingReadState, .UpdatePeerChatUnreadMark, .ResetMessageTagSummary, .UpdateNotificationSettings, .UpdateGlobalNotificationSettings, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby: if let currentAddMessages = currentAddMessages, !currentAddMessages.messages.isEmpty { result.append(.AddMessages(currentAddMessages.messages, currentAddMessages.location)) } + if let currentAddScheduledMessages = currentAddScheduledMessages, !currentAddScheduledMessages.messages.isEmpty { + result.append(.AddScheduledMessages(currentAddScheduledMessages.messages)) + } currentAddMessages = nil result.append(operation) case let .UpdateState(state): @@ -2046,12 +2050,22 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation]) } currentAddMessages = OptimizeAddMessagesState(messages: messages, location: location) } + case let .AddScheduledMessages(messages): + if let currentAddScheduledMessages = currentAddScheduledMessages { + currentAddScheduledMessages.messages.append(contentsOf: messages) + } else { + currentAddScheduledMessages = OptimizeAddMessagesState(messages: messages, location: .Random) + } } } if let currentAddMessages = currentAddMessages, !currentAddMessages.messages.isEmpty { result.append(.AddMessages(currentAddMessages.messages, currentAddMessages.location)) } + if let currentAddScheduledMessages = currentAddScheduledMessages, !currentAddScheduledMessages.messages.isEmpty { + result.append(.AddScheduledMessages(currentAddScheduledMessages.messages)) + } + if let updatedState = updatedState { result.append(.UpdateState(updatedState)) } @@ -2238,6 +2252,16 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } } } + case let .AddScheduledMessages(messages): + for message in messages { + if case let .Id(id) = message.id, let _ = transaction.getMessage(id) { + transaction.updateMessage(id) { _ -> PostboxUpdateMessage in + return .update(message) + } + } else { + let _ = transaction.addMessages(messages, location: .Random) + } + } case let .DeleteMessagesWithGlobalIds(ids): transaction.deleteMessagesWithGlobalIds(ids) case let .DeleteMessages(ids): diff --git a/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift b/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift index 19c61472be..c5d4863036 100644 --- a/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift +++ b/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift @@ -76,12 +76,17 @@ private func fetchWebpage(account: Account, messageId: MessageId) -> Signal take(1) |> mapToSignal { peer in if let inputPeer = apiInputPeer(peer) { + let isScheduledMessage = Namespaces.Message.allScheduled.contains(messageId.namespace) let messages: Signal - switch inputPeer { - case let .inputPeerChannel(channelId, accessHash): - messages = account.network.request(Api.functions.channels.getMessages(channel: Api.InputChannel.inputChannel(channelId: channelId, accessHash: accessHash), id: [Api.InputMessage.inputMessageID(id: messageId.id)])) - default: - messages = account.network.request(Api.functions.messages.getMessages(id: [Api.InputMessage.inputMessageID(id: messageId.id)])) + if isScheduledMessage { + messages = account.network.request(Api.functions.messages.getScheduledMessages(peer: inputPeer, id: [messageId.id])) + } else { + switch inputPeer { + case let .inputPeerChannel(channelId, accessHash): + messages = account.network.request(Api.functions.channels.getMessages(channel: Api.InputChannel.inputChannel(channelId: channelId, accessHash: accessHash), id: [Api.InputMessage.inputMessageID(id: messageId.id)])) + default: + messages = account.network.request(Api.functions.messages.getMessages(id: [Api.InputMessage.inputMessageID(id: messageId.id)])) + } } return messages |> retryRequest @@ -125,7 +130,7 @@ private func fetchWebpage(account: Account, messageId: MessageId) -> Signal? - if peerId.namespace == Namespaces.Peer.CloudUser || peerId.namespace == Namespaces.Peer.CloudGroup { - fetchSignal = account.network.request(Api.functions.messages.getMessages(id: messageIds.map({ Api.InputMessage.inputMessageID(id: $0.id) }))) + if let messageId = messageIds.first, messageId.namespace == Namespaces.Message.ScheduledCloud { + if let inputPeer = apiInputPeer(peer) { + fetchSignal = account.network.request(Api.functions.messages.getScheduledMessages(peer: inputPeer, id: messageIds.map { $0.id })) + } + } else if peerId.namespace == Namespaces.Peer.CloudUser || peerId.namespace == Namespaces.Peer.CloudGroup { + fetchSignal = account.network.request(Api.functions.messages.getMessages(id: messageIds.map { Api.InputMessage.inputMessageID(id: $0.id) })) } else if peerId.namespace == Namespaces.Peer.CloudChannel { if let inputChannel = apiInputChannel(peer) { - fetchSignal = account.network.request(Api.functions.channels.getMessages(channel: inputChannel, id: messageIds.map({ Api.InputMessage.inputMessageID(id: $0.id) }))) + fetchSignal = account.network.request(Api.functions.channels.getMessages(channel: inputChannel, id: messageIds.map { Api.InputMessage.inputMessageID(id: $0.id) })) } } guard let signal = fetchSignal else { diff --git a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift index 52ac2620ee..d8f478ede5 100644 --- a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift @@ -40,7 +40,7 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes var apiMessage: Api.Message? for resultMessage in result.messages { - if let id = resultMessage.id(namespace: message.scheduleTime != nil ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud) { + if let id = resultMessage.id(namespace: Namespaces.Message.allScheduled.contains(message.id.namespace) ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud) { if id.peerId == message.id.peerId { apiMessage = resultMessage break @@ -85,7 +85,7 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes transaction.updateMessage(message.id, update: { currentMessage in let updatedId: MessageId if let messageId = messageId { - let namespace = message.scheduleTime != nil ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud + let namespace = Namespaces.Message.allScheduled.contains(message.id.namespace) ? Namespaces.Message.ScheduledCloud : Namespaces.Message.Cloud updatedId = MessageId(peerId: currentMessage.id.peerId, namespace: namespace, id: messageId) } else { updatedId = currentMessage.id @@ -213,9 +213,14 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage return postbox.transaction { transaction -> Void in let updatedRawMessageIds = result.updatedRawMessageIds + var namespace = Namespaces.Message.Cloud + if let message = messages.first, Namespaces.Message.allScheduled.contains(message.id.namespace) { + namespace = Namespaces.Message.ScheduledCloud + } + var resultMessages: [MessageId: StoreMessage] = [:] for apiMessage in result.messages { - if let resultMessage = StoreMessage(apiMessage: apiMessage), case let .Id(id) = resultMessage.id { + if let resultMessage = StoreMessage(apiMessage: apiMessage, namespace: namespace), case let .Id(id) = resultMessage.id { resultMessages[id] = resultMessage } } @@ -232,7 +237,7 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage } if let uniqueId = uniqueId { if let updatedId = updatedRawMessageIds[uniqueId] { - if let storeMessage = resultMessages[MessageId(peerId: message.id.peerId, namespace: Namespaces.Message.Cloud, id: updatedId)], case let .Id(id) = storeMessage.id { + if let storeMessage = resultMessages[MessageId(peerId: message.id.peerId, namespace: namespace, id: updatedId)], case let .Id(id) = storeMessage.id { mapping.append((message, MessageIndex(id: id, timestamp: storeMessage.timestamp), storeMessage)) } } else { diff --git a/submodules/TelegramCore/TelegramCore/CloudChatRemoveMessagesOperation.swift b/submodules/TelegramCore/TelegramCore/CloudChatRemoveMessagesOperation.swift index c04b940624..5c684d6ac7 100644 --- a/submodules/TelegramCore/TelegramCore/CloudChatRemoveMessagesOperation.swift +++ b/submodules/TelegramCore/TelegramCore/CloudChatRemoveMessagesOperation.swift @@ -83,12 +83,31 @@ final class CloudChatRemoveChatOperation: PostboxCoding { } } +enum CloudChatClearHistoryType: Int32 { + case forLocalPeer + case forEveryone + case scheduledMessages +} + +extension CloudChatClearHistoryType { + init(_ type: InteractiveHistoryClearingType) { + switch type { + case .forLocalPeer: + self = .forLocalPeer + case .forEveryone: + self = .forEveryone + case .scheduledMessages: + self = .scheduledMessages + } + } +} + final class CloudChatClearHistoryOperation: PostboxCoding { let peerId: PeerId let topMessageId: MessageId - let type: InteractiveMessagesDeletionType + let type: CloudChatClearHistoryType - init(peerId: PeerId, topMessageId: MessageId, type: InteractiveMessagesDeletionType) { + init(peerId: PeerId, topMessageId: MessageId, type: CloudChatClearHistoryType) { self.peerId = peerId self.topMessageId = topMessageId self.type = type @@ -97,7 +116,7 @@ final class CloudChatClearHistoryOperation: PostboxCoding { init(decoder: PostboxDecoder) { self.peerId = PeerId(decoder.decodeInt64ForKey("p", orElse: 0)) self.topMessageId = MessageId(peerId: PeerId(decoder.decodeInt64ForKey("m.p", orElse: 0)), namespace: decoder.decodeInt32ForKey("m.n", orElse: 0), id: decoder.decodeInt32ForKey("m.i", orElse: 0)) - self.type = InteractiveMessagesDeletionType(rawValue: decoder.decodeInt32ForKey("type", orElse: 0)) ?? .forLocalPeer + self.type = CloudChatClearHistoryType(rawValue: decoder.decodeInt32ForKey("type", orElse: 0)) ?? .forLocalPeer } func encode(_ encoder: PostboxEncoder) { @@ -117,14 +136,23 @@ func cloudChatAddRemoveChatOperation(transaction: Transaction, peerId: PeerId, r transaction.operationLogAddEntry(peerId: peerId, tag: OperationLogTags.CloudChatRemoveMessages, tagLocalIndex: .automatic, tagMergedIndex: .automatic, contents: CloudChatRemoveChatOperation(peerId: peerId, reportChatSpam: reportChatSpam, deleteGloballyIfPossible: deleteGloballyIfPossible, topMessageId: transaction.getTopPeerMessageId(peerId: peerId, namespace: Namespaces.Message.Cloud))) } -func cloudChatAddClearHistoryOperation(transaction: Transaction, peerId: PeerId, explicitTopMessageId: MessageId?, type: InteractiveMessagesDeletionType) { - let topMessageId: MessageId? - if let explicitTopMessageId = explicitTopMessageId { - topMessageId = explicitTopMessageId +func cloudChatAddClearHistoryOperation(transaction: Transaction, peerId: PeerId, explicitTopMessageId: MessageId?, type: CloudChatClearHistoryType) { + if type == .scheduledMessages { + var messageIds: [MessageId] = [] + transaction.withAllMessages(peerId: peerId, namespace: Namespaces.Message.ScheduledCloud) { message -> Bool in + messageIds.append(message.id) + return true + } + cloudChatAddRemoveMessagesOperation(transaction: transaction, peerId: peerId, messageIds: messageIds, type: .forLocalPeer) } else { - topMessageId = transaction.getTopPeerMessageId(peerId: peerId, namespace: Namespaces.Message.Cloud) - } - if let topMessageId = topMessageId { - transaction.operationLogAddEntry(peerId: peerId, tag: OperationLogTags.CloudChatRemoveMessages, tagLocalIndex: .automatic, tagMergedIndex: .automatic, contents: CloudChatClearHistoryOperation(peerId: peerId, topMessageId: topMessageId, type: type)) + let topMessageId: MessageId? + if let explicitTopMessageId = explicitTopMessageId { + topMessageId = explicitTopMessageId + } else { + topMessageId = transaction.getTopPeerMessageId(peerId: peerId, namespace: Namespaces.Message.Cloud) + } + if let topMessageId = topMessageId { + transaction.operationLogAddEntry(peerId: peerId, tag: OperationLogTags.CloudChatRemoveMessages, tagLocalIndex: .automatic, tagMergedIndex: .automatic, contents: CloudChatClearHistoryOperation(peerId: peerId, topMessageId: topMessageId, type: type)) + } } } diff --git a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift index 4341dab5aa..6ddc2999b4 100644 --- a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift +++ b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift @@ -80,24 +80,33 @@ public func deleteMessagesInteractively(postbox: Postbox, messageIds initialMess } } -public func clearHistoryInteractively(postbox: Postbox, peerId: PeerId, type: InteractiveMessagesDeletionType) -> Signal { +public enum InteractiveHistoryClearingType: Int32 { + case forLocalPeer = 0 + case forEveryone = 1 + case scheduledMessages = 2 +} + +public func clearHistoryInteractively(postbox: Postbox, peerId: PeerId, type: InteractiveHistoryClearingType) -> Signal { return postbox.transaction { transaction -> Void in if peerId.namespace == Namespaces.Peer.CloudUser || peerId.namespace == Namespaces.Peer.CloudGroup || peerId.namespace == Namespaces.Peer.CloudChannel { - cloudChatAddClearHistoryOperation(transaction: transaction, peerId: peerId, explicitTopMessageId: nil, type: type) - var topIndex: MessageIndex? - if let topMessageId = transaction.getTopPeerMessageId(peerId: peerId, namespace: Namespaces.Message.Cloud), let topMessage = transaction.getMessage(topMessageId) { - topIndex = topMessage.index - } - clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peerId) - if let cachedData = transaction.getPeerCachedData(peerId: peerId) as? CachedChannelData, let migrationReference = cachedData.migrationReference { - cloudChatAddClearHistoryOperation(transaction: transaction, peerId: migrationReference.maxMessageId.peerId, explicitTopMessageId: MessageId(peerId: migrationReference.maxMessageId.peerId, namespace: migrationReference.maxMessageId.namespace, id: migrationReference.maxMessageId.id + 1), type: type) - clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: migrationReference.maxMessageId.peerId) - } - if let topIndex = topIndex { - if peerId.namespace == Namespaces.Peer.CloudUser { - let _ = transaction.addMessages([StoreMessage(id: topIndex.id, globallyUniqueId: nil, groupingKey: nil, timestamp: topIndex.timestamp, flags: StoreMessageFlags(), tags: [], globalTags: [], localTags: [], forwardInfo: nil, authorId: nil, text: "", attributes: [], media: [TelegramMediaAction(action: .historyCleared)])], location: .Random) - } else { - updatePeerChatInclusionWithMinTimestamp(transaction: transaction, id: peerId, minTimestamp: topIndex.timestamp, forceRootGroupIfNotExists: false) + cloudChatAddClearHistoryOperation(transaction: transaction, peerId: peerId, explicitTopMessageId: nil, type: CloudChatClearHistoryType(type)) + if type != .scheduledMessages { + var topIndex: MessageIndex? + if let topMessageId = transaction.getTopPeerMessageId(peerId: peerId, namespace: Namespaces.Message.Cloud), let topMessage = transaction.getMessage(topMessageId) { + topIndex = topMessage.index + } + + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peerId) + if let cachedData = transaction.getPeerCachedData(peerId: peerId) as? CachedChannelData, let migrationReference = cachedData.migrationReference { + cloudChatAddClearHistoryOperation(transaction: transaction, peerId: migrationReference.maxMessageId.peerId, explicitTopMessageId: MessageId(peerId: migrationReference.maxMessageId.peerId, namespace: migrationReference.maxMessageId.namespace, id: migrationReference.maxMessageId.id + 1), type: CloudChatClearHistoryType(type)) + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: migrationReference.maxMessageId.peerId) + } + if let topIndex = topIndex { + if peerId.namespace == Namespaces.Peer.CloudUser { + let _ = transaction.addMessages([StoreMessage(id: topIndex.id, globallyUniqueId: nil, groupingKey: nil, timestamp: topIndex.timestamp, flags: StoreMessageFlags(), tags: [], globalTags: [], localTags: [], forwardInfo: nil, authorId: nil, text: "", attributes: [], media: [TelegramMediaAction(action: .historyCleared)])], location: .Random) + } else { + updatePeerChatInclusionWithMinTimestamp(transaction: transaction, id: peerId, minTimestamp: topIndex.timestamp, forceRootGroupIfNotExists: false) + } } } } else if peerId.namespace == Namespaces.Peer.SecretChat { diff --git a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift index 3b835c5dd0..bddb8cf8f4 100644 --- a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift +++ b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift @@ -101,6 +101,8 @@ private func filterMessageAttributesForForwardedMessage(_ attributes: [MessageAt return true case _ as NotificationInfoMessageAttribute: return true + case _ as OutgoingScheduleInfoMessageAttribute: + return true default: return false } diff --git a/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift b/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift index b0aa0207a0..6911b76297 100644 --- a/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift +++ b/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift @@ -271,7 +271,7 @@ final class HistoryViewStateValidationContexts { let batch = HistoryStateValidationBatch(disposable: disposable) context.batch = batch - let messages: [Message] = view.entries.map { $0.message } + let messages: [Message] = view.entries.map { $0.message }.filter { $0.id.namespace == Namespaces.Message.ScheduledCloud } disposable.set((validateScheduledMessagesBatch(postbox: self.postbox, network: self.network, accountPeerId: peerId, tag: nil, messages: messages, historyState: .scheduledMessages(peerId)) |> deliverOn(self.queue)).start(completed: { [weak self] in @@ -476,7 +476,7 @@ private func validateBatch(postbox: Postbox, network: Network, transaction: Tran return .complete() } switch result { - case let .messages(messages, _, users, channelPts): + case let .messages(messages, _, _, channelPts): var storeMessages: [StoreMessage] = [] for message in messages { @@ -526,7 +526,7 @@ private func validateBatch(postbox: Postbox, network: Network, transaction: Tran } var ids = Set() for message in apiMessages { - if let parsedMessage = StoreMessage(apiMessage: message), case let .Id(id) = parsedMessage.id { + if let parsedMessage = StoreMessage(apiMessage: message, namespace: messageNamespace), case let .Id(id) = parsedMessage.id { if let tag = tag { if parsedMessage.tags.contains(tag) { ids.insert(id) diff --git a/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift b/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift index 1d545a67e8..fc18a97ab1 100644 --- a/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift +++ b/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift @@ -22,7 +22,6 @@ public enum GetMessagesStrategy { public func getMessagesLoadIfNecessary(_ messageIds: [MessageId], postbox: Postbox, network: Network, accountPeerId: PeerId, strategy: GetMessagesStrategy = .cloud) -> Signal <[Message], NoError> { let postboxSignal = postbox.transaction { transaction -> ([Message], Set, SimpleDictionary) in - var ids = messageIds if let cachedData = transaction.getPeerCachedData(peerId: messageIds[0].peerId) as? CachedChannelData { diff --git a/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift index 3644676d6f..65e252cfb9 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift @@ -136,7 +136,41 @@ func managedCloudChatRemoveMessagesOperations(postbox: Postbox, network: Network } private func removeMessages(postbox: Postbox, network: Network, stateManager: AccountStateManager, peer: Peer, operation: CloudChatRemoveMessagesOperation) -> Signal { - if peer.id.namespace == Namespaces.Peer.CloudChannel { + var isScheduled = false + for id in operation.messageIds { + if id.namespace == Namespaces.Message.ScheduledCloud { + isScheduled = true + break + } + } + + if isScheduled { + if let inputPeer = apiInputPeer(peer) { + var signal: Signal = .complete() + for s in stride(from: 0, to: operation.messageIds.count, by: 100) { + let ids = Array(operation.messageIds[s ..< min(s + 100, operation.messageIds.count)]) + let partSignal = network.request(Api.functions.messages.deleteScheduledMessages(peer: inputPeer, id: ids.map { $0.id })) + |> map { result -> Api.Updates? in + return result + } + |> `catch` { _ in + return .single(nil) + } + |> mapToSignal { updates -> Signal in + if let updates = updates { + stateManager.addUpdates(updates) + } + return .complete() + } + + signal = signal + |> then(partSignal) + } + return signal + } else { + return .complete() + } + } else if peer.id.namespace == Namespaces.Peer.CloudChannel { if let inputChannel = apiInputChannel(peer) { var signal: Signal = .complete() for s in stride(from: 0, to: operation.messageIds.count, by: 100) { @@ -165,73 +199,38 @@ private func removeMessages(postbox: Postbox, network: Network, stateManager: Ac return .complete() } } else { - var isScheduled = false - for id in operation.messageIds { - if id.namespace == Namespaces.Message.ScheduledCloud { - isScheduled = true - break - } + var flags: Int32 + switch operation.type { + case .forEveryone: + flags = (1 << 0) + default: + flags = 0 } - if isScheduled { - if let inputPeer = apiInputPeer(peer) { - var signal: Signal = .complete() - for s in stride(from: 0, to: operation.messageIds.count, by: 100) { - let ids = Array(operation.messageIds[s ..< min(s + 100, operation.messageIds.count)]) - let partSignal = network.request(Api.functions.messages.deleteScheduledMessages(peer: inputPeer, id: ids.map { $0.id })) - |> map { result -> Api.Updates? in - return result - } - |> `catch` { _ in - return .single(nil) - } - |> mapToSignal { updates -> Signal in - if let updates = updates { - stateManager.addUpdates(updates) - } - return .complete() - } - - signal = signal - |> then(partSignal) + + var signal: Signal = .complete() + for s in stride(from: 0, to: operation.messageIds.count, by: 100) { + let ids = Array(operation.messageIds[s ..< min(s + 100, operation.messageIds.count)]) + let partSignal = network.request(Api.functions.messages.deleteMessages(flags: flags, id: ids.map { $0.id })) + |> map { result -> Api.messages.AffectedMessages? in + return result } - return signal - } else { - return .complete() - } - } else { - var flags: Int32 - switch operation.type { - case .forEveryone: - flags = (1 << 0) - default: - flags = 0 + |> `catch` { _ in + return .single(nil) + } + |> mapToSignal { result -> Signal in + if let result = result { + switch result { + case let .affectedMessages(pts, ptsCount): + stateManager.addUpdateGroups([.updatePts(pts: pts, ptsCount: ptsCount)]) + } + } + return .complete() } - var signal: Signal = .complete() - for s in stride(from: 0, to: operation.messageIds.count, by: 100) { - let ids = Array(operation.messageIds[s ..< min(s + 100, operation.messageIds.count)]) - let partSignal = network.request(Api.functions.messages.deleteMessages(flags: flags, id: ids.map { $0.id })) - |> map { result -> Api.messages.AffectedMessages? in - return result - } - |> `catch` { _ in - return .single(nil) - } - |> mapToSignal { result -> Signal in - if let result = result { - switch result { - case let .affectedMessages(pts, ptsCount): - stateManager.addUpdateGroups([.updatePts(pts: pts, ptsCount: ptsCount)]) - } - } - return .complete() - } - - signal = signal - |> then(partSignal) - } - return signal + signal = signal + |> then(partSignal) } + return signal } } @@ -339,7 +338,7 @@ private func removeChat(transaction: Transaction, postbox: Postbox, network: Net } } -private func requestClearHistory(postbox: Postbox, network: Network, stateManager: AccountStateManager, inputPeer: Api.InputPeer, maxId: Int32, justClear: Bool, type: InteractiveMessagesDeletionType) -> Signal { +private func requestClearHistory(postbox: Postbox, network: Network, stateManager: AccountStateManager, inputPeer: Api.InputPeer, maxId: Int32, justClear: Bool, type: CloudChatClearHistoryType) -> Signal { var flags: Int32 = 0 if justClear { flags |= 1 << 0 diff --git a/submodules/TelegramCore/TelegramCore/MessageUtils.swift b/submodules/TelegramCore/TelegramCore/MessageUtils.swift index 99a08d8d10..153d35fcf6 100644 --- a/submodules/TelegramCore/TelegramCore/MessageUtils.swift +++ b/submodules/TelegramCore/TelegramCore/MessageUtils.swift @@ -189,4 +189,14 @@ public extension Message { return false } } + + func effectivelyFailed(timestamp: Int32) -> Bool { + if self.flags.contains(.Failed) { + return true + } else if self.id.namespace == Namespaces.Message.ScheduledCloud { + return timestamp > self.timestamp + } else { + return false + } + } } diff --git a/submodules/TelegramCore/TelegramCore/Network.swift b/submodules/TelegramCore/TelegramCore/Network.swift index d1c700db26..3d5b1ee268 100644 --- a/submodules/TelegramCore/TelegramCore/Network.swift +++ b/submodules/TelegramCore/TelegramCore/Network.swift @@ -780,7 +780,7 @@ public final class Network: NSObject, MTRequestMessageServiceDelegate { } public var globalTime: TimeInterval { - return context.globalTime() + return self.context.globalTime() } public var currentGlobalTime: Signal { diff --git a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift index 643fd4a5fe..f97e33be98 100644 --- a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift +++ b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift @@ -667,7 +667,7 @@ public final class PendingMessageManager { } else if let inputSourcePeerId = forwardPeerIds.first, let inputSourcePeer = transaction.getPeer(inputSourcePeerId).flatMap(apiInputPeer) { let dependencyTag = PendingMessageRequestDependencyTag(messageId: messages[0].0.id) - sendMessageRequest = network.request(Api.functions.messages.forwardMessages(flags: flags, fromPeer: inputSourcePeer, id: forwardIds.map { $0.0.id }, randomId: forwardIds.map { $0.1 }, toPeer: inputPeer, scheduleDate: nil), tag: dependencyTag) + sendMessageRequest = network.request(Api.functions.messages.forwardMessages(flags: flags, fromPeer: inputSourcePeer, id: forwardIds.map { $0.0.id }, randomId: forwardIds.map { $0.1 }, toPeer: inputPeer, scheduleDate: scheduleTime), tag: dependencyTag) } else { assertionFailure() sendMessageRequest = .fail(MTRpcError(errorCode: 400, errorDescription: "Invalid forward source")) diff --git a/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift b/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift index beec16bf19..5061a35ea5 100644 --- a/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift +++ b/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift @@ -161,46 +161,46 @@ private func requestEditMessageInternal(account: Account, messageId: MessageId, } return account.network.request(Api.functions.messages.editMessage(flags: flags, peer: inputPeer, id: messageId.id, message: text, media: inputMedia, replyMarkup: nil, entities: apiEntities, scheduleDate: effectiveScheduleTime)) - |> map { result -> Api.Updates? in - return result + |> map { result -> Api.Updates? in + return result + } + |> `catch` { error -> Signal in + if error.errorDescription == "MESSAGE_NOT_MODIFIED" { + return .single(nil) + } else { + return .fail(error) } - |> `catch` { error -> Signal in - if error.errorDescription == "MESSAGE_NOT_MODIFIED" { - return .single(nil) - } else { - return .fail(error) - } + } + |> mapError { error -> RequestEditMessageInternalError in + if error.errorDescription.hasPrefix("FILEREF_INVALID") || error.errorDescription.hasPrefix("FILE_REFERENCE_") { + return .invalidReference + } else if error.errorDescription.hasPrefix("CHAT_SEND_") && error.errorDescription.hasSuffix("_FORBIDDEN") { + return .error(.restricted) } - |> mapError { error -> RequestEditMessageInternalError in - if error.errorDescription.hasPrefix("FILEREF_INVALID") || error.errorDescription.hasPrefix("FILE_REFERENCE_") { - return .invalidReference - } else if error.errorDescription.hasPrefix("CHAT_SEND_") && error.errorDescription.hasSuffix("_FORBIDDEN") { - return .error(.restricted) - } - return .error(.generic) - } - |> mapToSignal { result -> Signal in - if let result = result { - return account.postbox.transaction { transaction -> RequestEditMessageResult in - var toMedia: Media? - if let message = result.messages.first.flatMap({ StoreMessage(apiMessage: $0) }) { - toMedia = message.media.first - } - - if case let .update(fromMedia) = media, let toMedia = toMedia { - applyMediaResourceChanges(from: fromMedia.media, to: toMedia, postbox: account.postbox) - } - account.stateManager.addUpdates(result) - - return .done(true) + return .error(.generic) + } + |> mapToSignal { result -> Signal in + if let result = result { + return account.postbox.transaction { transaction -> RequestEditMessageResult in + var toMedia: Media? + if let message = result.messages.first.flatMap({ StoreMessage(apiMessage: $0) }) { + toMedia = message.media.first } - |> mapError { _ -> RequestEditMessageInternalError in - return .error(.generic) + + if case let .update(fromMedia) = media, let toMedia = toMedia { + applyMediaResourceChanges(from: fromMedia.media, to: toMedia, postbox: account.postbox) } - } else { - return .single(.done(false)) + account.stateManager.addUpdates(result) + + return .done(true) } + |> mapError { _ -> RequestEditMessageInternalError in + return .error(.generic) + } + } else { + return .single(.done(false)) } + } } else { return .single(.done(false)) } diff --git a/submodules/TelegramCore/TelegramCore/SingleMessageView.swift b/submodules/TelegramCore/TelegramCore/SingleMessageView.swift index c265c00adf..24a395509c 100644 --- a/submodules/TelegramCore/TelegramCore/SingleMessageView.swift +++ b/submodules/TelegramCore/TelegramCore/SingleMessageView.swift @@ -41,7 +41,11 @@ public func singleMessageView(account: Account, messageId: MessageId, loadIfNotE private func fetchMessage(transaction: Transaction, account: Account, messageId: MessageId) -> Signal { if let peer = transaction.getPeer(messageId.peerId) { var signal: Signal? - if messageId.peerId.namespace == Namespaces.Peer.CloudUser || messageId.peerId.namespace == Namespaces.Peer.CloudGroup { + if messageId.namespace == Namespaces.Message.ScheduledCloud { + if let inputPeer = apiInputPeer(peer) { + signal = account.network.request(Api.functions.messages.getScheduledMessages(peer: inputPeer, id: [messageId.id])) + } + } else if messageId.peerId.namespace == Namespaces.Peer.CloudUser || messageId.peerId.namespace == Namespaces.Peer.CloudGroup { signal = account.network.request(Api.functions.messages.getMessages(id: [Api.InputMessage.inputMessageID(id: messageId.id)])) } else if messageId.peerId.namespace == Namespaces.Peer.CloudChannel { if let inputChannel = apiInputChannel(peer) { @@ -96,7 +100,7 @@ private func fetchMessage(transaction: Transaction, account: Account, messageId: }) for message in apiMessages { - if let message = StoreMessage(apiMessage: message) { + if let message = StoreMessage(apiMessage: message, namespace: messageId.namespace) { let _ = transaction.addMessages([message], location: .Random) } } From 263d78c1b3c99f58fd18226856767c5530eebe01 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 21 Aug 2019 02:05:10 +0300 Subject: [PATCH 20/86] Scheduled Messages UI improvements --- Telegram-iOS/en.lproj/Localizable.strings | 7 +- .../Sources/AccountContext.swift | 6 +- .../Sources/ChatController.swift | 4 +- .../Sources/ChatListController.swift | 4 +- .../Sources/HashtagSearchController.swift | 2 +- .../Sources/InstantPageControllerNode.swift | 4 +- .../TelegramUI/ApplicationContext.swift | 4 +- .../TelegramUI/ChatBotInfoItem.swift | 2 +- .../ChatButtonKeyboardInputNode.swift | 2 +- .../TelegramUI/ChatController.swift | 112 ++++++++++++------ .../TelegramUI/TelegramUI/ChatEmptyNode.swift | 4 +- .../TelegramUI/ChatHistoryListNode.swift | 4 - .../ChatHistoryViewForLocation.swift | 44 +++---- .../ChatMessageAnimatedStickerItemNode.swift | 16 ++- .../ChatMessageBubbleItemNode.swift | 17 +-- .../ChatMessageInstantVideoItemNode.swift | 6 +- .../ChatMessageStickerItemNode.swift | 15 ++- .../TelegramUI/ChatPresentationData.swift | 7 +- .../ChatRecentActionsControllerNode.swift | 3 +- .../ChatScheduleTimeControllerNode.swift | 1 + ...SendMessageActionSheetControllerNode.swift | 102 +++++++--------- .../TelegramUI/DebugController.swift | 21 +--- .../TelegramUI/TelegramUI/LegacyCamera.swift | 3 +- .../TelegramUI/NavigateToChatController.swift | 6 +- .../TelegramUI/OpenResolvedUrl.swift | 8 +- .../TelegramUI/TelegramUI/OpenUrl.swift | 4 +- .../PeerMediaCollectionController.swift | 6 +- .../PeerMessagesMediaPlaylist.swift | 2 +- .../Resources/PresentationStrings.mapping | Bin 124491 -> 124672 bytes .../TelegramUI/TextLinkHandling.swift | 8 +- .../TelegramUI/TelegramUI/UrlHandling.swift | 10 +- 31 files changed, 234 insertions(+), 200 deletions(-) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 4771f22914..a45da3d3cd 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4609,8 +4609,11 @@ Any member of this group will be able to see messages in the channel."; "ScheduledMessages.SendNow" = "Send Now"; "ScheduledMessages.EditTime" = "Reschedule"; "ScheduledMessages.ClearAll" = "Clear All"; -"ScheduledMessages.Delete" = "Delete"; +"ScheduledMessages.ClearAllConfirmation" = "Clear Scheduled Messages"; +"ScheduledMessages.Delete" = "Delete Scheduled Message"; +"ScheduledMessages.DeleteMany" = "Delete Scheduled Messages"; "ScheduledMessages.EmptyPlaceholder" = "No scheduled messages here yet..."; +"ScheduledMessages.BotActionUnavailable" = "This action will become available after the message is published."; "Conversation.SendMessage.SetReminder" = "Set a Reminder"; @@ -4657,3 +4660,5 @@ Any member of this group will be able to see messages in the channel."; "Appearance.ThemePreview.Chat.4.Text" = "Nearly missed the sunrise."; "GroupInfo.Permissions.SlowmodeValue.Off" = "Off"; + +"Undo.ScheduledMessagesCleared" = "Scheduled messages cleared"; diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index d85b8eaa9b..e5808adeaf 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -179,7 +179,7 @@ public final class NavigateToChatControllerParams { public let chatController: ChatController? public let context: AccountContext public let chatLocation: ChatLocation - public let messageId: MessageId? + public let subject: ChatControllerSubject? public let botStart: ChatControllerInitialBotStart? public let updateTextInputState: ChatTextInputState? public let activateInput: Bool @@ -191,12 +191,12 @@ public final class NavigateToChatControllerParams { public let parentGroupId: PeerGroupId? public let completion: () -> Void - public init(navigationController: NavigationController, chatController: ChatController? = nil, context: AccountContext, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, updateTextInputState: ChatTextInputState? = nil, activateInput: Bool = false, keepStack: NavigateToChatKeepStack = .default, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: 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, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: Bool = false, animated: Bool = true, options: NavigationAnimationOptions = [], parentGroupId: PeerGroupId? = nil, completion: @escaping () -> Void = {}) { self.navigationController = navigationController self.chatController = chatController self.context = context self.chatLocation = chatLocation - self.messageId = messageId + self.subject = subject self.botStart = botStart self.updateTextInputState = updateTextInputState self.activateInput = activateInput diff --git a/submodules/AccountContext/Sources/ChatController.swift b/submodules/AccountContext/Sources/ChatController.swift index 52a97a46bd..7f119048aa 100644 --- a/submodules/AccountContext/Sources/ChatController.swift +++ b/submodules/AccountContext/Sources/ChatController.swift @@ -7,7 +7,7 @@ import SwiftSignalKit public enum ChatControllerInitialBotStartBehavior { case interactive - case automatic(returnToPeerId: PeerId) + case automatic(returnToPeerId: PeerId, scheduled: Bool) } public struct ChatControllerInitialBotStart { @@ -22,7 +22,7 @@ public struct ChatControllerInitialBotStart { public enum ChatControllerInteractionNavigateToPeer { case `default` - case chat(textInputState: ChatTextInputState?, messageId: MessageId?) + case chat(textInputState: ChatTextInputState?, subject: ChatControllerSubject?) case info case withBotStartPayload(ChatControllerInitialBotStart) } diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 9a62d8c8ff..21ea059670 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -570,7 +570,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, return } - let beginClear: (InteractiveMessagesDeletionType) -> Void = { type in + let beginClear: (InteractiveHistoryClearingType) -> Void = { type in guard let strongSelf = self else { return } @@ -748,7 +748,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, } - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(actualPeerId), messageId: messageId, purposefulAction: { + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(actualPeerId), subject: .message(messageId), purposefulAction: { self?.deactivateSearch(animated: false) }, scrollToEndIfExists: scrollToEndIfExists, options: strongSelf.groupId == PeerGroupId.root ? [.removeOnMasterDetails] : [])) strongSelf.chatListDisplayNode.chatListNode.clearHighlightAnimated(true) diff --git a/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift b/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift index 602e896b6a..150ce02736 100644 --- a/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift +++ b/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift @@ -53,7 +53,7 @@ public final class HashtagSearchController: TelegramBaseController { if let strongSelf = self { strongSelf.openMessageFromSearchDisposable.set((storedMessageFromSearchPeer(account: strongSelf.context.account, peer: peer) |> deliverOnMainQueue).start(next: { actualPeerId in if let strongSelf = self, let navigationController = strongSelf.navigationController as? NavigationController { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(actualPeerId), messageId: message.id.peerId == actualPeerId ? message.id : nil, keepStack: .always)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(actualPeerId), subject: message.id.peerId == actualPeerId ? .message(message.id) : nil, keepStack: .always)) } })) strongSelf.controllerNode.listNode.clearHighlightAnimated(true) diff --git a/submodules/InstantPageUI/Sources/InstantPageControllerNode.swift b/submodules/InstantPageUI/Sources/InstantPageControllerNode.swift index e1d217d93d..0568bf986f 100644 --- a/submodules/InstantPageUI/Sources/InstantPageControllerNode.swift +++ b/submodules/InstantPageUI/Sources/InstantPageControllerNode.swift @@ -1199,9 +1199,9 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { strongSelf.loadProgress.set(1.0) strongSelf.context.sharedContext.openResolvedUrl(result, context: strongSelf.context, urlContext: .generic, navigationController: strongSelf.getNavigationController(), openPeer: { peerId, navigation in switch navigation { - case let .chat(_, messageId): + case let .chat(_, subject): if let navigationController = strongSelf.getNavigationController() { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), messageId: messageId)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject)) } case let .withBotStartPayload(botStart): if let navigationController = strongSelf.getNavigationController() { diff --git a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift index d4cc28d80b..107fb94ac1 100644 --- a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -787,7 +787,7 @@ final class AuthorizedApplicationContext { } let navigateToMessage = { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: strongSelf.rootController, context: strongSelf.context, chatLocation: .peer(messageId.peerId), messageId: messageId)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: strongSelf.rootController, context: strongSelf.context, chatLocation: .peer(messageId.peerId), subject: .message(messageId))) } if chatIsVisible { @@ -832,7 +832,7 @@ final class AuthorizedApplicationContext { if visiblePeerId != peerId || messageId != nil { if self.rootController.rootTabController != nil { - self.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: self.rootController, context: self.context, chatLocation: .peer(peerId), messageId: messageId, activateInput: activateInput)) + self.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: self.rootController, context: self.context, chatLocation: .peer(peerId), subject: messageId.flatMap { .message($0) }, activateInput: activateInput)) } else { self.scheduledOperChatWithPeerId = (peerId, messageId, activateInput) } diff --git a/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift b/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift index f307665b24..372cf9a173 100644 --- a/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift @@ -301,7 +301,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { case let .url(url, concealed): self.item?.controllerInteraction.openUrl(url, concealed, nil) case let .peerMention(peerId, _): - self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, messageId: nil), nil) + self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, subject: nil), nil) case let .textMention(name): self.item?.controllerInteraction.openPeerMention(name) case let .botCommand(command): diff --git a/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift index 4b6c27902a..9a2f2c65f5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift @@ -198,7 +198,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode { peerId = message.id.peerId } if let botPeer = botPeer, let addressName = botPeer.addressName { - self.controllerInteraction.openPeer(peerId, .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: "@\(addressName) \(query)")), messageId: nil), nil) + self.controllerInteraction.openPeer(peerId, .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: "@\(addressName) \(query)")), subject: nil), nil) } } case .payment: diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index d36d08dc5f..a208bd5c22 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -319,6 +319,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var isScheduledMessages = false if let subject = subject, case .scheduledMessages = subject { + self.canReadHistory.set(false) isScheduledMessages = true } @@ -588,6 +589,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self, canSendMessagesToChat(strongSelf.presentationInterfaceState) else { return } + guard !strongSelf.presentationInterfaceState.isScheduledMessages else { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ScheduledMessages_BotActionUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + return + } strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({ if let strongSelf = self { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, { @@ -659,6 +664,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return true }, requestMessageActionCallback: { [weak self] messageId, data, isGame in if let strongSelf = self { + guard !strongSelf.presentationInterfaceState.isScheduledMessages else { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ScheduledMessages_BotActionUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + return + } + if let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(messageId) { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { return $0.updatedTitlePanelContext { @@ -728,6 +738,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, requestMessageActionUrlAuth: { [weak self] defaultUrl, messageId, buttonId in if let strongSelf = self { + guard !strongSelf.presentationInterfaceState.isScheduledMessages else { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ScheduledMessages_BotActionUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + return + } if let _ = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(messageId) { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { return $0.updatedTitlePanelContext { @@ -845,10 +859,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - if let botStart = strongSelf.botStart, case let .automatic(returnToPeerId) = botStart.behavior { - strongSelf.openPeer(peerId: returnToPeerId, navigation: .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: inputString)), messageId: nil), fromMessage: nil) + guard !strongSelf.presentationInterfaceState.isScheduledMessages else { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ScheduledMessages_BotActionUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + return + } + if let botStart = strongSelf.botStart, case let .automatic(returnToPeerId, scheduled) = botStart.behavior { + strongSelf.openPeer(peerId: returnToPeerId, navigation: .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: inputString)), subject: scheduled ? .scheduledMessages : nil), fromMessage: nil) } else { - strongSelf.openPeer(peerId: peerId, navigation: .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: inputString)), messageId: nil), fromMessage: nil) + strongSelf.openPeer(peerId: peerId, navigation: .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: inputString)), subject: nil), fromMessage: nil) } }, openUrl: { [weak self] url, concealed, _ in if let strongSelf = self { @@ -856,6 +874,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, shareCurrentLocation: { [weak self] in if let strongSelf = self { + guard !strongSelf.presentationInterfaceState.isScheduledMessages else { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ScheduledMessages_BotActionUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + return + } strongSelf.present(textAlertController(context: strongSelf.context, title: strongSelf.presentationData.strings.Conversation_ShareBotLocationConfirmationTitle, text: strongSelf.presentationData.strings.Conversation_ShareBotLocationConfirmation, actions: [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { if let strongSelf = self, let locationManager = strongSelf.context.sharedContext.locationManager { let _ = (currentLocationManagerCoordinate(manager: locationManager, timeout: 5.0) @@ -873,6 +895,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, shareAccountContact: { [weak self] in if let strongSelf = self { + guard !strongSelf.presentationInterfaceState.isScheduledMessages else { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ScheduledMessages_BotActionUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + return + } strongSelf.present(textAlertController(context: strongSelf.context, title: strongSelf.presentationData.strings.Conversation_ShareBotContactConfirmationTitle, text: strongSelf.presentationData.strings.Conversation_ShareBotContactConfirmation, actions: [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { if let strongSelf = self { let _ = (strongSelf.context.account.postbox.loadedPeerWithId(strongSelf.context.account.peerId) @@ -1134,7 +1160,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_LinkDialogOpen, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() if let strongSelf = self { - strongSelf.openPeer(peerId: peerId, navigation: .chat(textInputState: nil, messageId: nil), fromMessage: nil) + strongSelf.openPeer(peerId: peerId, navigation: .chat(textInputState: nil, subject: nil), fromMessage: nil) } })) if !mention.isEmpty { @@ -1458,7 +1484,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, sendScheduledMessagesNow: { [weak self] messageIds in if let strongSelf = self { - strongSelf.sendScheduledMessagesNow(messageIds) + let _ = sendScheduledMessageNowInteractively(postbox: strongSelf.context.account.postbox, messageId: messageIds.first!).start() } }, editScheduledMessagesTime: { [weak self] messageIds in if let strongSelf = self, let messageId = messageIds.first { @@ -2183,7 +2209,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var slowmodeState: ChatSlowmodeState? if let cachedData = combinedInitialData.cachedData as? CachedChannelData { pinnedMessageId = cachedData.pinnedMessageId - if let channel = combinedInitialData.initialData?.peer as? TelegramChannel, channel.isRestrictedBySlowmode, let timeout = cachedData.slowModeTimeout { + if let channel = combinedInitialData.initialData?.peer as? TelegramChannel, channel.isRestrictedBySlowmode, let timeout = cachedData.slowModeTimeout, !strongSelf.presentationInterfaceState.isScheduledMessages { if let slowmodeUntilTimestamp = calculateSlowmodeActiveUntilTimestamp(account: strongSelf.context.account, untilTimestamp: cachedData.slowModeValidUntilTimestamp) { slowmodeState = ChatSlowmodeState(timeout: timeout, variant: .timestamp(slowmodeUntilTimestamp)) } @@ -2480,6 +2506,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self, let validLayout = strongSelf.validLayout { var mappedTransition: (ChatHistoryListViewTransition, ListViewUpdateSizeAndInsets?)? + let isScheduledMessages = strongSelf.presentationInterfaceState.isScheduledMessages strongSelf.chatDisplayNode.containerLayoutUpdated(validLayout, navigationBarHeight: strongSelf.navigationHeight, transition: .animated(duration: 0.2, curve: .easeInOut), listViewTransaction: { updateSizeAndInsets, _, _ in var options = transition.options let _ = options.insert(.Synchronous) @@ -2493,17 +2520,21 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) var maxInsertedItem: Int? + var insertedIndex: Int? var insertItems: [ListViewInsertItem] = [] for i in 0 ..< transition.insertItems.count { let item = transition.insertItems[i] if item.directionHint == .Down && (maxInsertedItem == nil || maxInsertedItem! < item.index) { maxInsertedItem = item.index } + insertedIndex = item.index insertItems.append(ListViewInsertItem(index: item.index, previousIndex: item.previousIndex, item: item.item, directionHint: item.directionHint == .Down ? .Up : nil)) } var scrollToItem: ListViewScrollToItem? - if transition.historyView.originalView.laterId == nil { + if isScheduledMessages, let insertedIndex = insertedIndex { + scrollToItem = ListViewScrollToItem(index: insertedIndex, position: .visible, animated: true, curve: .Default(duration: 0.2), directionHint: .Down) + } else if transition.historyView.originalView.laterId == nil { scrollToItem = ListViewScrollToItem(index: 0, position: .top(0.0), animated: true, curve: .Default(duration: 0.2), directionHint: .Up) } @@ -2559,9 +2590,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: transformedMessages) - |> deliverOnMainQueue).start(next: { _ in + |> deliverOnMainQueue).start(next: { messageIds in if let strongSelf = self { - strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory() + if strongSelf.presentationInterfaceState.isScheduledMessages { + } else { + strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory() + } } }) @@ -3078,7 +3112,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } if let navigationController = strongSelf.navigationController as? NavigationController { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), messageId: nil, keepStack: .always)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: nil, keepStack: .always)) } }, openPeerInfo: { [weak self] in self?.navigationButtonAction(.openChatInfo) @@ -3132,7 +3166,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, botSwitchChatWithPayload: { [weak self] peerId, payload in if let strongSelf = self, case let .peer(currentPeerId) = strongSelf.chatLocation { - strongSelf.openPeer(peerId: peerId, navigation: .withBotStartPayload(ChatControllerInitialBotStart(payload: payload, behavior: .automatic(returnToPeerId: currentPeerId))), fromMessage: nil) + strongSelf.openPeer(peerId: peerId, navigation: .withBotStartPayload(ChatControllerInitialBotStart(payload: payload, behavior: .automatic(returnToPeerId: currentPeerId, scheduled: strongSelf.presentationInterfaceState.isScheduledMessages))), fromMessage: nil) } }, beginMediaRecording: { [weak self] isVideo in guard let strongSelf = self else { @@ -3921,7 +3955,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let actions: [TextAlertAction] if moreInfo { actions = [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Generic_ErrorMoreInfo, action: { - self?.openPeerMention("spambot", navigation: .chat(textInputState: nil, messageId: nil)) + self?.openPeerMention("spambot", navigation: .chat(textInputState: nil, subject: nil)) }), TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_OK, action: {})] } else { actions = [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})] @@ -4634,7 +4668,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let account = self.context.account - let beginClear: (InteractiveMessagesDeletionType) -> Void = { [weak self] type in + let beginClear: (InteractiveHistoryClearingType) -> Void = { [weak self] type in guard let strongSelf = self else { return } @@ -4642,7 +4676,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.chatDisplayNode.historyNode.historyAppearsCleared = true let statusText: String - if case .forEveryone = type { + if strongSelf.presentationInterfaceState.isScheduledMessages { + statusText = strongSelf.presentationData.strings.Undo_ScheduledMessagesCleared + } else if case .forEveryone = type { statusText = strongSelf.presentationData.strings.Undo_ChatClearedForBothSides } else { statusText = strongSelf.presentationData.strings.Undo_ChatCleared @@ -4661,16 +4697,21 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) var items: [ActionSheetItem] = [] - - if canRemoveGlobally { + + if self.presentationInterfaceState.isScheduledMessages { + items.append(ActionSheetButtonItem(title: self.presentationData.strings.ScheduledMessages_ClearAllConfirmation, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + beginClear(.scheduledMessages) + })) + } else if canRemoveGlobally { items.append(DeleteChatPeerActionSheetItem(context: self.context, peer: mainPeer, chatPeer: chatPeer, action: .clearHistory, strings: self.presentationData.strings)) items.append(ActionSheetButtonItem(title: self.presentationData.strings.ChatList_DeleteForEveryone(mainPeer.compactDisplayTitle).0, color: .destructive, action: { [weak actionSheet] in beginClear(.forEveryone) actionSheet?.dismissAnimated() })) items.append(ActionSheetButtonItem(title: self.presentationData.strings.ChatList_DeleteForCurrentUser, color: .destructive, action: { [weak actionSheet] in - beginClear(.forLocalPeer) actionSheet?.dismissAnimated() + beginClear(.forLocalPeer) })) } else { items.append(ActionSheetTextItem(title: text)) @@ -4876,13 +4917,15 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentMultipleFilesDisabled, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - }, sendMessagesWithSignals: { [weak self] signals, silentPosting in + }, sendMessagesWithSignals: { [weak self] signals, mode in if !inputText.string.isEmpty { //strongSelf.clearInputText() } if editMediaOptions != nil { self?.editMessageMediaWithLegacySignals(signals!) } else { + var silentPosting = false + //if mode == self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) } }, selectRecentlyUsedInlineBot: { [weak self] peer in @@ -5043,9 +5086,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentLimitReached, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) }) controller.descriptionGenerator = legacyAssetPickerItemGenerator() - controller.completionBlock = { [weak legacyController] signals, silentPosting in + controller.completionBlock = { [weak legacyController] signals, mode in if let legacyController = legacyController { legacyController.dismiss() + var silentPosting = false completion(signals!, silentPosting) } } @@ -5149,7 +5193,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) strongSelf.sendMessages([message]) } - }, theme: strongSelf.presentationData.theme), in: .window(.root)) + }, theme: strongSelf.presentationData.theme, hasLiveLocation: !strongSelf.presentationInterfaceState.isScheduledMessages), in: .window(.root)) }) } @@ -5292,10 +5336,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } - private func sendScheduledMessagesNow(_ messageId: [MessageId]) { - let _ = sendScheduledMessageNowInteractively(postbox: self.context.account.postbox, messageId: messageId.first!).start() - } - private func sendMessages(_ messages: [EnqueueMessage], commit: Bool = false) { guard case let .peer(peerId) = self.chatLocation else { return @@ -5327,12 +5367,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } - private func enqueueMediaMessages(signals: [Any]?, silentPosting: Bool) { + private func enqueueMediaMessages(signals: [Any]?, silentPosting: Bool, scheduleTime: Int32? = nil) { if case .peer = self.chatLocation { self.enqueueMediaMessageDisposable.set((legacyAssetPickerEnqueueMessages(account: self.context.account, signals: signals!) |> deliverOnMainQueue).start(next: { [weak self] messages in if let strongSelf = self { - let messages = strongSelf.transformEnqueueMessages(messages, silentPosting: silentPosting) + let messages = strongSelf.transformEnqueueMessages(messages, silentPosting: silentPosting, scheduleTime: scheduleTime) let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({ if let strongSelf = self { @@ -5838,9 +5878,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } - if case let .peer(peerId) = self.chatLocation, let messageId = messageLocation.messageId, (messageId.peerId != peerId && !forceInCurrentChat) || (self.presentationInterfaceState.isScheduledMessages && messageId.id != 0) { + if case let .peer(peerId) = self.chatLocation, let messageId = messageLocation.messageId, (messageId.peerId != peerId && !forceInCurrentChat) || (self.presentationInterfaceState.isScheduledMessages && messageId.id != 0 && !Namespaces.Message.allScheduled.contains(messageId.namespace)) { if let navigationController = self.navigationController as? NavigationController { - self.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: self.context, chatLocation: .peer(messageId.peerId), messageId: messageId, keepStack: .always)) + self.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: self.context, chatLocation: .peer(messageId.peerId), subject: .message(messageId), keepStack: .always)) } } else if case let .peer(peerId) = self.chatLocation, (messageLocation.peerId == peerId || forceInCurrentChat) { if let fromIndex = fromIndex { @@ -5853,6 +5893,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.messageIndexDisposable.set(nil) self.chatDisplayNode.historyNode.scrollToMessage(from: fromIndex, to: message.index, animated: animated, scrollPosition: scrollPosition) completion?() + } else if case let .index(index) = messageLocation, index.id.id == 0 && index.timestamp > 0, self.presentationInterfaceState.isScheduledMessages { + self.chatDisplayNode.historyNode.scrollToMessage(from: fromIndex, to: index, animated: animated, scrollPosition: scrollPosition) } else { self.loadingMessage.set(true) let searchLocation: ChatHistoryInitialSearchLocation @@ -6117,7 +6159,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } })) - case let .chat(textInputState, messageId): + case let .chat(textInputState, subject): if let textInputState = textInputState { let _ = (self.context.account.postbox.transaction({ transaction -> Void in transaction.updatePeerChatInterfaceState(peerId, update: { currentState in @@ -6130,11 +6172,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) |> deliverOnMainQueue).start(completed: { [weak self] in if let strongSelf = self, let navigationController = strongSelf.navigationController as? NavigationController { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), messageId: messageId, updateTextInputState: textInputState)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject, updateTextInputState: textInputState)) } }) } else { - (self.navigationController as? NavigationController)?.pushViewController(ChatControllerImpl(context: self.context, chatLocation: .peer(peerId), subject: messageId.flatMap({ .message($0) }))) + (self.navigationController as? NavigationController)?.pushViewController(ChatControllerImpl(context: self.context, chatLocation: .peer(peerId), subject: subject)) } case let .withBotStartPayload(botStart): (self.navigationController as? NavigationController)?.pushViewController(ChatControllerImpl(context: self.context, chatLocation: .peer(peerId), botStart: botStart)) @@ -6253,7 +6295,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var navigation = navigation if case .default = navigation { if let peer = peer as? TelegramUser, peer.botInfo != nil { - navigation = .chat(textInputState: nil, messageId: nil) + navigation = .chat(textInputState: nil, subject: nil) } } strongSelf.openResolved(.peer(peer.id, navigation)) @@ -6504,13 +6546,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } switch navigation { - case let .chat(_, messageId): + case let .chat(_, subject): if case .peer(peerId) = strongSelf.chatLocation { - if let messageId = messageId { + if let subject = subject, case let .message(messageId) = subject { strongSelf.navigateToMessage(from: nil, to: .id(messageId)) } } else if let navigationController = strongSelf.navigationController as? NavigationController { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), messageId: messageId, keepStack: .always)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject, keepStack: .always)) } case .info: strongSelf.navigationActionDisposable.set((strongSelf.context.account.postbox.loadedPeerWithId(peerId) diff --git a/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift b/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift index 4a6914766f..3cfdd04a63 100644 --- a/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift @@ -455,8 +455,8 @@ final class ChatEmptyNode: ASDisplayNode { } let contentType: ChatEmptyNodeContentType - if let peer = interfaceState.renderedPeer?.peer { - if peer.id == self.accountPeerId && !interfaceState.isScheduledMessages { + if let peer = interfaceState.renderedPeer?.peer, !interfaceState.isScheduledMessages { + if peer.id == self.accountPeerId { contentType = .cloud } else if let _ = peer as? TelegramSecretChat { contentType = .secret diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index 6efa58a4db..733d040d61 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -1113,10 +1113,6 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Scroll(index: .message(toIndex), anchorIndex: .message(toIndex), sourceIndex: .message(fromIndex), scrollPosition: scrollPosition, animated: animated), id: self.takeNextHistoryLocationId()) } - func scrollWithDeltaOffset(_ offset: CGFloat) { - - } - public func anchorMessageInCurrentHistoryView() -> Message? { if let historyView = self.historyView { if let visibleRange = self.displayedItemRange.visibleRange { diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift index ae12d1ee33..ceb3afdf85 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift @@ -26,36 +26,36 @@ func preloadedChatHistoryViewForLocation(_ location: ChatHistoryLocationInput, a } func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, account: Account, chatLocation: ChatLocation, scheduled: Bool, fixedCombinedReadStates: MessageHistoryViewReadState?, tagMask: MessageTags?, additionalData: [AdditionalMessageHistoryViewData], orderStatistics: MessageHistoryViewOrderStatistics = []) -> Signal { - if scheduled { - var preloaded = false - var fadeIn = false + var first = true + var chatScrollPosition: ChatHistoryViewScrollPosition? + if case let .Scroll(index, _, sourceIndex, position, animated) = location.content { + let directionHint: ListViewScrollToItemDirectionHint = sourceIndex > index ? .Down : .Up + chatScrollPosition = .index(index: index, position: position, directionHint: directionHint, animated: animated) + } return account.viewTracker.scheduledMessagesViewForLocation(chatLocation) |> map { view, updateType, initialData -> ChatHistoryViewUpdate in let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation) let combinedInitialData = ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData) - if preloaded { - return .HistoryView(view: view, type: .Generic(type: updateType), scrollPosition: nil, flashIndicators: false, originalScrollPosition: nil, initialData: combinedInitialData, id: location.id) - } else { - if view.isLoading { - return .Loading(initialData: combinedInitialData, type: .Generic(type: updateType)) - } - var scrollPosition: ChatHistoryViewScrollPosition? - -// if let historyScrollState = (initialData?.chatInterfaceState as? ChatInterfaceState)?.historyScrollState, tagMask == nil { -// scrollPosition = .positionRestoration(index: historyScrollState.messageIndex, relativeOffset: CGFloat(historyScrollState.relativeOffset)) -// } else { -// if view.entries.isEmpty && (view.holeEarlier || view.holeLater) { -// fadeIn = true -// return .Loading(initialData: combinedInitialData, type: .Generic(type: updateType)) -// } -// } - - preloaded = true - return .HistoryView(view: view, type: .Initial(fadeIn: fadeIn), scrollPosition: scrollPosition, flashIndicators: false, originalScrollPosition: nil, initialData: ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData), id: location.id) + if view.isLoading { + return .Loading(initialData: combinedInitialData, type: .Generic(type: updateType)) } + + let type: ChatHistoryViewUpdateType + let scrollPosition: ChatHistoryViewScrollPosition? = first ? chatScrollPosition : nil + if first { + first = false + if chatScrollPosition == nil { + type = .Initial(fadeIn: false) + } else { + type = .Generic(type: .UpdateVisible) + } + } else { + type = .Generic(type: updateType) + } + return .HistoryView(view: view, type: type, scrollPosition: scrollPosition, flashIndicators: false, originalScrollPosition: chatScrollPosition, initialData: ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData), id: location.id) } } else { switch location.content { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 9c1ba28f25..fcef87b219 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -379,8 +379,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { avatarInset = 0.0 } + let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) + var needShareButton = false - if item.message.id.peerId == item.context.account.peerId { + if isFailed { + needShareButton = false + } else if item.message.id.peerId == item.context.account.peerId { for attribute in item.content.firstMessage.attributes { if let _ = attribute as? SourceReferenceMessageAttribute { needShareButton = true @@ -424,7 +428,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } var deliveryFailedInset: CGFloat = 0.0 - if item.content.firstMessage.flags.contains(.Failed) { + if isFailed { deliveryFailedInset += 24.0 } @@ -446,7 +450,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if item.message.effectivelyIncoming(item.context.account.peerId) { statusType = .FreeIncoming } else { - if item.message.flags.contains(.Failed) { + if isFailed { statusType = .FreeOutgoing(.Failed) } else if item.message.flags.isSending && !item.message.isSentOrAcknowledged { statusType = .FreeOutgoing(.Sending) @@ -659,7 +663,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { strongSelf.replyInfoNode = nil } - if item.content.firstMessage.flags.contains(.Failed) { + if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode var isAppearing = false if let current = strongSelf.deliveryFailedNode { @@ -740,7 +744,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { var navigate: ChatControllerInteractionNavigateToPeer if item.content.firstMessage.id.peerId == item.context.account.peerId { - navigate = .chat(textInputState: nil, messageId: nil) + navigate = .chat(textInputState: nil, subject: nil) } else { navigate = .info } @@ -748,7 +752,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { for attribute in item.content.firstMessage.attributes { if let attribute = attribute as? SourceReferenceMessageAttribute { openPeerId = attribute.messageId.peerId - navigate = .chat(textInputState: nil, messageId: attribute.messageId) + navigate = .chat(textInputState: nil, subject: .message(attribute.messageId)) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 56be379212..63243f3871 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -666,8 +666,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { avatarInset = 0.0 } + let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) + var needShareButton = false - if item.message.flags.contains(.Failed) { + if isFailed { needShareButton = false } else if item.message.id.peerId == item.context.account.peerId { if let _ = sourceReference { @@ -731,7 +733,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { } var deliveryFailedInset: CGFloat = 0.0 - if item.content.firstMessage.flags.contains(.Failed) { + if isFailed { deliveryFailedInset += 24.0 } @@ -1032,7 +1034,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { if message.effectivelyIncoming(item.context.account.peerId) { statusType = .ImageIncoming } else { - if message.flags.contains(.Failed) { + if isFailed { statusType = .ImageOutgoing(.Failed) } else if message.flags.isSending && !message.isSentOrAcknowledged { statusType = .ImageOutgoing(.Sending) @@ -1587,7 +1589,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { strongSelf.backgroundType = backgroundType - if item.content.firstMessage.flags.contains(.Failed) { + let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) + if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode var isAppearing = false if let current = strongSelf.deliveryFailedNode { @@ -2133,7 +2136,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { var navigate: ChatControllerInteractionNavigateToPeer if item.content.firstMessage.id.peerId == item.context.account.peerId { - navigate = .chat(textInputState: nil, messageId: nil) + navigate = .chat(textInputState: nil, subject: nil) } else { navigate = .info } @@ -2141,7 +2144,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { for attribute in item.content.firstMessage.attributes { if let attribute = attribute as? SourceReferenceMessageAttribute { openPeerId = attribute.messageId.peerId - navigate = .chat(textInputState: nil, messageId: attribute.messageId) + navigate = .chat(textInputState: nil, subject: .message(attribute.messageId)) } } @@ -2225,7 +2228,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { break loop case let .peerMention(peerId, _): foundTapAction = true - self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, messageId: nil), nil) + self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, subject: nil), nil) break loop case let .textMention(name): foundTapAction = true diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift index 6758350385..f0763787e9 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift @@ -580,7 +580,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { var navigate: ChatControllerInteractionNavigateToPeer if item.content.firstMessage.id.peerId == item.context.account.peerId { - navigate = .chat(textInputState: nil, messageId: nil) + navigate = .chat(textInputState: nil, subject: nil) } else { navigate = .info } @@ -588,7 +588,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { for attribute in item.content.firstMessage.attributes { if let attribute = attribute as? SourceReferenceMessageAttribute { openPeerId = attribute.messageId.peerId - navigate = .chat(textInputState: nil, messageId: attribute.messageId) + navigate = .chat(textInputState: nil, subject: .message(attribute.messageId)) } } @@ -631,7 +631,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { } item.controllerInteraction.navigateToMessage(item.message.id, sourceMessageId) } else if let id = forwardInfo.source?.id ?? forwardInfo.author?.id { - item.controllerInteraction.openPeer(id, .chat(textInputState: nil, messageId: nil), nil) + item.controllerInteraction.openPeer(id, .chat(textInputState: nil, subject: nil), nil) } else if let _ = forwardInfo.authorSignature { item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_ForwardAuthorHiddenTooltip, forwardInfoNode, nil) } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift index 262e137a64..eeb2a51b28 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift @@ -181,8 +181,10 @@ class ChatMessageStickerItemNode: ChatMessageItemView { avatarInset = 0.0 } + let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) + var needShareButton = false - if item.message.flags.contains(.Failed) { + if isFailed { needShareButton = false } else if item.message.id.peerId == item.context.account.peerId { for attribute in item.content.firstMessage.attributes { @@ -228,7 +230,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { } var deliveryFailedInset: CGFloat = 0.0 - if item.content.firstMessage.flags.contains(.Failed) { + if isFailed { deliveryFailedInset += 24.0 } @@ -246,7 +248,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { if item.message.effectivelyIncoming(item.context.account.peerId) { statusType = .FreeIncoming } else { - if item.message.flags.contains(.Failed) { + if isFailed { statusType = .FreeOutgoing(.Failed) } else if item.message.flags.isSending && !item.message.isSentOrAcknowledged { statusType = .FreeOutgoing(.Sending) @@ -503,7 +505,8 @@ class ChatMessageStickerItemNode: ChatMessageItemView { strongSelf.replyInfoNode = nil } - if item.content.firstMessage.flags.contains(.Failed) { + + if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode var isAppearing = false if let current = strongSelf.deliveryFailedNode { @@ -584,7 +587,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { var navigate: ChatControllerInteractionNavigateToPeer if item.content.firstMessage.id.peerId == item.context.account.peerId { - navigate = .chat(textInputState: nil, messageId: nil) + navigate = .chat(textInputState: nil, subject: nil) } else { navigate = .info } @@ -592,7 +595,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { for attribute in item.content.firstMessage.attributes { if let attribute = attribute as? SourceReferenceMessageAttribute { openPeerId = attribute.messageId.peerId - navigate = .chat(textInputState: nil, messageId: attribute.messageId) + navigate = .chat(textInputState: nil, subject: .message(attribute.messageId)) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift b/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift index 5a0d87496f..58acf63749 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift @@ -48,6 +48,8 @@ public final class ChatPresentationData { let nameDisplayOrder: PresentationPersonNameOrder let disableAnimations: Bool let largeEmoji: Bool + let animatedEmojiScale: CGFloat + let isPreview: Bool let messageFont: UIFont let messageEmojiFont1: UIFont @@ -59,9 +61,7 @@ public final class ChatPresentationData { let messageFixedFont: UIFont let messageBlockQuoteFont: UIFont - let animatedEmojiScale: CGFloat - - init(theme: ChatPresentationThemeData, fontSize: PresentationFontSize, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, disableAnimations: Bool, largeEmoji: Bool, animatedEmojiScale: CGFloat = 1.0) { + init(theme: ChatPresentationThemeData, fontSize: PresentationFontSize, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, disableAnimations: Bool, largeEmoji: Bool, animatedEmojiScale: CGFloat = 1.0, isPreview: Bool = false) { self.theme = theme self.fontSize = fontSize self.strings = strings @@ -69,6 +69,7 @@ public final class ChatPresentationData { self.nameDisplayOrder = nameDisplayOrder self.disableAnimations = disableAnimations self.largeEmoji = largeEmoji + self.isPreview = isPreview let baseFontSize = fontSize.baseDisplaySize self.messageFont = UIFont.systemFont(ofSize: baseFontSize) diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 65c1109da2..0e377b5f14 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -785,12 +785,11 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { strongSelf.controllerInteraction.presentController(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_ErrorInaccessibleMessage, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), nil) case .botStart: break - //strongSelf.openPeer(peerId: peerId, navigation: .withBotStartPayload(ChatControllerInitialBotStart(payload: payload, behavior: .interactive)), fromMessage: nil) case .groupBotStart: break case let .channelMessage(peerId, messageId): if let navigationController = strongSelf.getNavigationController() { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), messageId: messageId)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: .message(messageId))) } case let .stickerPack(name): strongSelf.presentController(StickerPackPreviewController(context: strongSelf.context, stickerPack: .name(name), parentNavigationController: strongSelf.getNavigationController()), nil) diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift index 2b5b3ebc45..37a54dc28b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift @@ -118,6 +118,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel strongSelf.updateMinimumDate() strongSelf.pickerView.layer.addShakeAnimation() } else { + strongSelf.doneButton.isUserInteractionEnabled = false strongSelf.completion?(Int32(strongSelf.pickerView.date.timeIntervalSince1970)) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift index 64e78945e9..c3deda52ee 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift @@ -23,7 +23,7 @@ private enum ChatSendMessageActionIcon { case .schedule: imageName = "Chat/Input/Menu/ScheduleIcon" } - return generateTintedImage(image: UIImage(bundleImageName: imageName), color: theme.actionSheet.primaryTextColor) + return generateTintedImage(image: UIImage(bundleImageName: imageName), color: theme.contextMenu.primaryColor) } } @@ -33,6 +33,7 @@ private final class ActionSheetItemNode: ASDisplayNode { private let action: () -> Void private let separatorNode: ASDisplayNode + private let backgroundNode: ASDisplayNode private let highlightedBackgroundNode: ASDisplayNode private let buttonNode: HighlightTrackingButtonNode private let iconNode: ASImageNode @@ -46,21 +47,35 @@ private final class ActionSheetItemNode: ASDisplayNode { self.action = action self.separatorNode = ASDisplayNode() - self.separatorNode.backgroundColor = theme.actionSheet.opaqueItemSeparatorColor + self.separatorNode.backgroundColor = theme.contextMenu.itemSeparatorColor + + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isAccessibilityElement = false + self.backgroundNode.backgroundColor = theme.contextMenu.itemBackgroundColor self.highlightedBackgroundNode = ASDisplayNode() - self.highlightedBackgroundNode.backgroundColor = theme.actionSheet.opaqueItemHighlightedBackgroundColor + self.highlightedBackgroundNode.isAccessibilityElement = false + self.highlightedBackgroundNode.backgroundColor = theme.contextMenu.itemHighlightedBackgroundColor self.highlightedBackgroundNode.alpha = 0.0 self.buttonNode = HighlightTrackingButtonNode() + self.buttonNode.isAccessibilityElement = true + self.buttonNode.accessibilityLabel = title self.titleNode = ImmediateTextNode() + self.titleNode.isAccessibilityElement = false self.titleNode.maximumNumberOfLines = 1 - self.titleNode.attributedText = NSAttributedString(string: title, font: Font.regular(17.0), textColor: theme.actionSheet.primaryTextColor) + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.regular(17.0), textColor: theme.contextMenu.primaryColor) + self.titleNode.isUserInteractionEnabled = false + self.titleNode.displaysAsynchronously = false self.iconNode = ASImageNode() self.iconNode.image = icon.image(theme: theme) self.iconNode.contentMode = .center + self.iconNode.isAccessibilityElement = false + self.iconNode.displaysAsynchronously = false + self.iconNode.displayWithoutProcessing = true + self.iconNode.isUserInteractionEnabled = false super.init() @@ -87,9 +102,10 @@ private final class ActionSheetItemNode: ASDisplayNode { } func updateTheme(_ theme: PresentationTheme) { - self.separatorNode.backgroundColor = theme.actionSheet.opaqueItemSeparatorColor - self.highlightedBackgroundNode.backgroundColor = theme.actionSheet.opaqueItemHighlightedBackgroundColor - self.titleNode.attributedText = NSAttributedString(string: self.title, font: Font.regular(17.0), textColor: theme.actionSheet.primaryTextColor) + self.separatorNode.backgroundColor = theme.contextMenu.itemSeparatorColor + self.backgroundNode.backgroundColor = theme.contextMenu.itemBackgroundColor + self.highlightedBackgroundNode.backgroundColor = theme.contextMenu.itemHighlightedBackgroundColor + self.titleNode.attributedText = NSAttributedString(string: self.title, font: Font.regular(17.0), textColor: theme.contextMenu.primaryColor) self.iconNode.image = self.icon.image(theme: theme) if let maxWidth = self.maxWidth { @@ -180,11 +196,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, self.dimNode = ASDisplayNode() self.dimNode.alpha = 1.0 - if self.presentationData.theme.chatList.searchBarKeyboardColor == .light { - self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.04) - } else { - self.dimNode.backgroundColor = presentationData.theme.chatList.backgroundColor.withAlphaComponent(0.2) - } + self.dimNode.backgroundColor = self.presentationData.theme.contextMenu.dimColor self.sendButtonNode = HighlightableButtonNode() self.sendButtonNode.imageNode.displayWithoutProcessing = false @@ -205,8 +217,8 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, self.scrollNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0) self.contentContainerNode = ASDisplayNode() - self.contentContainerNode.backgroundColor = self.presentationData.theme.actionSheet.opaqueItemBackgroundColor - self.contentContainerNode.cornerRadius = 12.0 + self.contentContainerNode.backgroundColor = self.presentationData.theme.contextMenu.backgroundColor + self.contentContainerNode.cornerRadius = 14.0 self.contentContainerNode.clipsToBounds = true var contentNodes: [ActionSheetItemNode] = [] @@ -296,19 +308,18 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, } self.presentationData = presentationData - if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { - self.effectView.effect = UIBlurEffect(style: .dark) + if #available(iOS 9.0, *) { } else { - self.effectView.effect = UIBlurEffect(style: .light) + if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + self.effectView.effect = UIBlurEffect(style: .dark) + } else { + self.effectView.effect = UIBlurEffect(style: .light) + } } - if self.presentationData.theme.chatList.searchBarKeyboardColor == .light { - self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.04) - } else { - self.dimNode.backgroundColor = presentationData.theme.chatList.backgroundColor.withAlphaComponent(0.2) - } + self.dimNode.backgroundColor = presentationData.theme.contextMenu.dimColor - self.contentContainerNode.backgroundColor = self.presentationData.theme.actionSheet.opaqueItemBackgroundColor + self.contentContainerNode.backgroundColor = self.presentationData.theme.contextMenu.backgroundColor self.textCoverNode.backgroundColor = self.presentationData.theme.chat.inputPanel.inputBackgroundColor self.buttonCoverNode.backgroundColor = self.presentationData.theme.chat.inputPanel.panelBackgroundColor self.sendButtonNode.setImage(PresentationResourcesChat.chatInputPanelSendButtonImage(self.presentationData.theme), for: []) @@ -329,39 +340,14 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, func animateIn() { self.textInputNode.textView.setContentOffset(self.textInputNode.textView.contentOffset, animated: false) - UIView.animate(withDuration: 0.4, animations: { + UIView.animate(withDuration: 0.2, animations: { if #available(iOS 9.0, *) { - if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { - if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { - self.effectView.effect = UIBlurEffect(style: .regular) - if self.effectView.subviews.count == 2 { - self.effectView.subviews[1].isHidden = true - } - } else { - self.effectView.effect = UIBlurEffect(style: .dark) - } - } else { - if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { - self.effectView.effect = UIBlurEffect(style: .regular) - } else { - self.effectView.effect = UIBlurEffect(style: .light) - } - } + self.effectView.effect = makeCustomZoomBlurEffect() } else { self.effectView.alpha = 1.0 } - }, completion: { [weak self] _ in - guard let strongSelf = self else { - return - } - if strongSelf.presentationData.theme.chatList.searchBarKeyboardColor == .dark { - if strongSelf.effectView.subviews.count == 2 { - strongSelf.effectView.subviews[1].isHidden = true - } - } - }) - self.effectView.subviews[1].layer.removeAnimation(forKey: "backgroundColor") - self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + }, completion: { _ in }) + self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) self.contentContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) self.messageBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) @@ -401,9 +387,11 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, let textOffset = self.textInputNode.textView.contentSize.height - self.textInputNode.textView.contentOffset.y - self.textInputNode.textView.frame.height self.fromMessageTextNode.layer.animatePosition(from: CGPoint(x: 0.0, y: delta * 2.0 + textOffset), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true) self.toMessageTextNode.layer.animatePosition(from: CGPoint(x: 0.0, y: delta * 2.0 + textOffset), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true) - - self.contentContainerNode.layer.animatePosition(from: CGPoint(x: 160.0, y: 0.0), to: CGPoint(), duration: duration, timingFunction: kCAMediaTimingFunctionSpring, additive: true) - self.contentContainerNode.layer.animateScale(from: 0.45, to: 1.0, duration: duration, timingFunction: kCAMediaTimingFunctionSpring) + + let springDuration: Double = 0.42 + let springDamping: CGFloat = 104.0 + self.contentContainerNode.layer.animateSpring(from: 0.1 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping) + self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: 160.0, y: 0.0)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true) } } @@ -436,7 +424,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, intermediateCompletion() }) - self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) + self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in }) if cancel { @@ -522,7 +510,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, let sideInset: CGFloat = 43.0 var contentSize = CGSize() - contentSize.width = min(layout.size.width - 40.0, 240.0) + contentSize.width = min(layout.size.width - 40.0, 250.0) var applyNodes: [(ASDisplayNode, CGFloat, (CGFloat) -> Void)] = [] for itemNode in self.contentNodes { let (width, height, apply) = itemNode.updateLayout(maxWidth: layout.size.width - sideInset * 2.0) diff --git a/submodules/TelegramUI/TelegramUI/DebugController.swift b/submodules/TelegramUI/TelegramUI/DebugController.swift index 125465f295..0c96ed38dd 100644 --- a/submodules/TelegramUI/TelegramUI/DebugController.swift +++ b/submodules/TelegramUI/TelegramUI/DebugController.swift @@ -57,7 +57,6 @@ private enum DebugControllerEntry: ItemListNodeEntry { case resetData(PresentationTheme) case resetDatabase(PresentationTheme) case resetHoles(PresentationTheme) - case resetBiometricsData(PresentationTheme) case optimizeDatabase(PresentationTheme) case photoPreview(PresentationTheme, Bool) case knockoutWallpaper(PresentationTheme, Bool) @@ -74,7 +73,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .enableRaiseToSpeak, .keepChatNavigationStack, .skipReadHistory, .crashOnSlowQueries: return DebugControllerSection.experiments.rawValue - case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .exportTheme: + case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .exportTheme: return DebugControllerSection.experiments.rawValue case .versionInfo: return DebugControllerSection.info.rawValue @@ -117,18 +116,16 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 15 case .resetHoles: return 16 - case .resetBiometricsData: - return 17 case .optimizeDatabase: - return 18 + return 17 case .photoPreview: - return 19 + return 18 case .knockoutWallpaper: - return 21 + return 19 case .exportTheme: - return 22 + return 20 case .versionInfo: - return 23 + return 21 } } @@ -443,12 +440,6 @@ private enum DebugControllerEntry: ItemListNodeEntry { controller.dismiss() }) }) - case let .resetBiometricsData(theme): - return ItemListActionItem(theme: theme, title: "Reset Biometrics Data", kind: .destructive, alignment: .natural, sectionId: self.section, style: .blocks, action: { - let _ = updatePresentationPasscodeSettingsInteractively(accountManager: arguments.sharedContext.accountManager, { settings in - return settings.withUpdatedBiometricsDomainState(nil).withUpdatedShareBiometricsDomainState(nil) - }).start() - }) case let .optimizeDatabase(theme): return ItemListActionItem(theme: theme, title: "Optimize Database", kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { guard let context = arguments.context else { diff --git a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift index b8af1a9efd..0dc3f57023 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift @@ -63,8 +63,9 @@ func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAt if peer is TelegramUser { controller.hasTimer = true } - controller.hasSilentPosting = true + controller.hasSilentPosting = !isSecretChat } + controller.hasSchedule = !isSecretChat let screenSize = parentController.view.bounds.size var startFrame = CGRect(x: 0, y: screenSize.height, width: screenSize.width, height: screenSize.height) diff --git a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift index 48d8e757b3..fd99abd103 100644 --- a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift +++ b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift @@ -13,11 +13,11 @@ public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParam 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 { + 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 messageId = params.messageId { + 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 @@ -60,7 +60,7 @@ public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParam } } } else { - controller = ChatControllerImpl(context: params.context, chatLocation: params.chatLocation, subject: params.messageId.flatMap({ .message($0) }), botStart: params.botStart) + controller = ChatControllerImpl(context: params.context, chatLocation: params.chatLocation, subject: params.subject, botStart: params.botStart) } controller.purposefulAction = params.purposefulAction let resolvedKeepStack: Bool diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index c8e6f00fd6..97471f8e52 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -18,9 +18,9 @@ private func defaultNavigationForPeerId(_ peerId: PeerId?, navigation: ChatContr if case .default = navigation { if let peerId = peerId { if peerId.namespace == Namespaces.Peer.CloudUser { - return .chat(textInputState: nil, messageId: nil) + return .chat(textInputState: nil, subject: nil) } else { - return .chat(textInputState: nil, messageId: nil) + return .chat(textInputState: nil, subject: nil) } } else { return .info @@ -81,7 +81,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur dismissInput() present(controller, ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet)) case let .channelMessage(peerId, messageId): - openPeer(peerId, .chat(textInputState: nil, messageId: messageId)) + openPeer(peerId, .chat(textInputState: nil, subject: .message(messageId))) case let .stickerPack(name): dismissInput() let controller = StickerPackPreviewController(context: context, stickerPack: .name(name), parentNavigationController: navigationController) @@ -92,7 +92,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur case let .join(link): dismissInput() present(JoinLinkPreviewController(context: context, link: link, navigateToPeer: { peerId in - openPeer(peerId, .chat(textInputState: nil, messageId: nil)) + openPeer(peerId, .chat(textInputState: nil, subject: nil)) }), nil) case let .localization(identifier): dismissInput() diff --git a/submodules/TelegramUI/TelegramUI/OpenUrl.swift b/submodules/TelegramUI/TelegramUI/OpenUrl.swift index dff3178505..44bfd4fd27 100644 --- a/submodules/TelegramUI/TelegramUI/OpenUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenUrl.swift @@ -198,10 +198,10 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur navigationController?.pushViewController(infoController) } }) - case let .chat(_, messageId): + case let .chat(_, subject): context.sharedContext.applicationBindings.dismissNativeController() if let navigationController = navigationController { - context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId), messageId: messageId)) + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId), subject: subject)) } case let .withBotStartPayload(payload): context.sharedContext.applicationBindings.dismissNativeController() diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index f44edfbf6a..3eb05773a6 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -132,7 +132,7 @@ public class PeerMediaCollectionController: TelegramBaseController { ActionSheetButtonItem(title: strongSelf.presentationData.strings.SharedMedia_ViewInChat, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() if let strongSelf = self, let navigationController = strongSelf.navigationController as? NavigationController { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(strongSelf.peerId), messageId: message.id)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(strongSelf.peerId), subject: .message(message.id))) } }), ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_ContextMenuForward, color: .accent, action: { [weak actionSheet] in @@ -606,9 +606,9 @@ public class PeerMediaCollectionController: TelegramBaseController { strongSelf.context.sharedContext.openResolvedUrl(result, context: strongSelf.context, urlContext: .generic, navigationController: strongSelf.navigationController as? NavigationController, openPeer: { peerId, navigation in if let strongSelf = self { switch navigation { - case let .chat(_, messageId): + case let .chat(_, subject): if let navigationController = strongSelf.navigationController as? NavigationController { - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), messageId: messageId, keepStack: .always)) + strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject, keepStack: .always)) } case .info: strongSelf.navigationActionDisposable.set((strongSelf.context.account.postbox.loadedPeerWithId(peerId) diff --git a/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift b/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift index 232b7875c7..54d2bbab4d 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift @@ -487,7 +487,7 @@ final class PeerMessagesMediaPlaylist: SharedMediaPlaylist { self.loadingItem = true self.updateState() - let namespaces: HistoryViewNamespaces + let namespaces: MessageIdNamespaces if Namespaces.Message.allScheduled.contains(anchor.id.namespace) { namespaces = .just(Namespaces.Message.allScheduled) } else { diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index dfbb09288be2a683a61d03b642f0ac73ec0a3bfb..48966ed8aa8a59e95ddfcbf5e32580defb14d108 100644 GIT binary patch delta 30128 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 NeKpbwu|J_Y{{#0&VEh08 delta 30330 zcmZ5p2Y6IP*Jduc$?m52vNgRoy7T~{r$8toQbMvoB*}&pdR3(N0S*XKRC-J3N(&Z5 zq}mmw*p+Tq+W*enO~Uv4@Fcl2XXehGIdjf?%8WBExP5reja{o@e~#gC#Wt49dlW~p zKD@LzmG$N8i_=*izf>H@`tg5@V_AP5UXscN@IEC`Y#<+3VpX1P%oh#`;d@Jb*&u$Z zq_y%~V}2<+*1c&;c7BPy5&j#@Q%hU0=lRIeaAinie%UX?t!j*@7{<4iMzZ1jTxm0w z&zU2Fjo?v^cvir(@w1RmaF|qk<3^2Qxz~{pUj4i$KjF}`k^GFq#zyg9P&*p6adder zGxOLoKUTzBmqoD`_^`65A!AS#fR}V~RHk&Zm)gsV3h-xMWqxHizILqpYmB zs35Pd?*X%I+HOVc`FR+hx6c^gd1#v}VvVOsW`1Y}$Y9+cg^ZXkj-1DGL6}46T z`q+3jj*p$`&o3SDq z`|G;o%TZ0`m&>heI=^2Y&Sr4`iWqgK_PXtXJ{g6Dx%m|pW%v&9))#p}MR@2-sP@29 z=ltU0lq`EiMgA!H@w51=6_IQX8UtuqoBbX=Gn76JpSm%Sl zIgj@I^8C^QdrEG(eO!@!ym-+9UQij%7INF90KTR&h%MsPm9cCw|DrOLE#bPVRCPJp zTR8h9fag~EGR|uY1NgWqKV?N@GOuHyNx7pPl@90N7Md$R0>Mftf!1!L^xDFccM?GE|j8&NB`s%|n{T)_1oTmx=l< zeCK!*+se<3k6_#Q&GBZoo$Durt2;nx~VB z^t6jRCZw|6e8YqYbq@%weEtQaXFvOd%9L?wf}pxF)tqBNG~*I;=iU=_tcHh7G-vDs ztq-bm%N--pSBhBmQs-XYkGi^D)x};>P+n9f*s}iX4xm1iP7Pwge9=TbJIHBb6g$L^ zO^jfN`L&55>Jbo_Xjofj)b}VI=@7$s6Wo#T%v-1s%qZBsw?o^IqV}lsjXg@o6=Cy= zZQ9dORNAfFQ6=Z=IDb-L;u|LE*$KXVQVVvHU!N4A)I!d*@#n#lz1y5Z2V#x}=2sSs zP7&guuf3u&U)u<8J1hH*cjQ&t%QC94+v`8(9c=JK_AXyEIfA{%t0y;6PlG&^U+x*e zA58XOXSi-k0{ehBof4&-ZA`YQEZ$Hj^ge7%Y!$QcDXsOMWySduyA_R;40MjyPDx?s z`Ca_Hz%5f_)QjjdmM$J=M*1RwdAXH}ufEinXS@@`H%#?VE;r`6=VJ_#A4Szi{F|w< z>c?mm#_vz?=U12L+#IseCp>Xl6#Isj(V|(a-LE$MmVY}Q|egk3%+bxv&gSN zAs9W^?kFp^XJhk@nAq^`S5O(%e@5J`Q!@UgG7WA1vf zZGS*n0Kd^AP?w%2o_}o2pQs_!rVsOzBJw9bVMe6#GsNgg7UI@Yko?k^a)L3tU(E<* zH~AkkQq^1NB$Q@cgP?6c)4*=?9y4Rv9f;MY>@MFtGfKJFm^K_@Azod}A=2}(q0vpF z`~3dQrjfs)t(Xb1iz-sY&wlwM>bc-|)P_R>2J+`$^k;wavKMXaFTU)>NagRwRJ{%_ z9R8sTzw}~&@(=dY0&xDL7d_Q~(JGN|3<}_jU(oZUmjbQ-p+v~@-29@_%9OlHDOw~? zJU~q-&kr%l&wa#azGPvK`No%GSR?-aOR-GhcVCKUjd|#-Xy(E@%!*|yA2lmnb#-af zC|b_*_E|p6jlVT3zMT$b;#)Ls&vtZnl$L6$1BH$B&RR{aK`rLl%PQ?9BQ#BA;I@~; zRZq~Q^7|e(KJw)t#mj}3WwT)ajN~QAKlV*ph0U(H^4HeA9N6q$PfqdL-n;L||K;H30NSGK)FrEavXtSPCTr3L1`1#p3 zX5@EfN2wMNSb5E2lY3QJo#L|c_H$xY8)|~+)JrUYPn)Ax!|`b3?Y0MdbRM0L&n*@# z63O?@Nnla@t2s6`8U!X@V-E4`U)Imj)ln`8VqLhStJPiV7r6{^JbP{$i|5nl#wiId zu0GL7$_jSHS zXej6tfwGE9M~Rv|eteM$sB-55BPBLx{&EKl;GT=a0WVV*H?=;CrW!vN7nkLiK^f=S zD?2-i9p$3=AU<<(qVk*zzu3*f&n@<4gZb6PG3xVZ6wmXw2Xf02BOAh7FNsrzx=8t9 zZYI`#7zhLo(Dq{IVhBIc-Eb_92|!cFk1x@y`5>wjv0i|tx0l2Mng%Y71~hH6)XMC9 z@KO`t=!B(lfTNq1wopf-MF?dtW5J#fGbQ3pMJNiV^yw^=hc5G0UU1RWLic5XYz!Z| zEYe&I0wJiMLYf(6Tb8PpgU-am{R6n?a&K0_&CAo3N*8|WBY*Cb z>A@Y#^{k3dT%MwgbDmV05dM)32Y`m!Xwy={0fg`FYzZlTAhVXB6y!|p@Be=nG*^iGN6UUe9ac!FYg)5 zOIPSEbMYWPq&s%(^thQt6g~R3qkzkDsT1* z_Gk)Q3+Wf&m1Q55KVo8~y+Tl~=QfH|H=vV5>azl}tVFNpCFIFA^2rp*Ht`K)Wv}s* z6so=sq5xj~Ww0ySHF`t)meEqlY(`ZSFa0@6SC~Ihbi0N3SZ!0cqBvQqLOySGsItw4 z@9i7J-&*Yh!1v+mIO7h~8$hjLRSZ8}^t=kbHnX6GDR;cr6d%+k00=eOHHRE9)zq%%w9pE0XgsKNY z7fLhBnWm5q@m{Ya0lrOmC5|28n_e-qH~Gm|jLKUs^dy-DdOT%09OaK*NoU7->e^($ zu_0?ym6I-f<{$pOawTH-=ydzMKMM~^?kXa8>PJuu(PDW83?<)s~ryz*6lfV8=<+SCguv(ebY&^42`dh<&lyNIF? zI>k_Q`&D=K5+0Lzerp>yuMbczyU^C-%wmwM^%1HPq1nxpG?RHWi0F^`;`L3{Pf!~z z#1x(E$5eiOy`S=_CZ$}{1)qGz{We4?pS$qeqbv<=zu?0+G*`aVM!(cY!$@E8QybFN zE9lUsp?qQ6IAQ+R+`2KGeZw<0TG>_T2AguNUT(Ncku2uxx(mM=66)Ga{QWIIx6#bL zA9+0npzhl1@$7G|f5RB@59;N2mfImU1yiMTmVb(G_!pItd}B=z zfBuaC_8%YnMuhUfg@0KY$$x#rU44Y=7<$qkGT6M?pgeZr@tbYR6BpiVb2t!P$>tW} z46hYtlr&;HchBfIETc=8VOg13oih81l~?$?o5PjHDlMA{@%DIgu;QZ9#KFvLXetJv zqPd07j1TsQQZBTY)-8Z5%EP65Va65#2$yY%Q-zx$NSG{M!*X+a_ZGbyP?RRPl0VuK zrn=+F#K$Itc;qzzMGxL_E1)2%qU(4+#N>rXVS2-sNy&Byi>9lis_9*b&u7mar+8)8e_%quh6{AWw`a{5v+a3s!yl}e>SZ4S3XqW>Z zZ;w%}=rK;1Dq%bPnT@CHh*QH+6wkkTA%yoD6d;EX!58j`#QIe4NKv9x>5{Tb7LMjm zc9>Z#H}8y9;$#IMy3>^z zN6XIn1*7dL5~{#3A64#zR;{@2?j&Hy_PZlkYo5P5mbKyYb{o}pXqF^x1JkNtrM=2K zB!=+6cKfIuP!S;wCCYYZ2A;S_uXNPDG<%P0Xa=h5_H9ZRdqHtgsa(~anAC2lPokM`V?}Q72~xY`F^b=69qCzTdiF#~gpie9 z^(eO&ih_B~yf8jvuZ!9nPa*u$b4F=NW{El)dyWOTYX*oIN;W^Y*P`UAG~)wsgln~r z+DG=fp~%ErR(q;_@f0RKN<*qW;k_)aiF1|GxS#mbt%>NPzsj!-3+C6V{o%|M1ae;u za+5T?V`8B<@-Zb zJBl^y?m?LkU}mrV5rCPc`)$f-m1^FGk+gHar&zdI=w0(hJ-yfwLgJQ8& z>GDwK&q}%NK#b}@S+I0o3_D-|s(j%t*m_g3BWtI-^KTCLv+?}?fhNiX zm3RCxgtt5BrcOlDrZjUEcAdF%KtlhrVn=>qUO~P@fs>r?s`D4Y#Zu?mnanpFj8Uh6 zAV!#9G<*s3Zc$wcjWQ7OQ=dhK{;c16WY%b3_92Gks zErepIci)MD_6GVd&2p66Mau=CFwwI0n2lYBz14+yghYjk_DP5B{pDeAxG;Y?Y=aBa zaHJ_*nC*{1et^iI+fD{a?6*Rty^~oSzjax!tW@hXoNI~beHFiU#Kvg(n+fV_G>Rv< zy(7IO5U%^$HGKG+HbByuZ-xSru6;9{t>eevOkl6_pWjSU)@w^2JFsYEQT-0ufUcy0 z>L@9Jdn~7yc-2M}Vk?RzD|^dm+Jr}8@n~WstE!@?Kv2Dg;#9#tv}6ZF?S;3z+3Wo3 zTgmJV?r}7x(`Hl);q$b!wMX`VoF1Js#irka>i?O}zV@+IaIST?=fn9eD7Ny-qsi)a z(3$z=D}nszQE#?`e|R)b-6hK|l^Poa-fnI_78AV}6+$;UVWsALeF|e%qds)iZ1@zW z9&=Y~@MPpQ+d~Z!VxnE6eZ2ZuEZfh&IF_s)K($R+P0NE-Z!l)1qoht*9^_4qN2rHD z0FQiYqd|I1MEk>h+VNyy++D}xl;f&EMf~n@RXO1l3;Gj*a57p?m{=`udm@UR;`t|< z7~erZf*0#KOYDvc(cQaz&j~C1hZjynu+!N33CjCW3P7G|Cxg^8Xck*P|N2fv(j)qT z%BRJL@s%fi)w3Xo6AZ{}PlmA%`IVDac8)(dX#+ep)!LK`Dj&NpnD?*sV;A}8+Gynx zSPrJvYqfsLWtH!}8Oy(^^<^LNyS35k$LP$+XWR|sDW^QyC%o;cbmdc(-%vvN+*5w= z9IicOVqfqhr{dU`{KlzN_7(Si+rqB!w6`PFuhBS~X6$7~KR9a~JzB$k@Ir?C+A z2RtQ7M=0O_P6+#vpL-`-`AOw$fIolox60k$^;UldO%y)`E4b;q!Rjw~G72YKS{FyQ zqcTf)c*T_e>g>19$(E8=HEI<2GTWgkvzsbUAMS6EdqL3O;??iQ0C0Z(u2sDw`<&(% z?2!v|!s({C%PsGvvU@!Hy+n4OPkJv|{S9Q0X^Tz#!c85&^qyY*9VPJsESY$!!Bdy5 z1wj7b-lr3lzf_4(4Fg9PY4N4MdH(4Z%0DVxy8(RnX=CueXf3Qg;r`AkvzPXeqV*xa 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 JNh2i_&%ds&lnnp? diff --git a/submodules/TelegramUI/TelegramUI/TextLinkHandling.swift b/submodules/TelegramUI/TelegramUI/TextLinkHandling.swift index b938b39131..cf65db921c 100644 --- a/submodules/TelegramUI/TelegramUI/TextLinkHandling.swift +++ b/submodules/TelegramUI/TelegramUI/TextLinkHandling.swift @@ -22,9 +22,9 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate let openResolvedPeerImpl: (PeerId?, ChatControllerInteractionNavigateToPeer) -> Void = { [weak controller] peerId, navigation in context.sharedContext.openResolvedUrl(.peer(peerId, navigation), context: context, urlContext: .generic, navigationController: (controller?.navigationController as? NavigationController), openPeer: { (peerId, navigation) in switch navigation { - case let .chat(_, messageId): + case let .chat(_, subject): if let navigationController = controller?.navigationController as? NavigationController { - context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId), messageId: messageId, keepStack: .always)) + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId), subject: subject, keepStack: .always)) } case .info: let peerSignal: Signal @@ -54,7 +54,7 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate openResolvedPeerImpl(peerId, .default) case let .channelMessage(peerId, messageId): if let navigationController = controller.navigationController as? NavigationController { - context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId), messageId: messageId)) + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId), subject: .message(messageId))) } case let .stickerPack(name): controller.present(StickerPackPreviewController(context: context, stickerPack: .name(name), parentNavigationController: controller.navigationController as? NavigationController), in: .window(.root)) @@ -62,7 +62,7 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate (controller.navigationController as? NavigationController)?.pushViewController(InstantPageController(context: context, webPage: webpage, sourcePeerType: .group, anchor: anchor)) case let .join(link): controller.present(JoinLinkPreviewController(context: context, link: link, navigateToPeer: { peerId in - openResolvedPeerImpl(peerId, .chat(textInputState: nil, messageId: nil)) + openResolvedPeerImpl(peerId, .chat(textInputState: nil, subject: nil)) }), in: .window(.root)) default: break diff --git a/submodules/TelegramUI/TelegramUI/UrlHandling.swift b/submodules/TelegramUI/TelegramUI/UrlHandling.swift index 9e818703f8..21df4622ad 100644 --- a/submodules/TelegramUI/TelegramUI/UrlHandling.swift +++ b/submodules/TelegramUI/TelegramUI/UrlHandling.swift @@ -248,9 +248,9 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig } } else { if let peer = peer as? TelegramUser, peer.botInfo == nil { - return .peer(peer.id, .chat(textInputState: nil, messageId: nil)) + return .peer(peer.id, .chat(textInputState: nil, subject: nil)) } else { - return .peer(peer.id, .chat(textInputState: nil, messageId: nil)) + return .peer(peer.id, .chat(textInputState: nil, subject: nil)) } } } else { @@ -263,7 +263,7 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig } |> mapToSignal { peer -> Signal in if let peer = peer { - return .single(.peer(peer.id, .chat(textInputState: nil, messageId: nil))) + return .single(.peer(peer.id, .chat(textInputState: nil, subject: nil))) } else { return .single(.inaccessiblePeer) } @@ -274,12 +274,12 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig } |> mapToSignal { peer -> Signal in if let peer = peer { - return .single(.peer(peer.id, .chat(textInputState: nil, messageId: messageId))) + return .single(.peer(peer.id, .chat(textInputState: nil, subject: .message(messageId)))) } else { return findChannelById(postbox: account.postbox, network: account.network, channelId: messageId.peerId.id) |> map { foundPeer -> ResolvedUrl? in if let foundPeer = foundPeer { - return .peer(foundPeer.id, .chat(textInputState: nil, messageId: messageId)) + return .peer(foundPeer.id, .chat(textInputState: nil, subject: .message(messageId))) } else { return .inaccessiblePeer } From f731e91b1ad7ab9f886d8b4b8976be878d9ea6d2 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 21 Aug 2019 02:17:18 +0300 Subject: [PATCH 21/86] Theme accent colors improvements --- .../DefaultDarkPresentationTheme.swift | 9 +- .../DefaultDarkTintedPresentationTheme.swift | 4 + .../Sources/DefaultDayPresentationTheme.swift | 21 +- .../Sources/PresentationStrings.swift | 5780 +++++++++-------- .../Sources/PresentationThemeCodable.swift | 28 +- .../PresentationThemeEssentialGraphics.swift | 14 +- .../Contents.json | 4 +- .../ScheduleInput@2x (2).png | Bin 0 -> 1838 bytes .../ScheduleInput@2x.png | Bin 1767 -> 0 bytes .../ScheduleInput@3x (2).png | Bin 0 -> 2928 bytes .../ScheduleInput@3x.png | Bin 2664 -> 0 bytes .../ChatMessageDateAndStatusNode.swift | 1 + .../TelegramUI/ChatMessageReplyInfoNode.swift | 3 + .../ChatMessageTextBubbleContentNode.swift | 1 + .../ThemeAccentColorControllerNode.swift | 10 +- .../TelegramUI/WallpaperColorPanelNode.swift | 26 +- 16 files changed, 2966 insertions(+), 2935 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@2x (2).png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@3x (2).png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@3x.png diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index 1ebfbebb4e..2bac77cd0c 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -18,6 +18,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta let outgoingLinkTextColor: UIColor let outgoingCheckColor: UIColor + var accentColor = accentColor + if accentColor.rgb == UIColor.white.rgb { badgeFillColor = .white badgeTextColor = .black @@ -35,8 +37,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta outgoingBubbleFillColor = accentColor outgoingBubbleHighlightedFillColor = accentColor.withMultipliedBrightnessBy(1.421) - - if accentColor.lightness > 0.72 { + let lightness = accentColor.lightness + if lightness > 0.7 { outgoingScamColor = .black outgoingPrimaryTextColor = .black @@ -50,6 +52,9 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta outgoingSecondaryTextColor = UIColor(rgb: 0xffffff, alpha: 0.5) outgoingLinkTextColor = .white outgoingCheckColor = UIColor(rgb: 0xffffff, alpha: 0.5) + + let hsv = accentColor.hsv + accentColor = UIColor(hue: hsv.0, saturation: hsv.1, brightness: max(hsv.2, 0.55), alpha: 1.0) } } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index 15ffb834df..6467297f85 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -7,6 +7,10 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta let constructiveColor: UIColor = UIColor(rgb: 0x08a723) let secretColor: UIColor = UIColor(rgb: 0x89df9e) + var accentColor = accentColor + let hsv = accentColor.hsv + accentColor = UIColor(hue: hsv.0, saturation: hsv.1, brightness: max(hsv.2, 0.18), alpha: 1.0) + let mainBackgroundColor = accentColor.withMultiplied(hue: 1.024, saturation: 0.585, brightness: 0.25) let mainSelectionColor = accentColor.withMultiplied(hue: 1.03, saturation: 0.585, brightness: 0.12) let additionalBackgroundColor = accentColor.withMultiplied(hue: 1.024, saturation: 0.573, brightness: 0.18) diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 12b1027df6..9085ebd739 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -8,20 +8,31 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let constructiveColor: UIColor = UIColor(rgb: 0x00c900) let secretColor: UIColor = UIColor(rgb: 0x00b12c) + var accentColor = accentColor + let outgoingPrimaryTextColor: UIColor let outgoingSecondaryTextColor: UIColor let outgoingLinkTextColor: UIColor let outgoingCheckColor: UIColor - if accentColor.lightness > 0.72 { + let outgoingControlColor: UIColor + let outgoingBubbleFillColor: UIColor + if accentColor.lightness > 0.7 { outgoingPrimaryTextColor = .black - outgoingSecondaryTextColor = UIColor(rgb: 0x000000, alpha: 0.6) + outgoingSecondaryTextColor = UIColor(rgb: 0x000000, alpha: 0.65) outgoingLinkTextColor = .black outgoingCheckColor = .black + outgoingControlColor = outgoingPrimaryTextColor + outgoingBubbleFillColor = accentColor + + let hsv = accentColor.hsv + accentColor = UIColor(hue: hsv.0, saturation: hsv.1 * 1.1, brightness: min(hsv.2, 0.77), alpha: 1.0) } else { outgoingPrimaryTextColor = .white - outgoingSecondaryTextColor = UIColor(rgb: 0xffffff, alpha: 0.6) + outgoingSecondaryTextColor = UIColor(rgb: 0xffffff, alpha: 0.65) outgoingLinkTextColor = .white outgoingCheckColor = .white + outgoingControlColor = outgoingPrimaryTextColor + outgoingBubbleFillColor = accentColor } let rootTabBar = PresentationThemeRootTabBar( @@ -173,7 +184,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let message = PresentationThemeChatMessage( incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x007ee5), accentControlColor: UIColor(rgb: 0x007ee5), mediaActiveControlColor: UIColor(rgb: 0x007ee5), mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xe8ecf0), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: UIColor(rgb: 0x007ee5), highlight: UIColor(rgb: 0x007ee5).withAlphaComponent(0.08), separator: UIColor(rgb: 0xc8c7cc), bar: UIColor(rgb: 0x007ee5)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white)), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE1FFC7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE1FFC7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x008c09, alpha: 0.8), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x00a700), accentControlColor: UIColor(rgb: 0x3fc33b), mediaActiveControlColor: UIColor(rgb: 0x3fc33b), mediaInactiveControlColor: UIColor(rgb: 0x93d987), pendingActivityColor: UIColor(rgb: 0x42b649), fileTitleColor: UIColor(rgb: 0x3faa3c), fileDescriptionColor: UIColor(rgb: 0x6fb26a), fileDurationColor: UIColor(rgb: 0x008c09, alpha: 0.8), mediaPlaceholderColor: UIColor(rgb: 0xd2f2b6), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x93d987), radioProgress: UIColor(rgb: 0x3fc33b), highlight: UIColor(rgb: 0x3fc33b).withAlphaComponent(0.08), separator: UIColor(rgb: 0x93d987), bar: UIColor(rgb: 0x3fc33b)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white)), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE1FFC7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xe1ffc7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x008c09, alpha: 0.8), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x00a700), accentControlColor: UIColor(rgb: 0x3fc33b), mediaActiveControlColor: UIColor(rgb: 0x3fc33b), mediaInactiveControlColor: UIColor(rgb: 0x93d987), pendingActivityColor: UIColor(rgb: 0x42b649), fileTitleColor: UIColor(rgb: 0x3faa3c), fileDescriptionColor: UIColor(rgb: 0x6fb26a), fileDurationColor: UIColor(rgb: 0x008c09, alpha: 0.8), mediaPlaceholderColor: UIColor(rgb: 0xd2f2b6), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x93d987), radioProgress: UIColor(rgb: 0x3fc33b), highlight: UIColor(rgb: 0x3fc33b).withAlphaComponent(0.08), separator: UIColor(rgb: 0x93d987), bar: UIColor(rgb: 0x3fc33b)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white)), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), @@ -191,7 +202,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let messageDay = PresentationThemeChatMessage( incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2)), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2))), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: accentColor, highlightedFill: accentColor.withMultipliedBrightnessBy(0.7), stroke: accentColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: accentColor, highlightedFill: accentColor.withMultipliedBrightnessBy(0.7), stroke: accentColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: .white, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: .white, accentControlColor: .white, mediaActiveControlColor: .white, mediaInactiveControlColor: UIColor(rgb: 0xffffff, alpha: 0.6), pendingActivityColor: UIColor(rgb: 0xffffff, alpha: 0.7), fileTitleColor: UIColor(rgb: 0xffffff), fileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.7), fileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.7), mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xffffff, alpha: 0.6), radioProgress: .white, highlight: UIColor.white.withAlphaComponent(0.12), separator: UIColor(rgb: 0xffffff, alpha: 0.6), bar: .white), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2)), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2))), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2)), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2))), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xDADADE), stroke: UIColor(rgb: 0xE5E5EA)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xE5E5EA))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 4cd235bf6e..d9d5fb6da7 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -1098,3585 +1098,3589 @@ public final class PresentationStrings { } public var VoiceOver_Chat_OpenLinkHint: String { return self._s[845]! } public var VoiceOver_Chat_Reply: String { return self._s[846]! } - public var Channel_Info_Description: String { return self._s[847]! } - public var Stickers_FavoriteStickers: String { return self._s[848]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[849]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[850]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[851]! } - public var Group_PublicLink_Placeholder: String { return self._s[852]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[853]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[847]! } + public var Channel_Info_Description: String { return self._s[848]! } + public var Stickers_FavoriteStickers: String { return self._s[849]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[850]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[851]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[852]! } + public var Group_PublicLink_Placeholder: String { return self._s[853]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[854]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[854]!, self._r[854]!, [_1]) + return formatWithArgumentRanges(self._s[855]!, self._r[855]!, [_1]) } - public var TextFormat_Underline: String { return self._s[855]! } + public var TextFormat_Underline: String { return self._s[856]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[856]!, self._r[856]!, [_1, _2]) + return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_0]) + return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[858]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[859]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[859]!, self._r[859]!, [_1, _2]) + return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[860]! } - public var Passport_Language_uk: String { return self._s[861]! } - public var StickerPack_HideStickers: String { return self._s[863]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[864]! } + public var GroupPermission_Delete: String { return self._s[861]! } + public var Passport_Language_uk: String { return self._s[862]! } + public var StickerPack_HideStickers: String { return self._s[864]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[865]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[865]!, self._r[865]!, [_1, _2]) + return formatWithArgumentRanges(self._s[866]!, self._r[866]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[866]! } + public var Activity_UploadingVideoMessage: String { return self._s[867]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[867]!, self._r[867]!, [_0]) + return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[868]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[869]! } - public var Settings_CallSettings: String { return self._s[870]! } - public var Camera_SquareMode: String { return self._s[871]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[872]! } - public var GroupInfo_SharedMediaNone: String { return self._s[873]! } + public var Channel_TitleInfo: String { return self._s[869]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[870]! } + public var Settings_CallSettings: String { return self._s[871]! } + public var Camera_SquareMode: String { return self._s[872]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[873]! } + public var GroupInfo_SharedMediaNone: String { return self._s[874]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[874]!, self._r[874]!, [_1]) + return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[875]! } - public var Application_Update: String { return self._s[877]! } - public var Month_ShortJanuary: String { return self._s[878]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[879]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[880]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[881]! } - public var Passport_Address_Street2Placeholder: String { return self._s[882]! } + public var Bot_GenericBotStatus: String { return self._s[876]! } + public var Application_Update: String { return self._s[878]! } + public var Month_ShortJanuary: String { return self._s[879]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[880]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[881]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[882]! } + public var Passport_Address_Street2Placeholder: String { return self._s[883]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[883]!, self._r[883]!, [_0]) + return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[884]! } - public var Appearance_PreviewOutgoingText: String { return self._s[885]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[886]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[888]! } - public var Map_Directions: String { return self._s[889]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[891]! } - public var Appearance_ThemeDay: String { return self._s[892]! } - public var LogoutOptions_LogOut: String { return self._s[893]! } - public var Group_PublicLink_Title: String { return self._s[895]! } - public var Channel_AddBotErrorNoRights: String { return self._s[896]! } - public var Passport_Identity_AddPassport: String { return self._s[897]! } - public var LocalGroup_ButtonTitle: String { return self._s[898]! } - public var Call_Message: String { return self._s[899]! } - public var PhotoEditor_ExposureTool: String { return self._s[900]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[902]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[904]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[905]! } - public var Appearance_Preview: String { return self._s[906]! } - public var Compose_ChannelMembers: String { return self._s[907]! } - public var Conversation_DeleteManyMessages: String { return self._s[908]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[909]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[910]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[911]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[914]! } - public var Conversation_UpdateTelegram: String { return self._s[915]! } + public var NetworkUsageSettings_Cellular: String { return self._s[885]! } + public var Appearance_PreviewOutgoingText: String { return self._s[886]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[887]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[889]! } + public var Map_Directions: String { return self._s[890]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[892]! } + public var Appearance_ThemeDay: String { return self._s[893]! } + public var LogoutOptions_LogOut: String { return self._s[894]! } + public var Group_PublicLink_Title: String { return self._s[896]! } + public var Channel_AddBotErrorNoRights: String { return self._s[897]! } + public var Passport_Identity_AddPassport: String { return self._s[898]! } + public var LocalGroup_ButtonTitle: String { return self._s[899]! } + public var Call_Message: String { return self._s[900]! } + public var PhotoEditor_ExposureTool: String { return self._s[901]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[903]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[905]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[906]! } + public var Appearance_Preview: String { return self._s[907]! } + public var Compose_ChannelMembers: String { return self._s[908]! } + public var Conversation_DeleteManyMessages: String { return self._s[909]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[910]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[911]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[912]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[915]! } + public var Conversation_UpdateTelegram: String { return self._s[916]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[916]!, self._r[916]!, [_0]) + return formatWithArgumentRanges(self._s[917]!, self._r[917]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[917]!, self._r[917]!, [_1]) + return formatWithArgumentRanges(self._s[918]!, self._r[918]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[918]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[919]! } + public var GroupInfo_Administrators_Title: String { return self._s[919]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[920]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_0]) + return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_0]) } - public var Tour_Title3: String { return self._s[921]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[922]! } - public var Clipboard_SendPhoto: String { return self._s[926]! } - public var MediaPicker_Videos: String { return self._s[927]! } - public var Passport_Email_Title: String { return self._s[928]! } + public var Tour_Title3: String { return self._s[922]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[923]! } + public var Clipboard_SendPhoto: String { return self._s[927]! } + public var MediaPicker_Videos: String { return self._s[928]! } + public var Passport_Email_Title: String { return self._s[929]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[929]!, self._r[929]!, [_0]) + return formatWithArgumentRanges(self._s[930]!, self._r[930]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[930]! } - public var Conversation_MessageDialogDelete: String { return self._s[931]! } - public var Privacy_Calls_CustomHelp: String { return self._s[933]! } - public var Message_Wallpaper: String { return self._s[934]! } - public var MemberSearch_BotSection: String { return self._s[935]! } - public var GroupInfo_SetSound: String { return self._s[936]! } - public var Core_ServiceUserStatus: String { return self._s[937]! } - public var LiveLocationUpdated_JustNow: String { return self._s[938]! } - public var Call_StatusFailed: String { return self._s[939]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[940]! } - public var TwoStepAuth_SetPassword: String { return self._s[941]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[942]! } + public var StickerPacksSettings_Title: String { return self._s[931]! } + public var Conversation_MessageDialogDelete: String { return self._s[932]! } + public var Privacy_Calls_CustomHelp: String { return self._s[934]! } + public var Message_Wallpaper: String { return self._s[935]! } + public var MemberSearch_BotSection: String { return self._s[936]! } + public var GroupInfo_SetSound: String { return self._s[937]! } + public var Core_ServiceUserStatus: String { return self._s[938]! } + public var LiveLocationUpdated_JustNow: String { return self._s[939]! } + public var Call_StatusFailed: String { return self._s[940]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[941]! } + public var TwoStepAuth_SetPassword: String { return self._s[942]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[943]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[944]!, self._r[944]!, [_0]) + return formatWithArgumentRanges(self._s[945]!, self._r[945]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[945]! } - public var Profile_Username: String { return self._s[946]! } - public var Bot_DescriptionTitle: String { return self._s[947]! } - public var MaskStickerSettings_Title: String { return self._s[948]! } - public var SharedMedia_CategoryOther: String { return self._s[949]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[950]! } - public var Common_NotNow: String { return self._s[951]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[952]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[953]! } - public var Map_Location: String { return self._s[954]! } - public var Invitation_JoinGroup: String { return self._s[955]! } - public var AutoDownloadSettings_Title: String { return self._s[957]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[958]! } - public var Channel_ErrorAddBlocked: String { return self._s[959]! } - public var Conversation_UnblockUser: String { return self._s[960]! } - public var Watch_Bot_Restart: String { return self._s[961]! } - public var TwoStepAuth_Title: String { return self._s[962]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[963]! } - public var Checkout_ShippingMethod: String { return self._s[964]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[965]! } + public var Calls_SubmitRating: String { return self._s[946]! } + public var Profile_Username: String { return self._s[947]! } + public var Bot_DescriptionTitle: String { return self._s[948]! } + public var MaskStickerSettings_Title: String { return self._s[949]! } + public var SharedMedia_CategoryOther: String { return self._s[950]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[951]! } + public var Common_NotNow: String { return self._s[952]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[953]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[954]! } + public var Map_Location: String { return self._s[955]! } + public var Invitation_JoinGroup: String { return self._s[956]! } + public var AutoDownloadSettings_Title: String { return self._s[958]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[959]! } + public var Channel_ErrorAddBlocked: String { return self._s[960]! } + public var Conversation_UnblockUser: String { return self._s[961]! } + public var Watch_Bot_Restart: String { return self._s[962]! } + public var TwoStepAuth_Title: String { return self._s[963]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[964]! } + public var Checkout_ShippingMethod: String { return self._s[965]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[966]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[966]!, self._r[966]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[967]!, self._r[967]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[968]!, self._r[968]!, [_0]) - } - public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[970]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[971]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[972]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[973]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[974]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[975]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[976]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[977]! } - public var Checkout_PaymentMethod_Title: String { return self._s[978]! } - public var SocksProxySetup_Connection: String { return self._s[979]! } - public var Group_MessagePhotoRemoved: String { return self._s[980]! } - public var Channel_Stickers_NotFound: String { return self._s[982]! } - public var Group_About_Help: String { return self._s[983]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[984]! } - public var PeopleNearby_Title: String { return self._s[986]! } - public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[987]!, self._r[987]!, [_1]) + public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[970]!, self._r[970]!, [_0]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[989]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[990]! } - public var SocksProxySetup_Password: String { return self._s[991]! } - public var Notifications_PermissionsEnable: String { return self._s[992]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[994]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[971]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[972]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[973]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[974]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[975]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[976]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[977]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[978]! } + public var Checkout_PaymentMethod_Title: String { return self._s[979]! } + public var SocksProxySetup_Connection: String { return self._s[980]! } + public var Group_MessagePhotoRemoved: String { return self._s[981]! } + public var Channel_Stickers_NotFound: String { return self._s[983]! } + public var Group_About_Help: String { return self._s[984]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[985]! } + public var PeopleNearby_Title: String { return self._s[987]! } + public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[988]!, self._r[988]!, [_1]) + } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[990]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[991]! } + public var SocksProxySetup_Password: String { return self._s[992]! } + public var Notifications_PermissionsEnable: String { return self._s[993]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[995]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[995]!, self._r[995]!, [_1]) + return formatWithArgumentRanges(self._s[996]!, self._r[996]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[997]!, self._r[997]!, [_0]) + return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[998]! } - public var ArchivedPacksAlert_Title: String { return self._s[999]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[999]! } + public var ArchivedPacksAlert_Title: String { return self._s[1000]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1000]!, self._r[1000]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1001]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1003]! } - public var Conversation_StatusTyping: String { return self._s[1004]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1005]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1006]! } - public var UserInfo_CreateNewContact: String { return self._s[1007]! } - public var Passport_Identity_FrontSide: String { return self._s[1008]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1009]! } - public var Calls_CallTabTitle: String { return self._s[1010]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1011]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1002]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1004]! } + public var Conversation_StatusTyping: String { return self._s[1005]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1006]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1007]! } + public var UserInfo_CreateNewContact: String { return self._s[1008]! } + public var Passport_Identity_FrontSide: String { return self._s[1009]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1010]! } + public var Calls_CallTabTitle: String { return self._s[1011]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1012]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1013]!, self._r[1013]!, [_0]) + return formatWithArgumentRanges(self._s[1014]!, self._r[1014]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1014]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1015]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1016]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1017]! } - public var Paint_Stickers: String { return self._s[1018]! } - public var Privacy_GroupsAndChannels: String { return self._s[1019]! } - public var UserInfo_AddContact: String { return self._s[1021]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1015]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1016]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1017]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1018]! } + public var Paint_Stickers: String { return self._s[1019]! } + public var Privacy_GroupsAndChannels: String { return self._s[1020]! } + public var UserInfo_AddContact: String { return self._s[1022]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1022]!, self._r[1022]!, [_0]) + return formatWithArgumentRanges(self._s[1023]!, self._r[1023]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1024]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1025]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_0]) + return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1027]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1028]! } - public var BlockedUsers_BlockUser: String { return self._s[1029]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1030]! } - public var MediaPicker_UngroupDescription: String { return self._s[1031]! } - public var Watch_NoConnection: String { return self._s[1032]! } - public var Month_GenSeptember: String { return self._s[1033]! } - public var Conversation_ViewGroup: String { return self._s[1034]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1037]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1038]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1039]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1040]! } - public var MediaPicker_CameraRoll: String { return self._s[1042]! } - public var Month_GenAugust: String { return self._s[1043]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1044]! } - public var SharedMedia_EmptyText: String { return self._s[1045]! } - public var Map_ShareLiveLocation: String { return self._s[1046]! } - public var Calls_All: String { return self._s[1047]! } - public var Appearance_ThemeNight: String { return self._s[1050]! } - public var Conversation_HoldForAudio: String { return self._s[1051]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1054]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1055]! } - public var SocksProxySetup_Secret: String { return self._s[1056]! } + public var DialogList_NoMessagesTitle: String { return self._s[1028]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1029]! } + public var BlockedUsers_BlockUser: String { return self._s[1030]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1031]! } + public var MediaPicker_UngroupDescription: String { return self._s[1032]! } + public var Watch_NoConnection: String { return self._s[1033]! } + public var Month_GenSeptember: String { return self._s[1034]! } + public var Conversation_ViewGroup: String { return self._s[1035]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1038]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1039]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1040]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1041]! } + public var MediaPicker_CameraRoll: String { return self._s[1043]! } + public var Month_GenAugust: String { return self._s[1044]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1045]! } + public var SharedMedia_EmptyText: String { return self._s[1046]! } + public var Map_ShareLiveLocation: String { return self._s[1047]! } + public var Calls_All: String { return self._s[1048]! } + public var Appearance_ThemeNight: String { return self._s[1051]! } + public var Conversation_HoldForAudio: String { return self._s[1052]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1055]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1056]! } + public var SocksProxySetup_Secret: String { return self._s[1057]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1057]!, self._r[1057]!, [_0]) + return formatWithArgumentRanges(self._s[1058]!, self._r[1058]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1059]! } - public var Conversation_Location: String { return self._s[1060]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1060]! } + public var Conversation_Location: String { return self._s[1061]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1063]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1064]! } - public var Notifications_PermissionsText: String { return self._s[1065]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1066]! } - public var Call_Flip: String { return self._s[1067]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1069]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1071]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1073]! } - public var Channel_TooMuchBots: String { return self._s[1075]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1076]! } - public var Login_InvalidCodeError: String { return self._s[1077]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1078]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1064]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1065]! } + public var Notifications_PermissionsText: String { return self._s[1066]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1067]! } + public var Call_Flip: String { return self._s[1068]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1070]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1072]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1074]! } + public var Channel_TooMuchBots: String { return self._s[1076]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1077]! } + public var Login_InvalidCodeError: String { return self._s[1078]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1079]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1079]!, self._r[1079]!, [_0]) - } - public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1080]!, self._r[1080]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1081]! } - public var Call_CallInProgressTitle: String { return self._s[1082]! } - public var Month_ShortSeptember: String { return self._s[1083]! } - public var Watch_ChannelInfo_Title: String { return self._s[1084]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1087]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1088]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1089]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1090]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1091]! } - public var PhotoEditor_CropReset: String { return self._s[1092]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1094]! } - public var Channel_Management_LabelEditor: String { return self._s[1095]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1097]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1098]! } - public var UserInfo_Title: String { return self._s[1099]! } - public var ChatList_HideAction: String { return self._s[1100]! } - public var AccessDenied_Title: String { return self._s[1101]! } - public var DialogList_SearchLabel: String { return self._s[1102]! } - public var Group_Setup_HistoryHidden: String { return self._s[1103]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1104]! } - public var State_Updating: String { return self._s[1106]! } - public var Contacts_TabTitle: String { return self._s[1107]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1109]! } - public var GroupInfo_GroupHistory: String { return self._s[1110]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1111]! } - public var Wallpaper_SetColor: String { return self._s[1112]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1113]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1114]! } - public var Chat_AttachmentLimitReached: String { return self._s[1115]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1116]! } - public var Contacts_NotRegisteredSection: String { return self._s[1117]! } + public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1081]!, self._r[1081]!, [_0]) + } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1082]! } + public var Call_CallInProgressTitle: String { return self._s[1083]! } + public var Month_ShortSeptember: String { return self._s[1084]! } + public var Watch_ChannelInfo_Title: String { return self._s[1085]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1088]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1089]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1090]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1091]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1092]! } + public var PhotoEditor_CropReset: String { return self._s[1093]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1095]! } + public var Channel_Management_LabelEditor: String { return self._s[1096]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1098]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1099]! } + public var UserInfo_Title: String { return self._s[1100]! } + public var ChatList_HideAction: String { return self._s[1101]! } + public var AccessDenied_Title: String { return self._s[1102]! } + public var DialogList_SearchLabel: String { return self._s[1103]! } + public var Group_Setup_HistoryHidden: String { return self._s[1104]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1105]! } + public var State_Updating: String { return self._s[1107]! } + public var Contacts_TabTitle: String { return self._s[1108]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1110]! } + public var GroupInfo_GroupHistory: String { return self._s[1111]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1112]! } + public var Wallpaper_SetColor: String { return self._s[1113]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1114]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1115]! } + public var Chat_AttachmentLimitReached: String { return self._s[1116]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1117]! } + public var Contacts_NotRegisteredSection: String { return self._s[1118]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1118]!, self._r[1118]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1119]!, self._r[1119]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1119]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1120]! } - public var SocksProxySetup_Connecting: String { return self._s[1121]! } - public var ExplicitContent_AlertChannel: String { return self._s[1122]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1123]! } - public var Conversation_Contact: String { return self._s[1124]! } - public var Login_CodeExpired: String { return self._s[1125]! } - public var Passport_DiscardMessageAction: String { return self._s[1126]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1127]! } + public var Paint_Clear: String { return self._s[1120]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1121]! } + public var SocksProxySetup_Connecting: String { return self._s[1122]! } + public var ExplicitContent_AlertChannel: String { return self._s[1123]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1124]! } + public var Conversation_Contact: String { return self._s[1125]! } + public var Login_CodeExpired: String { return self._s[1126]! } + public var Passport_DiscardMessageAction: String { return self._s[1127]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1128]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1128]!, self._r[1128]!, [_0]) + return formatWithArgumentRanges(self._s[1129]!, self._r[1129]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1129]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1130]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1130]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1131]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_0]) + return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_0]) } - public var Month_ShortApril: String { return self._s[1132]! } - public var AuthSessions_CurrentSession: String { return self._s[1133]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1136]! } - public var WallpaperPreview_CropTopText: String { return self._s[1138]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1139]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1140]! } + public var Month_ShortApril: String { return self._s[1133]! } + public var AuthSessions_CurrentSession: String { return self._s[1134]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1137]! } + public var WallpaperPreview_CropTopText: String { return self._s[1139]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1140]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1141]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1141]!, self._r[1141]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1142]!, self._r[1142]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1142]! } - public var Channel_Setup_TypePrivate: String { return self._s[1144]! } - public var Forward_ChannelReadOnly: String { return self._s[1147]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1148]! } - public var AddContact_SharedContactException: String { return self._s[1149]! } - public var UserInfo_BotPrivacy: String { return self._s[1151]! } - public var Notification_PassportValueEmail: String { return self._s[1152]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1153]! } - public var GroupPermission_NewTitle: String { return self._s[1154]! } - public var CallFeedback_ReasonDropped: String { return self._s[1155]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1156]! } - public var Channel_SignMessages_Help: String { return self._s[1158]! } - public var Undo_ChatDeleted: String { return self._s[1160]! } - public var Conversation_ChatBackground: String { return self._s[1161]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1162]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1163]! } - public var Passport_Language_pt: String { return self._s[1164]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1165]! } - public var NotificationsSound_Popcorn: String { return self._s[1168]! } - public var AutoNightTheme_Disabled: String { return self._s[1169]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1170]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1171]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1172]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1173]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1143]! } + public var Channel_Setup_TypePrivate: String { return self._s[1145]! } + public var Forward_ChannelReadOnly: String { return self._s[1148]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1149]! } + public var AddContact_SharedContactException: String { return self._s[1150]! } + public var UserInfo_BotPrivacy: String { return self._s[1152]! } + public var Notification_PassportValueEmail: String { return self._s[1153]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1154]! } + public var GroupPermission_NewTitle: String { return self._s[1155]! } + public var CallFeedback_ReasonDropped: String { return self._s[1156]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1157]! } + public var Channel_SignMessages_Help: String { return self._s[1159]! } + public var Undo_ChatDeleted: String { return self._s[1161]! } + public var Conversation_ChatBackground: String { return self._s[1162]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1163]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1164]! } + public var Passport_Language_pt: String { return self._s[1165]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1166]! } + public var NotificationsSound_Popcorn: String { return self._s[1169]! } + public var AutoNightTheme_Disabled: String { return self._s[1170]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1171]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1172]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1173]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1174]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1174]!, self._r[1174]!, [_0]) + return formatWithArgumentRanges(self._s[1175]!, self._r[1175]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1175]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1176]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1178]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1176]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1177]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1179]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1179]!, self._r[1179]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1180]!, self._r[1180]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1182]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1183]! } - public var Compose_NewEncryptedChat: String { return self._s[1184]! } - public var Login_CodeFloodError: String { return self._s[1185]! } - public var Calls_TabTitle: String { return self._s[1186]! } - public var Privacy_ProfilePhoto: String { return self._s[1187]! } - public var Passport_Language_he: String { return self._s[1188]! } + public var SocksProxySetup_Hostname: String { return self._s[1183]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1184]! } + public var Compose_NewEncryptedChat: String { return self._s[1185]! } + public var Login_CodeFloodError: String { return self._s[1186]! } + public var Calls_TabTitle: String { return self._s[1187]! } + public var Privacy_ProfilePhoto: String { return self._s[1188]! } + public var Passport_Language_he: String { return self._s[1189]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1189]!, self._r[1189]!, [_0]) + return formatWithArgumentRanges(self._s[1190]!, self._r[1190]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1190]! } + public var GroupPermission_Title: String { return self._s[1191]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1191]!, self._r[1191]!, [_0]) + return formatWithArgumentRanges(self._s[1192]!, self._r[1192]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1192]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1193]! } - public var Tour_Text1: String { return self._s[1194]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1195]! } - public var Month_ShortFebruary: String { return self._s[1196]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1197]! } - public var NotificationsSound_Glass: String { return self._s[1198]! } - public var Appearance_ThemeNightBlue: String { return self._s[1199]! } - public var CheckoutInfo_Pay: String { return self._s[1200]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1202]! } - public var Call_CallAgain: String { return self._s[1204]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1205]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1206]! } - public var Passport_InvalidPasswordError: String { return self._s[1207]! } - public var Watch_Message_Game: String { return self._s[1208]! } - public var Stickers_Install: String { return self._s[1209]! } - public var VoiceOver_Chat_Message: String { return self._s[1210]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1211]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1213]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1214]! } - public var AuthSessions_OtherSessions: String { return self._s[1215]! } - public var Channel_Username_Help: String { return self._s[1216]! } - public var Camera_Title: String { return self._s[1217]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1219]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1220]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1221]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1222]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1223]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1224]! } - public var Conversation_RestrictedStickers: String { return self._s[1225]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1227]! } - public var UserInfo_TelegramCall: String { return self._s[1229]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1230]! } - public var CreatePoll_OptionsHeader: String { return self._s[1231]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1232]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1233]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1234]! } - public var Appearance_ThemePreview_Chat_1_ReplyName: String { return self._s[1235]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1236]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1193]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1194]! } + public var Tour_Text1: String { return self._s[1195]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1196]! } + public var Month_ShortFebruary: String { return self._s[1197]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1198]! } + public var NotificationsSound_Glass: String { return self._s[1199]! } + public var Appearance_ThemeNightBlue: String { return self._s[1200]! } + public var CheckoutInfo_Pay: String { return self._s[1201]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1203]! } + public var Call_CallAgain: String { return self._s[1205]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1206]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1207]! } + public var Passport_InvalidPasswordError: String { return self._s[1208]! } + public var Watch_Message_Game: String { return self._s[1209]! } + public var Stickers_Install: String { return self._s[1210]! } + public var VoiceOver_Chat_Message: String { return self._s[1211]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1212]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1214]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1215]! } + public var AuthSessions_OtherSessions: String { return self._s[1216]! } + public var Channel_Username_Help: String { return self._s[1217]! } + public var Camera_Title: String { return self._s[1218]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1220]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1221]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1222]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1223]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1224]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1225]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1226]! } + public var Conversation_RestrictedStickers: String { return self._s[1227]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1229]! } + public var UserInfo_TelegramCall: String { return self._s[1231]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1232]! } + public var CreatePoll_OptionsHeader: String { return self._s[1233]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1234]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1235]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1236]! } + public var Appearance_ThemePreview_Chat_1_ReplyName: String { return self._s[1237]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1238]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1237]!, self._r[1237]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1239]!, self._r[1239]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1238]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1239]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1240]! } - public var Conversation_MessageDialogRetry: String { return self._s[1241]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1242]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1243]! } - public var Group_Setup_TypeHeader: String { return self._s[1244]! } - public var Paint_RecentStickers: String { return self._s[1245]! } - public var PhotoEditor_GrainTool: String { return self._s[1246]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1247]! } - public var EmptyGroupInfo_Line4: String { return self._s[1248]! } - public var Watch_AuthRequired: String { return self._s[1250]! } + public var Settings_SaveEditedPhotos: String { return self._s[1240]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1241]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1242]! } + public var Conversation_MessageDialogRetry: String { return self._s[1243]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1244]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1245]! } + public var Group_Setup_TypeHeader: String { return self._s[1246]! } + public var Paint_RecentStickers: String { return self._s[1247]! } + public var PhotoEditor_GrainTool: String { return self._s[1248]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1249]! } + public var EmptyGroupInfo_Line4: String { return self._s[1250]! } + public var Watch_AuthRequired: String { return self._s[1252]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1251]!, self._r[1251]!, [_0]) + return formatWithArgumentRanges(self._s[1253]!, self._r[1253]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1252]! } - public var ChannelIntro_Text: String { return self._s[1253]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1254]! } - public var GroupPermission_NoSendMedia: String { return self._s[1255]! } - public var Calls_AddTab: String { return self._s[1256]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1257]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1258]! } - public var Notification_MessageLifetime1d: String { return self._s[1259]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1260]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1261]! } - public var Passport_Identity_GenderFemale: String { return self._s[1262]! } - public var BlockedUsers_BlockTitle: String { return self._s[1263]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1254]! } + public var ChannelIntro_Text: String { return self._s[1255]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1256]! } + public var GroupPermission_NoSendMedia: String { return self._s[1257]! } + public var Calls_AddTab: String { return self._s[1258]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1259]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1260]! } + public var Notification_MessageLifetime1d: String { return self._s[1261]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1262]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1263]! } + public var Passport_Identity_GenderFemale: String { return self._s[1264]! } + public var BlockedUsers_BlockTitle: String { return self._s[1265]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1264]!, self._r[1264]!, [_1]) + return formatWithArgumentRanges(self._s[1266]!, self._r[1266]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1265]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1266]! } - public var ChatList_ArchiveAction: String { return self._s[1267]! } - public var AutoNightTheme_Scheduled: String { return self._s[1268]! } + public var Weekday_Yesterday: String { return self._s[1267]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1268]! } + public var ChatList_ArchiveAction: String { return self._s[1269]! } + public var AutoNightTheme_Scheduled: String { return self._s[1270]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1269]!, self._r[1269]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1270]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1272]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1272]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1273]! } + public var CreatePoll_Create: String { return self._s[1274]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1275]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1276]!, self._r[1276]!, [_1, _2]) } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1275]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1277]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1277]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1278]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1280]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1278]!, self._r[1278]!, [_1]) + return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1279]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1280]! } + public var Preview_OpenInInstagram: String { return self._s[1282]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1283]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1284]!, self._r[1284]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1283]! } - public var ArchivedChats_IntroText3: String { return self._s[1284]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1285]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1286]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1287]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1286]! } + public var ArchivedChats_IntroText3: String { return self._s[1287]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1288]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1289]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1290]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1288]!, self._r[1288]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1291]!, self._r[1291]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1290]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1291]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1292]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1293]! } - public var Gif_NoGifsFound: String { return self._s[1294]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1295]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1296]! } - public var GroupInfo_ActionPromote: String { return self._s[1297]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1298]! } - public var GroupInfo_Permissions_Title: String { return self._s[1299]! } - public var Permissions_ContactsText_v0: String { return self._s[1300]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1301]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1304]! } - public var Passport_FieldEmailHelp: String { return self._s[1305]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1293]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1294]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1295]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1296]! } + public var Gif_NoGifsFound: String { return self._s[1297]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1298]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1299]! } + public var GroupInfo_ActionPromote: String { return self._s[1300]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1301]! } + public var GroupInfo_Permissions_Title: String { return self._s[1302]! } + public var Permissions_ContactsText_v0: String { return self._s[1303]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1304]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1307]! } + public var Passport_FieldEmailHelp: String { return self._s[1308]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1306]!, self._r[1306]!, [_0]) + return formatWithArgumentRanges(self._s[1309]!, self._r[1309]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1307]! } - public var Weekday_ShortSaturday: String { return self._s[1308]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1309]! } - public var Watch_Conversation_UserInfo: String { return self._s[1310]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1311]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1312]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1313]! } - public var PhotoEditor_VignetteTool: String { return self._s[1314]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1315]! } - public var Passport_Language_et: String { return self._s[1316]! } - public var AppUpgrade_Running: String { return self._s[1317]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1319]! } - public var Passport_Language_bg: String { return self._s[1320]! } - public var Stickers_NoStickersFound: String { return self._s[1322]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1310]! } + public var Weekday_ShortSaturday: String { return self._s[1311]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1312]! } + public var Watch_Conversation_UserInfo: String { return self._s[1313]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1314]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1315]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1316]! } + public var PhotoEditor_VignetteTool: String { return self._s[1317]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1318]! } + public var Passport_Language_et: String { return self._s[1319]! } + public var AppUpgrade_Running: String { return self._s[1320]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1322]! } + public var Passport_Language_bg: String { return self._s[1323]! } + public var Stickers_NoStickersFound: String { return self._s[1325]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1324]!, self._r[1324]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1325]!, self._r[1325]!, [_0]) + return formatWithArgumentRanges(self._s[1328]!, self._r[1328]!, [_0]) } - public var Settings_About: String { return self._s[1326]! } + public var Settings_About: String { return self._s[1329]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1329]! } - public var Group_ErrorAddBlocked: String { return self._s[1330]! } + public var KeyCommand_NewMessage: String { return self._s[1332]! } + public var Group_ErrorAddBlocked: String { return self._s[1333]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, [_0]) + return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1332]! } - public var ReportGroupLocation_Title: String { return self._s[1333]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1334]! } - public var Cache_ClearProgress: String { return self._s[1335]! } + public var Map_LocationTitle: String { return self._s[1335]! } + public var ReportGroupLocation_Title: String { return self._s[1336]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1337]! } + public var Cache_ClearProgress: String { return self._s[1338]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1336]!, self._r[1336]!, [_0]) + return formatWithArgumentRanges(self._s[1339]!, self._r[1339]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1337]! } - public var Passport_UpdateRequiredError: String { return self._s[1338]! } + public var GroupRemoved_AddToGroup: String { return self._s[1340]! } + public var Passport_UpdateRequiredError: String { return self._s[1341]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1339]!, self._r[1339]!, [_1]) + return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1341]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1342]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1343]! } - public var Passport_Language_ka: String { return self._s[1344]! } - public var Call_Decline: String { return self._s[1345]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1346]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1344]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1345]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1346]! } + public var Passport_Language_ka: String { return self._s[1347]! } + public var Call_Decline: String { return self._s[1348]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1349]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1349]!, self._r[1349]!, [_0]) + return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1350]! } + public var CallFeedback_Send: String { return self._s[1353]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1351]!, self._r[1351]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1352]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1354]! } - public var Passport_DeletePassport: String { return self._s[1355]! } - public var Appearance_AppIconFilled: String { return self._s[1356]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1357]! } - public var Month_ShortDecember: String { return self._s[1358]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1360]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1355]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1357]! } + public var Passport_DeletePassport: String { return self._s[1358]! } + public var Appearance_AppIconFilled: String { return self._s[1359]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1360]! } + public var Month_ShortDecember: String { return self._s[1361]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1363]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1361]!, self._r[1361]!, [_0]) + return formatWithArgumentRanges(self._s[1364]!, self._r[1364]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1362]! } - public var Conversation_EncryptedDescription1: String { return self._s[1363]! } - public var Conversation_EncryptedDescription2: String { return self._s[1364]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1365]! } - public var Conversation_EncryptedDescription3: String { return self._s[1366]! } - public var PhotoEditor_SharpenTool: String { return self._s[1367]! } + public var Channel_Stickers_Searching: String { return self._s[1365]! } + public var Conversation_EncryptedDescription1: String { return self._s[1366]! } + public var Conversation_EncryptedDescription2: String { return self._s[1367]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1368]! } + public var Conversation_EncryptedDescription3: String { return self._s[1369]! } + public var PhotoEditor_SharpenTool: String { return self._s[1370]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1368]!, self._r[1368]!, [_0]) + return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1370]! } - public var Channel_Members_AddMembers: String { return self._s[1371]! } - public var Wallpaper_Search: String { return self._s[1372]! } - public var Weekday_Friday: String { return self._s[1373]! } - public var Privacy_ContactsSync: String { return self._s[1374]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1375]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1376]! } + public var Conversation_EncryptedDescription4: String { return self._s[1373]! } + public var Channel_Members_AddMembers: String { return self._s[1374]! } + public var Wallpaper_Search: String { return self._s[1375]! } + public var Weekday_Friday: String { return self._s[1376]! } + public var Privacy_ContactsSync: String { return self._s[1377]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1378]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1379]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_0]) - } - public var GroupInfo_Permissions_Removed: String { return self._s[1378]! } - public var Passport_Identity_GenderMale: String { return self._s[1379]! } - public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1381]! } - public var Conversation_JumpToDate: String { return self._s[1382]! } - public var Contacts_GlobalSearch: String { return self._s[1383]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1384]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1385]! } - public var Profile_MessageLifetime1d: String { return self._s[1386]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1381]! } + public var Passport_Identity_GenderMale: String { return self._s[1382]! } + public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1383]!, self._r[1383]!, [_0]) + } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1384]! } + public var Conversation_JumpToDate: String { return self._s[1385]! } + public var Contacts_GlobalSearch: String { return self._s[1386]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1387]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1388]! } + public var Profile_MessageLifetime1d: String { return self._s[1389]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1387]!, self._r[1387]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1390]!, self._r[1390]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1390]! } + public var StickerPack_BuiltinPackName: String { return self._s[1393]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1391]!, self._r[1391]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1392]! } - public var Passport_InfoTitle: String { return self._s[1394]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1395]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1395]! } + public var Passport_InfoTitle: String { return self._s[1397]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1398]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_0]) + return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1400]!, self._r[1400]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1403]!, self._r[1403]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1401]! } - public var Profile_BotInfo: String { return self._s[1402]! } - public var Watch_Compose_CreateMessage: String { return self._s[1403]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1404]! } - public var Month_ShortNovember: String { return self._s[1405]! } - public var Conversation_ScamWarning: String { return self._s[1406]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1407]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1408]! } - public var NotificationsSound_Chime: String { return self._s[1409]! } - public var Passport_Language_ko: String { return self._s[1411]! } - public var InviteText_URL: String { return self._s[1412]! } - public var TextFormat_Monospace: String { return self._s[1413]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1404]! } + public var Profile_BotInfo: String { return self._s[1405]! } + public var Watch_Compose_CreateMessage: String { return self._s[1406]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1407]! } + public var Month_ShortNovember: String { return self._s[1408]! } + public var Conversation_ScamWarning: String { return self._s[1409]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1410]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1411]! } + public var NotificationsSound_Chime: String { return self._s[1412]! } + public var Passport_Language_ko: String { return self._s[1414]! } + public var InviteText_URL: String { return self._s[1415]! } + public var TextFormat_Monospace: String { return self._s[1416]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1414]!, self._r[1414]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1415]!, self._r[1415]!, [_0]) + return formatWithArgumentRanges(self._s[1418]!, self._r[1418]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1416]!, self._r[1416]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1418]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1419]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1420]! } - public var Your_card_has_expired: String { return self._s[1421]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1422]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1423]! } - public var Conversation_Report: String { return self._s[1427]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1428]! } - public var Notification_MessageLifetime1m: String { return self._s[1429]! } - public var Privacy_ContactsTitle: String { return self._s[1430]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1431]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1432]! } - public var Channel_Members_Title: String { return self._s[1433]! } - public var Map_OpenInWaze: String { return self._s[1434]! } - public var Login_PhoneBannedError: String { return self._s[1435]! } + public var Passport_InfoLearnMore: String { return self._s[1421]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1422]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1423]! } + public var Your_card_has_expired: String { return self._s[1424]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1425]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1426]! } + public var Conversation_Report: String { return self._s[1430]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1431]! } + public var Notification_MessageLifetime1m: String { return self._s[1432]! } + public var Privacy_ContactsTitle: String { return self._s[1433]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1434]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1435]! } + public var Channel_Members_Title: String { return self._s[1436]! } + public var Map_OpenInWaze: String { return self._s[1437]! } + public var Login_PhoneBannedError: String { return self._s[1438]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1436]!, self._r[1436]!, [_0]) + return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1437]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1438]! } - public var Common_OK: String { return self._s[1439]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1440]! } - public var Cache_Music: String { return self._s[1441]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1442]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1443]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1444]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1440]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1441]! } + public var Common_OK: String { return self._s[1442]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1443]! } + public var Cache_Music: String { return self._s[1444]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1445]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1446]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1447]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_1]) + return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1446]!, self._r[1446]!, [_0]) + return formatWithArgumentRanges(self._s[1449]!, self._r[1449]!, [_0]) } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_0]) + return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1449]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1450]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1452]! } - public var State_ConnectingToProxyInfo: String { return self._s[1453]! } - public var Message_VideoMessage: String { return self._s[1455]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1456]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1457]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1458]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1459]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1460]! } - public var Activity_RecordingAudio: String { return self._s[1461]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1462]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1463]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1452]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1453]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1455]! } + public var State_ConnectingToProxyInfo: String { return self._s[1456]! } + public var Message_VideoMessage: String { return self._s[1458]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1459]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1460]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1461]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1462]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1463]! } + public var Activity_RecordingAudio: String { return self._s[1464]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1465]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1466]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1465]!, self._r[1465]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1468]!, self._r[1468]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1469]!, self._r[1469]!, [_0]) + return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1470]! } - public var UserInfo_AddPhone: String { return self._s[1471]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1472]! } + public var Conversation_ApplyLocalization: String { return self._s[1473]! } + public var UserInfo_AddPhone: String { return self._s[1474]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1475]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_0]) + return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0]) } - public var Passport_Scans: String { return self._s[1475]! } - public var BlockedUsers_Unblock: String { return self._s[1476]! } + public var Passport_Scans: String { return self._s[1478]! } + public var BlockedUsers_Unblock: String { return self._s[1479]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1477]!, self._r[1477]!, [_1]) + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1478]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1479]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1480]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1481]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1482]! } + public var Channel_Management_LabelCreator: String { return self._s[1481]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1482]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1483]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1484]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1485]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1483]!, self._r[1483]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1486]!, self._r[1486]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1484]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1485]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1486]! } - public var ChannelIntro_CreateChannel: String { return self._s[1487]! } - public var Conversation_UnreadMessages: String { return self._s[1488]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1489]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1490]! } - public var Notification_GroupActivated: String { return self._s[1491]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1492]! } + public var Login_PhoneNumberHelp: String { return self._s[1487]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1488]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1489]! } + public var ChannelIntro_CreateChannel: String { return self._s[1490]! } + public var Conversation_UnreadMessages: String { return self._s[1491]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1492]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1493]! } + public var Notification_GroupActivated: String { return self._s[1494]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1495]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1493]!, self._r[1493]!, [_0]) + return formatWithArgumentRanges(self._s[1496]!, self._r[1496]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1494]!, self._r[1494]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1497]!, self._r[1497]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1496]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1499]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1497]!, self._r[1497]!, [_0]) - } - public var Undo_DeletedChannel: String { return self._s[1498]! } - public var CallFeedback_AddComment: String { return self._s[1499]! } - public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1501]! } + public var Undo_DeletedChannel: String { return self._s[1501]! } + public var CallFeedback_AddComment: String { return self._s[1502]! } + public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1503]!, self._r[1503]!, [_0]) + } + public var Document_TargetConfirmationFormat: String { return self._s[1504]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0]) + return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1503]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1506]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1507]!, self._r[1507]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1505]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1506]! } + public var Contacts_SortByName: String { return self._s[1508]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1509]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1509]! } - public var ScheduledMessages_EditTime: String { return self._s[1510]! } - public var Conversation_ClearSelfHistory: String { return self._s[1511]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1512]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1513]! } - public var Stickers_SuggestNone: String { return self._s[1514]! } - public var ChatSettings_Cache: String { return self._s[1515]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1516]! } - public var Media_ShareThisPhoto: String { return self._s[1517]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1518]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1519]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1520]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1521]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1522]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1523]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1524]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1526]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1527]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1528]! } - public var Map_OpenIn: String { return self._s[1529]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1512]! } + public var ScheduledMessages_EditTime: String { return self._s[1513]! } + public var Conversation_ClearSelfHistory: String { return self._s[1514]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1515]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1516]! } + public var Stickers_SuggestNone: String { return self._s[1517]! } + public var ChatSettings_Cache: String { return self._s[1518]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1519]! } + public var Media_ShareThisPhoto: String { return self._s[1520]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1521]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1522]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1523]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1524]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1525]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1526]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1527]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1529]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1530]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1531]! } + public var Map_OpenIn: String { return self._s[1532]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1532]!, self._r[1532]!, [_1]) + return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1533]!, self._r[1533]!, [_0]) + return formatWithArgumentRanges(self._s[1536]!, self._r[1536]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1534]! } - public var MessagePoll_LabelClosed: String { return self._s[1535]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1537]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1538]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1539]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1540]! } - public var Login_SelectCountry_Title: String { return self._s[1541]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1542]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1537]! } + public var MessagePoll_LabelClosed: String { return self._s[1538]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1540]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1541]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1542]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1543]! } + public var Login_SelectCountry_Title: String { return self._s[1544]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1545]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1543]!, self._r[1543]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1544]! } - public var Watch_Suggestion_BRB: String { return self._s[1545]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1546]! } - public var Contacts_PermissionsTitle: String { return self._s[1547]! } - public var Conversation_RestrictedInline: String { return self._s[1548]! } - public var StickerPack_ViewPack: String { return self._s[1550]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1547]! } + public var Watch_Suggestion_BRB: String { return self._s[1548]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1549]! } + public var Contacts_PermissionsTitle: String { return self._s[1550]! } + public var Conversation_RestrictedInline: String { return self._s[1551]! } + public var StickerPack_ViewPack: String { return self._s[1553]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_0]) + return formatWithArgumentRanges(self._s[1554]!, self._r[1554]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1553]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1556]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1558]! } - public var Channel_Info_Stickers: String { return self._s[1559]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1560]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1561]! } - public var Passport_DeletePersonalDetails: String { return self._s[1562]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1563]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1564]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1565]! } - public var Conversation_SearchNoResults: String { return self._s[1567]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1568]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1569]! } - public var Login_Code: String { return self._s[1570]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1571]! } - public var Weekday_ShortThursday: String { return self._s[1572]! } - public var Resolve_ErrorNotFound: String { return self._s[1574]! } - public var LastSeen_Offline: String { return self._s[1575]! } - public var PeopleNearby_NoMembers: String { return self._s[1576]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1577]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1578]! } - public var GroupInfo_Title: String { return self._s[1580]! } - public var NotificationsSound_Note: String { return self._s[1581]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1582]! } - public var Watch_Message_Poll: String { return self._s[1583]! } - public var Privacy_Calls: String { return self._s[1584]! } + public var Compose_NewChannel: String { return self._s[1556]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1559]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1561]! } + public var Channel_Info_Stickers: String { return self._s[1562]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1563]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1564]! } + public var Passport_DeletePersonalDetails: String { return self._s[1565]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1566]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1567]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1568]! } + public var Conversation_SearchNoResults: String { return self._s[1570]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1571]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1572]! } + public var Login_Code: String { return self._s[1573]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1574]! } + public var Weekday_ShortThursday: String { return self._s[1575]! } + public var Resolve_ErrorNotFound: String { return self._s[1577]! } + public var LastSeen_Offline: String { return self._s[1578]! } + public var PeopleNearby_NoMembers: String { return self._s[1579]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1580]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1581]! } + public var GroupInfo_Title: String { return self._s[1583]! } + public var NotificationsSound_Note: String { return self._s[1584]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1585]! } + public var Watch_Message_Poll: String { return self._s[1586]! } + public var Privacy_Calls: String { return self._s[1587]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1585]!, self._r[1585]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1588]!, self._r[1588]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1586]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1587]! } - public var Notifications_Reset: String { return self._s[1588]! } - public var Conversation_Pin: String { return self._s[1589]! } - public var Passport_Language_lv: String { return self._s[1590]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1591]! } - public var BlockedUsers_Info: String { return self._s[1592]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1594]! } - public var Watch_Conversation_Unblock: String { return self._s[1596]! } + public var Month_ShortAugust: String { return self._s[1589]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1590]! } + public var Notifications_Reset: String { return self._s[1591]! } + public var Conversation_Pin: String { return self._s[1592]! } + public var Passport_Language_lv: String { return self._s[1593]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1594]! } + public var BlockedUsers_Info: String { return self._s[1595]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1597]! } + public var Watch_Conversation_Unblock: String { return self._s[1599]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1597]!, self._r[1597]!, [_0]) - } - public var CloudStorage_Title: String { return self._s[1598]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1599]! } - public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1600]!, self._r[1600]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1601]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1602]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1603]! } - public var Passport_Address_EditBankStatement: String { return self._s[1604]! } - public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_1, _2]) + public var CloudStorage_Title: String { return self._s[1601]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1602]! } + public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_0]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1606]! } - public var ShareMenu_Comment: String { return self._s[1607]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1608]! } - public var Notifications_PermissionsTitle: String { return self._s[1609]! } - public var GroupPermission_NoSendLinks: String { return self._s[1610]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1611]! } - public var Settings_Support: String { return self._s[1612]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1613]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1614]! } - public var Privacy_Forwards_Preview: String { return self._s[1615]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1616]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1617]! } - public var Common_Select: String { return self._s[1619]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1620]! } - public var WallpaperSearch_ColorGray: String { return self._s[1622]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1623]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1624]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1625]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1626]! } - public var Widget_AuthRequired: String { return self._s[1627]! } - public var Camera_FlashOn: String { return self._s[1628]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1629]! } - public var Watch_Suggestion_OK: String { return self._s[1630]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1604]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1605]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1606]! } + public var Passport_Address_EditBankStatement: String { return self._s[1607]! } + public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_1, _2]) + } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1609]! } + public var ShareMenu_Comment: String { return self._s[1610]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1611]! } + public var Notifications_PermissionsTitle: String { return self._s[1612]! } + public var GroupPermission_NoSendLinks: String { return self._s[1613]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1614]! } + public var Settings_Support: String { return self._s[1615]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1616]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1617]! } + public var Privacy_Forwards_Preview: String { return self._s[1618]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1619]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1620]! } + public var Common_Select: String { return self._s[1622]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1623]! } + public var WallpaperSearch_ColorGray: String { return self._s[1625]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1626]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1627]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1628]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1629]! } + public var Widget_AuthRequired: String { return self._s[1630]! } + public var Camera_FlashOn: String { return self._s[1631]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1632]! } + public var Watch_Suggestion_OK: String { return self._s[1633]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_0]) + return formatWithArgumentRanges(self._s[1635]!, self._r[1635]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1634]!, self._r[1634]!, [_0]) + return formatWithArgumentRanges(self._s[1637]!, self._r[1637]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1635]! } - public var DialogList_AdLabel: String { return self._s[1636]! } - public var WatchRemote_NotificationText: String { return self._s[1637]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1638]! } - public var Conversation_ReportSpam: String { return self._s[1639]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1640]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1642]! } - public var PhoneLabel_Title: String { return self._s[1643]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1644]! } - public var Settings_ChangePhoneNumber: String { return self._s[1645]! } - public var Notifications_ExceptionsTitle: String { return self._s[1646]! } - public var Notifications_AlertTones: String { return self._s[1647]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1648]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1649]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1650]! } - public var VoiceOver_Chat_Photo: String { return self._s[1652]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1653]! } - public var ReportPeer_ReasonOther: String { return self._s[1654]! } - public var KeyCommand_ScrollDown: String { return self._s[1656]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1657]! } + public var TextFormat_Strikethrough: String { return self._s[1638]! } + public var DialogList_AdLabel: String { return self._s[1639]! } + public var WatchRemote_NotificationText: String { return self._s[1640]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1641]! } + public var Conversation_ReportSpam: String { return self._s[1642]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1643]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1645]! } + public var PhoneLabel_Title: String { return self._s[1646]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1647]! } + public var Settings_ChangePhoneNumber: String { return self._s[1648]! } + public var Notifications_ExceptionsTitle: String { return self._s[1649]! } + public var Notifications_AlertTones: String { return self._s[1650]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1651]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1652]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1653]! } + public var VoiceOver_Chat_Photo: String { return self._s[1655]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1656]! } + public var ReportPeer_ReasonOther: String { return self._s[1657]! } + public var KeyCommand_ScrollDown: String { return self._s[1659]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1660]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1658]!, self._r[1658]!, [_0]) + return formatWithArgumentRanges(self._s[1661]!, self._r[1661]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1659]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1660]! } - public var AuthSessions_LogOut: String { return self._s[1661]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1662]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1663]! } - public var Passport_Phone_Title: String { return self._s[1664]! } - public var Settings_PhoneNumber: String { return self._s[1665]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1662]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1663]! } + public var AuthSessions_LogOut: String { return self._s[1664]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1665]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1666]! } + public var Passport_Phone_Title: String { return self._s[1667]! } + public var Settings_PhoneNumber: String { return self._s[1668]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_0]) + return formatWithArgumentRanges(self._s[1669]!, self._r[1669]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1667]! } - public var WebSearch_SearchNoResults: String { return self._s[1668]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1670]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1671]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1672]! } - public var PhotoEditor_CurvesTool: String { return self._s[1673]! } - public var Checkout_PaymentMethod: String { return self._s[1675]! } + public var NotificationsSound_Alert: String { return self._s[1670]! } + public var WebSearch_SearchNoResults: String { return self._s[1671]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1673]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1674]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1675]! } + public var PhotoEditor_CurvesTool: String { return self._s[1676]! } + public var Checkout_PaymentMethod: String { return self._s[1678]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1676]!, self._r[1676]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1679]!, self._r[1679]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1677]! } - public var Camera_PhotoMode: String { return self._s[1680]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1682]! } - public var CallSettings_OnMobile: String { return self._s[1683]! } - public var Tour_Text2: String { return self._s[1684]! } + public var Contacts_AccessDeniedError: String { return self._s[1680]! } + public var Camera_PhotoMode: String { return self._s[1683]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1685]! } + public var CallSettings_OnMobile: String { return self._s[1686]! } + public var Tour_Text2: String { return self._s[1687]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1685]!, self._r[1685]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1687]! } - public var Permissions_Skip: String { return self._s[1688]! } - public var SecretImage_Title: String { return self._s[1689]! } - public var Watch_MessageView_Title: String { return self._s[1690]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1691]! } - public var AttachmentMenu_Poll: String { return self._s[1692]! } + public var DialogList_EncryptionProcessing: String { return self._s[1690]! } + public var Permissions_Skip: String { return self._s[1691]! } + public var SecretImage_Title: String { return self._s[1692]! } + public var Watch_MessageView_Title: String { return self._s[1693]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1694]! } + public var AttachmentMenu_Poll: String { return self._s[1695]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_0]) + return formatWithArgumentRanges(self._s[1696]!, self._r[1696]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1694]!, self._r[1694]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1697]!, self._r[1697]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1695]! } - public var WallpaperPreview_Title: String { return self._s[1696]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1697]! } - public var Settings_ProxyConnecting: String { return self._s[1698]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1700]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1701]! } - public var Profile_MessageLifetime5s: String { return self._s[1702]! } - public var Username_InvalidCharacters: String { return self._s[1703]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1704]! } - public var ScheduledMessages_ClearAll: String { return self._s[1705]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1706]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1707]! } - public var Settings_AddAccount: String { return self._s[1708]! } - public var Notification_CreatedChannel: String { return self._s[1711]! } + public var Notification_CallCanceled: String { return self._s[1698]! } + public var WallpaperPreview_Title: String { return self._s[1699]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1700]! } + public var Settings_ProxyConnecting: String { return self._s[1701]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1703]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1704]! } + public var Profile_MessageLifetime5s: String { return self._s[1705]! } + public var Username_InvalidCharacters: String { return self._s[1706]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1707]! } + public var ScheduledMessages_ClearAll: String { return self._s[1708]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1709]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1710]! } + public var Settings_AddAccount: String { return self._s[1711]! } + public var Notification_CreatedChannel: String { return self._s[1714]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1712]!, self._r[1712]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1714]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1715]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1716]! } - public var Contacts_TopSection: String { return self._s[1717]! } + public var Passcode_AppLockedAlert: String { return self._s[1717]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1718]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1719]! } + public var Contacts_TopSection: String { return self._s[1720]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1718]!, self._r[1718]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_0]) + return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1720]! } - public var UserInfo_TapToCall: String { return self._s[1721]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1723]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1724]! } - public var Common_Search: String { return self._s[1725]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1726]! } + public var ReportPeer_ReasonSpam: String { return self._s[1723]! } + public var UserInfo_TapToCall: String { return self._s[1724]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1726]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1727]! } + public var Common_Search: String { return self._s[1728]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1729]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1727]!, self._r[1727]!, [_0]) + return formatWithArgumentRanges(self._s[1730]!, self._r[1730]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1728]! } - public var Message_InvoiceLabel: String { return self._s[1729]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1730]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1731]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1731]! } + public var Message_InvoiceLabel: String { return self._s[1732]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1733]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1734]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1732]!, self._r[1732]!, [_0]) + return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) } - public var Conversation_Info: String { return self._s[1733]! } - public var Login_InfoDeletePhoto: String { return self._s[1734]! } - public var Passport_Language_vi: String { return self._s[1736]! } - public var UserInfo_ScamUserWarning: String { return self._s[1737]! } - public var Conversation_Search: String { return self._s[1738]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1739]! } - public var ReportPeer_ReasonPornography: String { return self._s[1740]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1741]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1742]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1743]! } - public var Channel_Setup_TypeHeader: String { return self._s[1744]! } - public var AuthSessions_LoggedIn: String { return self._s[1745]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1746]! } - public var Login_SmsRequestState3: String { return self._s[1747]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1748]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1749]! } - public var Join_ChannelsTooMuch: String { return self._s[1750]! } - public var Channel_Edit_LinkItem: String { return self._s[1751]! } - public var Privacy_Calls_P2PNever: String { return self._s[1752]! } - public var Conversation_AddToReadingList: String { return self._s[1754]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1755]! } - public var Message_Animation: String { return self._s[1756]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1757]! } - public var Map_Unknown: String { return self._s[1758]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1759]! } + public var Conversation_Info: String { return self._s[1736]! } + public var Login_InfoDeletePhoto: String { return self._s[1737]! } + public var Passport_Language_vi: String { return self._s[1739]! } + public var UserInfo_ScamUserWarning: String { return self._s[1740]! } + public var Conversation_Search: String { return self._s[1741]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1742]! } + public var ReportPeer_ReasonPornography: String { return self._s[1743]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1744]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1745]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1746]! } + public var Channel_Setup_TypeHeader: String { return self._s[1747]! } + public var AuthSessions_LoggedIn: String { return self._s[1748]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1749]! } + public var Login_SmsRequestState3: String { return self._s[1750]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1751]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1752]! } + public var Join_ChannelsTooMuch: String { return self._s[1753]! } + public var Channel_Edit_LinkItem: String { return self._s[1754]! } + public var Privacy_Calls_P2PNever: String { return self._s[1755]! } + public var Conversation_AddToReadingList: String { return self._s[1757]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1758]! } + public var Message_Animation: String { return self._s[1759]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1760]! } + public var Map_Unknown: String { return self._s[1761]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1762]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1760]!, self._r[1760]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1763]!, self._r[1763]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1761]!, self._r[1761]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1764]!, self._r[1764]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1762]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1763]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1764]! } + public var Call_StatusRequesting: String { return self._s[1765]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1766]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1767]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1765]!, self._r[1765]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1766]!, self._r[1766]!, [_0]) + return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_0]) } - public var Update_Skip: String { return self._s[1767]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1768]! } - public var Message_PinnedPollMessage: String { return self._s[1769]! } - public var BlockedUsers_Title: String { return self._s[1770]! } + public var Update_Skip: String { return self._s[1770]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1771]! } + public var Message_PinnedPollMessage: String { return self._s[1772]! } + public var BlockedUsers_Title: String { return self._s[1773]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_1]) + return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1772]! } - public var NotificationsSound_Bell: String { return self._s[1773]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1774]! } - public var Weekday_Monday: String { return self._s[1775]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1776]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1777]! } - public var ChatSettings_Groups: String { return self._s[1778]! } + public var Username_CheckingUsername: String { return self._s[1775]! } + public var NotificationsSound_Bell: String { return self._s[1776]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1777]! } + public var Weekday_Monday: String { return self._s[1778]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1779]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1780]! } + public var ChatSettings_Groups: String { return self._s[1781]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1779]!, self._r[1779]!, [_0]) + return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1780]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1782]! } - public var ChatList_Unmute: String { return self._s[1783]! } - public var PhotoEditor_CurvesAll: String { return self._s[1784]! } - public var Weekday_ShortTuesday: String { return self._s[1785]! } - public var DialogList_Read: String { return self._s[1786]! } - public var Appearance_AppIconClassic: String { return self._s[1787]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1788]! } - public var Passport_Identity_Gender: String { return self._s[1789]! } + public var Your_card_was_declined: String { return self._s[1783]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1785]! } + public var ChatList_Unmute: String { return self._s[1786]! } + public var PhotoEditor_CurvesAll: String { return self._s[1787]! } + public var Weekday_ShortTuesday: String { return self._s[1788]! } + public var DialogList_Read: String { return self._s[1789]! } + public var Appearance_AppIconClassic: String { return self._s[1790]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1791]! } + public var Passport_Identity_Gender: String { return self._s[1792]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1790]!, self._r[1790]!, [_0]) - } - public var Target_SelectGroup: String { return self._s[1791]! } - public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1793]!, self._r[1793]!, [_0]) } - public var Passport_Language_en: String { return self._s[1794]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1795]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1796]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1797]! } - public var ScheduledMessages_SendNow: String { return self._s[1798]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1800]! } - public var Login_InfoHelp: String { return self._s[1801]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1802]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1803]! } + public var Target_SelectGroup: String { return self._s[1794]! } + public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_0]) + } + public var Passport_Language_en: String { return self._s[1797]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1798]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1799]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1800]! } + public var ScheduledMessages_SendNow: String { return self._s[1801]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1803]! } + public var Login_InfoHelp: String { return self._s[1804]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1805]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1806]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1807]! } - public var CreatePoll_Title: String { return self._s[1808]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1809]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1810]! } - public var UserInfo_GroupsInCommon: String { return self._s[1811]! } - public var Call_AudioRouteHide: String { return self._s[1812]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1814]! } + public var SocksProxySetup_AddProxy: String { return self._s[1810]! } + public var CreatePoll_Title: String { return self._s[1811]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1812]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1813]! } + public var UserInfo_GroupsInCommon: String { return self._s[1814]! } + public var Call_AudioRouteHide: String { return self._s[1815]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1817]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1815]!, self._r[1815]!, [_0]) + return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1816]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1817]! } - public var Notifications_Title: String { return self._s[1818]! } - public var Group_Username_InvalidTooShort: String { return self._s[1819]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1820]! } + public var TextFormat_Bold: String { return self._s[1819]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1820]! } + public var Notifications_Title: String { return self._s[1821]! } + public var Group_Username_InvalidTooShort: String { return self._s[1822]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1823]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1823]! } - public var Stickers_SuggestAdded: String { return self._s[1824]! } - public var Login_CountryCode: String { return self._s[1825]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1826]! } - public var Map_GetDirections: String { return self._s[1827]! } - public var Login_PhoneFloodError: String { return self._s[1828]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1826]! } + public var Stickers_SuggestAdded: String { return self._s[1827]! } + public var Login_CountryCode: String { return self._s[1828]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1829]! } + public var Map_GetDirections: String { return self._s[1830]! } + public var Login_PhoneFloodError: String { return self._s[1831]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1829]!, self._r[1829]!, [_0]) + return formatWithArgumentRanges(self._s[1832]!, self._r[1832]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1831]! } - public var Group_Location_ChangeLocation: String { return self._s[1832]! } - public var Notification_GroupInviterSelf: String { return self._s[1833]! } - public var InstantPage_TapToOpenLink: String { return self._s[1834]! } + public var Settings_SetUsername: String { return self._s[1834]! } + public var Group_Location_ChangeLocation: String { return self._s[1835]! } + public var Notification_GroupInviterSelf: String { return self._s[1836]! } + public var InstantPage_TapToOpenLink: String { return self._s[1837]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1835]!, self._r[1835]!, [_0]) + return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1836]! } - public var SecretChat_Title: String { return self._s[1837]! } - public var Group_UpgradeNoticeText1: String { return self._s[1838]! } - public var AuthSessions_Title: String { return self._s[1839]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1839]! } + public var SecretChat_Title: String { return self._s[1840]! } + public var Group_UpgradeNoticeText1: String { return self._s[1841]! } + public var AuthSessions_Title: String { return self._s[1842]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1840]!, self._r[1840]!, [_0]) + return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1841]! } - public var Channel_About_Title: String { return self._s[1842]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1843]! } + public var PhotoEditor_CropAuto: String { return self._s[1844]! } + public var Channel_About_Title: String { return self._s[1845]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1846]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1845]!, self._r[1845]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1846]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1848]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1849]! } + public var VoiceOver_MessageContextReport: String { return self._s[1849]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1851]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1852]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1850]!, self._r[1850]!, [_1]) + return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1852]!, self._r[1852]!, [_0]) + return formatWithArgumentRanges(self._s[1855]!, self._r[1855]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_0]) + return formatWithArgumentRanges(self._s[1856]!, self._r[1856]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1854]! } - public var Presence_online: String { return self._s[1856]! } - public var PasscodeSettings_Title: String { return self._s[1857]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1858]! } - public var Web_OpenExternal: String { return self._s[1859]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1861]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1862]! } - public var LocalGroup_Title: String { return self._s[1863]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1857]! } + public var Presence_online: String { return self._s[1859]! } + public var PasscodeSettings_Title: String { return self._s[1860]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1861]! } + public var Web_OpenExternal: String { return self._s[1862]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1864]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1865]! } + public var LocalGroup_Title: String { return self._s[1866]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1864]!, self._r[1864]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1865]! } - public var Map_YouAreHere: String { return self._s[1866]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_0]) } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1868]!, self._r[1868]!, [_0]) + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1868]! } + public var Map_YouAreHere: String { return self._s[1869]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1869]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1870]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1871]!, self._r[1871]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1872]!, self._r[1872]!, [_0]) + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1872]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1873]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1874]!, self._r[1874]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1873]! } - public var Bot_Start: String { return self._s[1874]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) + public var SocksProxySetup_Username: String { return self._s[1876]! } + public var Bot_Start: String { return self._s[1877]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1878]!, self._r[1878]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1877]! } - public var AccentColor_Title: String { return self._s[1879]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1880]! } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1879]!, self._r[1879]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[1880]! } + public var AccentColor_Title: String { return self._s[1882]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1883]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_0]) + return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1883]!, self._r[1883]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1886]!, self._r[1886]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1884]! } - public var Login_InfoAvatarPhoto: String { return self._s[1885]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1886]! } - public var Tour_Title4: String { return self._s[1887]! } - public var Passport_Identity_Translation: String { return self._s[1888]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1889]! } - public var Login_TermsOfServiceLabel: String { return self._s[1891]! } - public var Passport_Language_it: String { return self._s[1892]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1893]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1894]! } - public var Conversation_ClearAll: String { return self._s[1896]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1898]! } - public var TwoStepAuth_FloodError: String { return self._s[1899]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1887]! } + public var Login_InfoAvatarPhoto: String { return self._s[1888]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1889]! } + public var Tour_Title4: String { return self._s[1890]! } + public var Passport_Identity_Translation: String { return self._s[1891]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1892]! } + public var Login_TermsOfServiceLabel: String { return self._s[1894]! } + public var Passport_Language_it: String { return self._s[1895]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1896]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1897]! } + public var Conversation_ClearAll: String { return self._s[1899]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1901]! } + public var TwoStepAuth_FloodError: String { return self._s[1902]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1900]!, self._r[1900]!, [_1]) - } - public var Paint_Delete: String { return self._s[1901]! } - public var Privacy_AddNewPeer: String { return self._s[1902]! } - public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1903]!, self._r[1903]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1904]! } + public var Paint_Delete: String { return self._s[1904]! } + public var Privacy_AddNewPeer: String { return self._s[1905]! } + public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1906]!, self._r[1906]!, [_1]) + } + public var LogoutOptions_SetPasscodeText: String { return self._s[1907]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1905]!, self._r[1905]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1908]!, self._r[1908]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1906]! } + public var Message_PinnedAudioMessage: String { return self._s[1909]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1907]!, self._r[1907]!, [_0]) + return formatWithArgumentRanges(self._s[1910]!, self._r[1910]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1908]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1909]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1910]! } - public var Conversation_MessageEditedLabel: String { return self._s[1911]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1912]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1913]! } + public var Notification_Mute1hMin: String { return self._s[1911]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1912]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1913]! } + public var Conversation_MessageEditedLabel: String { return self._s[1914]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1915]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1916]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1915]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1918]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_1]) + return formatWithArgumentRanges(self._s[1919]!, self._r[1919]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1917]! } - public var Month_GenOctober: String { return self._s[1918]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1919]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1920]! } - public var MediaPicker_TimerTooltip: String { return self._s[1922]! } - public var SharedMedia_TitleAll: String { return self._s[1923]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1926]! } - public var Conversation_RestrictedMedia: String { return self._s[1927]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1928]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1930]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1931]! } + public var AccessDenied_LocationTracking: String { return self._s[1920]! } + public var Month_GenOctober: String { return self._s[1921]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1922]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1923]! } + public var MediaPicker_TimerTooltip: String { return self._s[1925]! } + public var SharedMedia_TitleAll: String { return self._s[1926]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1929]! } + public var Conversation_RestrictedMedia: String { return self._s[1930]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1931]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1933]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1934]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1932]!, self._r[1932]!, [_0]) + return formatWithArgumentRanges(self._s[1935]!, self._r[1935]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1935]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1937]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1938]! } + public var Conversation_SavedMessages: String { return self._s[1938]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1940]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1941]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1940]!, self._r[1940]!, [_0]) + return formatWithArgumentRanges(self._s[1943]!, self._r[1943]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1941]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1944]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1942]!, self._r[1942]!, [_0]) + return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1943]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1944]! } + public var ReportPeer_AlertSuccess: String { return self._s[1946]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1947]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1946]! } - public var PhotoEditor_FadeTool: String { return self._s[1947]! } - public var Privacy_ContactsReset: String { return self._s[1948]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1949]! } + public var PhotoEditor_FadeTool: String { return self._s[1950]! } + public var Privacy_ContactsReset: String { return self._s[1951]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1950]!, self._r[1950]!, [_0]) + return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1951]! } - public var ChatList_Mute: String { return self._s[1952]! } - public var Permissions_CellularDataText_v0: String { return self._s[1953]! } - public var ShareMenu_SelectChats: String { return self._s[1955]! } - public var MusicPlayer_VoiceNote: String { return self._s[1956]! } - public var Conversation_RestrictedText: String { return self._s[1957]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1958]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1959]! } - public var Cache_Videos: String { return self._s[1960]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1961]! } - public var FeatureDisabled_Oops: String { return self._s[1963]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1964]! } + public var Message_PinnedVideoMessage: String { return self._s[1954]! } + public var ChatList_Mute: String { return self._s[1955]! } + public var Permissions_CellularDataText_v0: String { return self._s[1956]! } + public var ShareMenu_SelectChats: String { return self._s[1958]! } + public var MusicPlayer_VoiceNote: String { return self._s[1959]! } + public var Conversation_RestrictedText: String { return self._s[1960]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1961]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1962]! } + public var Cache_Videos: String { return self._s[1963]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1964]! } + public var FeatureDisabled_Oops: String { return self._s[1966]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1967]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1965]!, self._r[1965]!, [_0]) + return formatWithArgumentRanges(self._s[1968]!, self._r[1968]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1966]! } - public var GroupPermission_NoSendPolls: String { return self._s[1967]! } - public var Message_VideoExpired: String { return self._s[1969]! } - public var Notifications_Badge: String { return self._s[1970]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1971]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1972]! } - public var Username_InvalidTooShort: String { return self._s[1973]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1974]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1975]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1976]! } + public var Stickers_GroupStickersHelp: String { return self._s[1969]! } + public var GroupPermission_NoSendPolls: String { return self._s[1970]! } + public var Message_VideoExpired: String { return self._s[1972]! } + public var Notifications_Badge: String { return self._s[1973]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1974]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1975]! } + public var Username_InvalidTooShort: String { return self._s[1976]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1977]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1978]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1979]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1977]!, self._r[1977]!, [_1]) + return formatWithArgumentRanges(self._s[1980]!, self._r[1980]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1978]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1979]! } - public var SharedMedia_CategoryDocs: String { return self._s[1982]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1981]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1982]! } + public var SharedMedia_CategoryDocs: String { return self._s[1985]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_1]) - } - public var Privacy_Forwards_NeverLink: String { return self._s[1985]! } - public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1987]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1988]! } + public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1989]!, self._r[1989]!, [_1]) + } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1990]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1988]!, self._r[1988]!, [_0]) + return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1989]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1990]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1991]! } - public var Channel_UpdatePhotoItem: String { return self._s[1992]! } - public var GroupInfo_LeftStatus: String { return self._s[1993]! } - public var Watch_MessageView_Forward: String { return self._s[1995]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[1996]! } - public var Cache_ClearEmpty: String { return self._s[1998]! } - public var Localization_LanguageName: String { return self._s[1999]! } - public var WebSearch_GIFs: String { return self._s[2000]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2001]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2002]! } - public var Common_Back: String { return self._s[2003]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2004]! } + public var ChatSettings_PrivateChats: String { return self._s[1992]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1993]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1994]! } + public var Channel_UpdatePhotoItem: String { return self._s[1995]! } + public var GroupInfo_LeftStatus: String { return self._s[1996]! } + public var Watch_MessageView_Forward: String { return self._s[1998]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[1999]! } + public var Cache_ClearEmpty: String { return self._s[2001]! } + public var Localization_LanguageName: String { return self._s[2002]! } + public var WebSearch_GIFs: String { return self._s[2003]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2004]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2005]! } + public var Common_Back: String { return self._s[2006]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2007]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2005]!, self._r[2005]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2008]!, self._r[2008]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2006]! } - public var Watch_Conversation_Reply: String { return self._s[2008]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2010]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2011]! } - public var Channel_BanUser_Unban: String { return self._s[2013]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2014]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2015]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2017]! } - public var Passport_Identity_Name: String { return self._s[2018]! } + public var Passport_Email_Help: String { return self._s[2009]! } + public var Watch_Conversation_Reply: String { return self._s[2011]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2013]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2014]! } + public var Channel_BanUser_Unban: String { return self._s[2016]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2017]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2018]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2020]! } + public var Passport_Identity_Name: String { return self._s[2021]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2019]!, self._r[2019]!, [_0]) + return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2020]! } - public var Conversation_BlockUser: String { return self._s[2021]! } - public var Month_GenJanuary: String { return self._s[2022]! } - public var ChatSettings_TextSize: String { return self._s[2023]! } - public var Notification_PassportValuePhone: String { return self._s[2024]! } - public var Passport_Language_ne: String { return self._s[2025]! } - public var Notification_CallBack: String { return self._s[2026]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2027]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2023]! } + public var Conversation_BlockUser: String { return self._s[2024]! } + public var Month_GenJanuary: String { return self._s[2025]! } + public var ChatSettings_TextSize: String { return self._s[2026]! } + public var Notification_PassportValuePhone: String { return self._s[2027]! } + public var Passport_Language_ne: String { return self._s[2028]! } + public var Notification_CallBack: String { return self._s[2029]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2030]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) + return formatWithArgumentRanges(self._s[2031]!, self._r[2031]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2029]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2030]! } - public var Stickers_FrequentlyUsed: String { return self._s[2031]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2032]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2034]! } + public var Channel_Info_Management: String { return self._s[2032]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2033]! } + public var Stickers_FrequentlyUsed: String { return self._s[2034]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2035]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2037]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2035]!, self._r[2035]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2038]!, self._r[2038]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2036]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2037]! } - public var CreatePoll_TextHeader: String { return self._s[2038]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2039]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2040]! } + public var CreatePoll_TextHeader: String { return self._s[2041]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2039]!, self._r[2039]!, [_0]) + return formatWithArgumentRanges(self._s[2042]!, self._r[2042]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2040]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2041]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2043]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2044]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2045]! } + public var PhotoEditor_QualityMedium: String { return self._s[2043]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2044]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2046]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2047]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2048]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2046]!, self._r[2046]!, [_0]) + return formatWithArgumentRanges(self._s[2049]!, self._r[2049]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_1]) + return formatWithArgumentRanges(self._s[2050]!, self._r[2050]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2049]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2050]! } - public var Settings_Username: String { return self._s[2052]! } - public var Conversation_Block: String { return self._s[2054]! } - public var Wallpaper_Wallpaper: String { return self._s[2055]! } - public var SocksProxySetup_UseProxy: String { return self._s[2057]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2058]! } - public var MessageTimer_Forever: String { return self._s[2059]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2060]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2061]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2062]! } - public var Passport_Language_da: String { return self._s[2063]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2064]! } + public var Conversation_LinkDialogOpen: String { return self._s[2052]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2053]! } + public var Settings_Username: String { return self._s[2055]! } + public var Conversation_Block: String { return self._s[2057]! } + public var Wallpaper_Wallpaper: String { return self._s[2058]! } + public var SocksProxySetup_UseProxy: String { return self._s[2060]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2061]! } + public var MessageTimer_Forever: String { return self._s[2062]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2063]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2064]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2065]! } + public var Passport_Language_da: String { return self._s[2066]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2067]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2065]!, self._r[2065]!, [_0]) - } - public var Passport_Address_EditPassportRegistration: String { return self._s[2066]! } - public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2068]!, self._r[2068]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2070]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2071]! } - public var Conversation_PinnedPoll: String { return self._s[2072]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2073]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2069]! } + public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2071]!, self._r[2071]!, [_0]) + } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2073]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2074]! } + public var Conversation_PinnedPoll: String { return self._s[2075]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2076]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_1]) + return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2075]! } - public var Cache_ByPeerHeader: String { return self._s[2076]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2078]! } + public var Cache_ByPeerHeader: String { return self._s[2079]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_0]) + return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2078]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2081]! } - public var Notification_PinnedMessage: String { return self._s[2082]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2084]! } - public var Contacts_SortBy: String { return self._s[2085]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2081]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2084]! } + public var Notification_PinnedMessage: String { return self._s[2085]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2087]! } + public var Contacts_SortBy: String { return self._s[2088]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_1]) + return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2088]!, self._r[2088]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2089]! } - public var Watch_UserInfo_Service: String { return self._s[2090]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2092]! } - public var Conversation_Unpin: String { return self._s[2094]! } - public var CancelResetAccount_Title: String { return self._s[2095]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2096]! } + public var Call_EncryptionKey_Title: String { return self._s[2092]! } + public var Watch_UserInfo_Service: String { return self._s[2093]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2095]! } + public var Conversation_Unpin: String { return self._s[2097]! } + public var CancelResetAccount_Title: String { return self._s[2098]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2099]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2098]!, self._r[2098]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2101]!, self._r[2101]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2099]! } - public var CallSettings_Title: String { return self._s[2100]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2101]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2103]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2104]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2102]! } + public var CallSettings_Title: String { return self._s[2103]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2104]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2106]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2107]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2105]!, self._r[2105]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2106]! } - public var LoginPassword_PasswordHelp: String { return self._s[2107]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2108]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2109]! } - public var Checkout_TotalPaidAmount: String { return self._s[2110]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2109]! } + public var LoginPassword_PasswordHelp: String { return self._s[2110]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2111]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2112]! } + public var Checkout_TotalPaidAmount: String { return self._s[2113]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_0]) + return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2112]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2114]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2115]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2115]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2117]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2118]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_1]) + return formatWithArgumentRanges(self._s[2119]!, self._r[2119]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2117]! } - public var Contacts_InviteFriends: String { return self._s[2119]! } - public var Map_ChooseLocationTitle: String { return self._s[2120]! } - public var Conversation_StopPoll: String { return self._s[2122]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2120]! } + public var Contacts_InviteFriends: String { return self._s[2122]! } + public var Map_ChooseLocationTitle: String { return self._s[2123]! } + public var Conversation_StopPoll: String { return self._s[2125]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2123]!, self._r[2123]!, [_0]) + return formatWithArgumentRanges(self._s[2126]!, self._r[2126]!, [_0]) } - public var Call_Camera: String { return self._s[2124]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2125]! } - public var Calls_RatingFeedback: String { return self._s[2126]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2127]! } - public var NotificationsSound_Pulse: String { return self._s[2128]! } - public var Watch_LastSeen_Lately: String { return self._s[2129]! } - public var ReportGroupLocation_Report: String { return self._s[2132]! } - public var Widget_NoUsers: String { return self._s[2133]! } - public var Conversation_UnvotePoll: String { return self._s[2134]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2136]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2137]! } - public var NotificationsSound_Circles: String { return self._s[2138]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2140]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2141]! } - public var Proxy_TooltipUnavailable: String { return self._s[2142]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2144]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2146]! } - public var Conversation_FileDropbox: String { return self._s[2147]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2148]! } - public var Tour_Text3: String { return self._s[2150]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2152]! } - public var GroupPermission_NoSendMessages: String { return self._s[2153]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2154]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2155]! } + public var Call_Camera: String { return self._s[2127]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2128]! } + public var Calls_RatingFeedback: String { return self._s[2129]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2130]! } + public var NotificationsSound_Pulse: String { return self._s[2131]! } + public var Watch_LastSeen_Lately: String { return self._s[2132]! } + public var ReportGroupLocation_Report: String { return self._s[2135]! } + public var Widget_NoUsers: String { return self._s[2136]! } + public var Conversation_UnvotePoll: String { return self._s[2137]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2139]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2140]! } + public var NotificationsSound_Circles: String { return self._s[2141]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2143]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2144]! } + public var Proxy_TooltipUnavailable: String { return self._s[2145]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2147]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2149]! } + public var Conversation_FileDropbox: String { return self._s[2150]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2151]! } + public var Tour_Text3: String { return self._s[2153]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2155]! } + public var GroupPermission_NoSendMessages: String { return self._s[2156]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2157]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2158]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2157]!, self._r[2157]!, [_0]) + return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2158]! } - public var Checkout_ShippingOption_Title: String { return self._s[2159]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2160]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2161]! } + public var Checkout_ShippingOption_Title: String { return self._s[2162]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2163]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2161]!, self._r[2161]!, [_0]) + return formatWithArgumentRanges(self._s[2164]!, self._r[2164]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2162]!, self._r[2162]!, [_0]) + return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2163]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2164]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2165]! } - public var AutoDownloadSettings_Photos: String { return self._s[2167]! } - public var Appearance_PreviewIncomingText: String { return self._s[2168]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2169]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2170]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2171]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2172]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2173]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2174]! } - public var Notification_SecretChatScreenshot: String { return self._s[2175]! } - public var AccessDenied_Wallpapers: String { return self._s[2176]! } - public var Passport_Address_City: String { return self._s[2178]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2179]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2180]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2181]! } - public var AccessDenied_LocationDisabled: String { return self._s[2182]! } - public var Group_Location_Title: String { return self._s[2183]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2185]! } - public var GroupInfo_Sound: String { return self._s[2186]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2187]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2188]! } - public var Contacts_Title: String { return self._s[2189]! } - public var Passport_Language_fr: String { return self._s[2190]! } - public var Notifications_ResetAllNotifications: String { return self._s[2191]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2194]! } - public var Checkout_NewCard_Title: String { return self._s[2195]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2196]! } - public var Conversation_ForwardChats: String { return self._s[2197]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2199]! } - public var Settings_FAQ: String { return self._s[2201]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2202]! } - public var Conversation_ContextMenuForward: String { return self._s[2203]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2206]! } - public var PrivacyPolicy_Title: String { return self._s[2209]! } - public var Notifications_TextTone: String { return self._s[2210]! } - public var Profile_CreateNewContact: String { return self._s[2211]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2212]! } - public var Call_Speaker: String { return self._s[2214]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2215]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2217]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2218]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2166]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2167]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2168]! } + public var AutoDownloadSettings_Photos: String { return self._s[2170]! } + public var Appearance_PreviewIncomingText: String { return self._s[2171]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2172]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2173]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2174]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2175]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2176]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2177]! } + public var Notification_SecretChatScreenshot: String { return self._s[2178]! } + public var AccessDenied_Wallpapers: String { return self._s[2179]! } + public var Passport_Address_City: String { return self._s[2181]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2182]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2183]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2184]! } + public var AccessDenied_LocationDisabled: String { return self._s[2185]! } + public var Group_Location_Title: String { return self._s[2186]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2188]! } + public var GroupInfo_Sound: String { return self._s[2189]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2190]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2191]! } + public var Contacts_Title: String { return self._s[2192]! } + public var Passport_Language_fr: String { return self._s[2193]! } + public var Notifications_ResetAllNotifications: String { return self._s[2194]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2197]! } + public var Checkout_NewCard_Title: String { return self._s[2198]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2199]! } + public var Conversation_ForwardChats: String { return self._s[2200]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2202]! } + public var Settings_FAQ: String { return self._s[2204]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2205]! } + public var Conversation_ContextMenuForward: String { return self._s[2206]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2209]! } + public var PrivacyPolicy_Title: String { return self._s[2212]! } + public var Notifications_TextTone: String { return self._s[2213]! } + public var Profile_CreateNewContact: String { return self._s[2214]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2215]! } + public var Call_Speaker: String { return self._s[2217]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2218]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2220]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2221]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2219]!, self._r[2219]!, [_0]) + return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2220]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2221]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2222]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2223]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2224]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2225]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2226]! } - public var Bot_Unblock: String { return self._s[2227]! } - public var TextFormat_Italic: String { return self._s[2228]! } - public var WallpaperSearch_ColorPink: String { return self._s[2229]! } - public var Settings_About_Help: String { return self._s[2230]! } - public var SearchImages_Title: String { return self._s[2231]! } - public var Weekday_Wednesday: String { return self._s[2232]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2233]! } - public var ExplicitContent_AlertTitle: String { return self._s[2234]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2223]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2224]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2225]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2226]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2227]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2228]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2229]! } + public var Bot_Unblock: String { return self._s[2230]! } + public var TextFormat_Italic: String { return self._s[2231]! } + public var WallpaperSearch_ColorPink: String { return self._s[2232]! } + public var Settings_About_Help: String { return self._s[2233]! } + public var SearchImages_Title: String { return self._s[2234]! } + public var Weekday_Wednesday: String { return self._s[2235]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2236]! } + public var ExplicitContent_AlertTitle: String { return self._s[2237]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2235]!, self._r[2235]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2238]!, self._r[2238]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2236]! } - public var Weekday_Thursday: String { return self._s[2237]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2238]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2239]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2239]! } + public var Weekday_Thursday: String { return self._s[2240]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2241]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2242]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2240]!, self._r[2240]!, [_0]) + return formatWithArgumentRanges(self._s[2243]!, self._r[2243]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2241]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2242]! } - public var Passport_RequestedInformation: String { return self._s[2243]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2244]! } - public var Conversation_EncryptionProcessing: String { return self._s[2246]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2247]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2249]! } - public var Channel_Setup_Title: String { return self._s[2250]! } - public var Conversation_SearchPlaceholder: String { return self._s[2251]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2252]! } - public var Checkout_ErrorGeneric: String { return self._s[2253]! } - public var Passport_Language_hu: String { return self._s[2254]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2244]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2245]! } + public var Passport_RequestedInformation: String { return self._s[2246]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2247]! } + public var Conversation_EncryptionProcessing: String { return self._s[2249]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2250]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2252]! } + public var Channel_Setup_Title: String { return self._s[2253]! } + public var Conversation_SearchPlaceholder: String { return self._s[2254]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2255]! } + public var Checkout_ErrorGeneric: String { return self._s[2256]! } + public var Passport_Language_hu: String { return self._s[2257]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2256]!, self._r[2256]!, [_0]) + return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_1]) + return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2260]!, self._r[2260]!, [_0]) + return formatWithArgumentRanges(self._s[2263]!, self._r[2263]!, [_0]) } - public var Group_Location_Info: String { return self._s[2261]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2262]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2263]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2264]! } + public var Group_Location_Info: String { return self._s[2264]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2265]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2266]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2267]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_0]) + return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2266]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2267]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2268]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2269]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2270]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2271]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) + return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2270]! } - public var Message_PinnedAnimationMessage: String { return self._s[2272]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2274]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2275]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2277]! } - public var Embed_PlayingInPIP: String { return self._s[2278]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2279]! } + public var Passport_Language_cs: String { return self._s[2273]! } + public var Message_PinnedAnimationMessage: String { return self._s[2275]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2277]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2278]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2280]! } + public var Embed_PlayingInPIP: String { return self._s[2281]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2282]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2280]!, self._r[2280]!, [_0]) + return formatWithArgumentRanges(self._s[2283]!, self._r[2283]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2281]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2284]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2282]!, self._r[2282]!, [_1]) + return formatWithArgumentRanges(self._s[2285]!, self._r[2285]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2283]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2284]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2285]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2286]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2287]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2288]! } + public var Notification_PaymentSent: String { return self._s[2286]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2287]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2288]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2289]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2290]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2291]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1]) + return formatWithArgumentRanges(self._s[2294]!, self._r[2294]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2292]!, self._r[2292]!, [_1]) + return formatWithArgumentRanges(self._s[2295]!, self._r[2295]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2293]!, self._r[2293]!, [_1]) + return formatWithArgumentRanges(self._s[2296]!, self._r[2296]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2295]! } - public var PasscodeSettings_HelpTop: String { return self._s[2296]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2297]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2298]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2299]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2300]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2301]! } - public var Call_Accept: String { return self._s[2303]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2304]! } - public var Month_GenMarch: String { return self._s[2306]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2307]! } - public var LoginPassword_Title: String { return self._s[2308]! } - public var Call_End: String { return self._s[2309]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2310]! } - public var VoiceOver_Chat_Contact: String { return self._s[2311]! } - public var CallSettings_Always: String { return self._s[2312]! } - public var CallFeedback_Success: String { return self._s[2313]! } - public var TwoStepAuth_SetupHint: String { return self._s[2314]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2298]! } + public var PasscodeSettings_HelpTop: String { return self._s[2299]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2300]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2301]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2302]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2303]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2304]! } + public var Call_Accept: String { return self._s[2306]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2307]! } + public var Month_GenMarch: String { return self._s[2309]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2310]! } + public var LoginPassword_Title: String { return self._s[2311]! } + public var Call_End: String { return self._s[2312]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2313]! } + public var VoiceOver_Chat_Contact: String { return self._s[2314]! } + public var CallSettings_Always: String { return self._s[2315]! } + public var CallFeedback_Success: String { return self._s[2316]! } + public var TwoStepAuth_SetupHint: String { return self._s[2317]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2315]!, self._r[2315]!, [_1]) + return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2316]! } - public var Login_PhoneTitle: String { return self._s[2317]! } - public var Passport_FieldPhoneHelp: String { return self._s[2318]! } - public var Weekday_ShortSunday: String { return self._s[2319]! } - public var Passport_InfoFAQ_URL: String { return self._s[2320]! } - public var ContactInfo_Job: String { return self._s[2322]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2323]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2324]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2325]! } - public var Invite_ChannelsTooMuch: String { return self._s[2326]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2327]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2328]! } - public var CallFeedback_ReasonNoise: String { return self._s[2329]! } - public var Appearance_AppIconDefault: String { return self._s[2331]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2332]! } - public var MediaPicker_AddCaption: String { return self._s[2333]! } - public var CallSettings_TabIconDescription: String { return self._s[2334]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2319]! } + public var Login_PhoneTitle: String { return self._s[2320]! } + public var Passport_FieldPhoneHelp: String { return self._s[2321]! } + public var Weekday_ShortSunday: String { return self._s[2322]! } + public var Passport_InfoFAQ_URL: String { return self._s[2323]! } + public var ContactInfo_Job: String { return self._s[2325]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2326]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2327]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2328]! } + public var Invite_ChannelsTooMuch: String { return self._s[2329]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2330]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2331]! } + public var CallFeedback_ReasonNoise: String { return self._s[2332]! } + public var Appearance_AppIconDefault: String { return self._s[2334]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2335]! } + public var MediaPicker_AddCaption: String { return self._s[2336]! } + public var CallSettings_TabIconDescription: String { return self._s[2337]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2335]!, self._r[2335]!, [_0]) + return formatWithArgumentRanges(self._s[2338]!, self._r[2338]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2336]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2337]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2338]! } - public var DialogList_SearchSectionRecent: String { return self._s[2339]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2340]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2343]! } - public var LastSeen_WithinAWeek: String { return self._s[2344]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2345]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2347]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2348]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2339]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2340]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2341]! } + public var DialogList_SearchSectionRecent: String { return self._s[2342]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2343]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2346]! } + public var LastSeen_WithinAWeek: String { return self._s[2347]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2348]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2350]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2351]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2349]!, self._r[2349]!, [_0]) + return formatWithArgumentRanges(self._s[2352]!, self._r[2352]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2350]! } - public var Conversation_StatusLeftGroup: String { return self._s[2351]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2352]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2354]! } - public var GroupPermission_AddSuccess: String { return self._s[2355]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2357]! } - public var Conversation_ContextMenuCopy: String { return self._s[2358]! } - public var AccessDenied_CallMicrophone: String { return self._s[2359]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2353]! } + public var Conversation_StatusLeftGroup: String { return self._s[2354]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2355]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2357]! } + public var GroupPermission_AddSuccess: String { return self._s[2358]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2360]! } + public var Conversation_ContextMenuCopy: String { return self._s[2361]! } + public var AccessDenied_CallMicrophone: String { return self._s[2362]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2360]!, self._r[2360]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2361]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2362]! } - public var Checkout_PaymentMethod_New: String { return self._s[2363]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2364]! } - public var PhotoEditor_QualityTool: String { return self._s[2365]! } - public var Login_SendCodeViaSms: String { return self._s[2366]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2367]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2368]! } - public var Login_EmailNotConfiguredError: String { return self._s[2369]! } - public var SocksProxySetup_Status: String { return self._s[2370]! } - public var PrivacyPolicy_Accept: String { return self._s[2371]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2372]! } - public var Appearance_AppIconClassicX: String { return self._s[2373]! } + public var Login_InvalidFirstNameError: String { return self._s[2364]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2365]! } + public var Checkout_PaymentMethod_New: String { return self._s[2366]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2367]! } + public var PhotoEditor_QualityTool: String { return self._s[2368]! } + public var Login_SendCodeViaSms: String { return self._s[2369]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2370]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2371]! } + public var Login_EmailNotConfiguredError: String { return self._s[2372]! } + public var SocksProxySetup_Status: String { return self._s[2373]! } + public var PrivacyPolicy_Accept: String { return self._s[2374]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2375]! } + public var Appearance_AppIconClassicX: String { return self._s[2376]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2374]!, self._r[2374]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2377]!, self._r[2377]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2375]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2376]! } - public var AutoNightTheme_Automatic: String { return self._s[2377]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2378]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2379]! } - public var Cache_Help: String { return self._s[2380]! } - public var Group_ErrorAccessDenied: String { return self._s[2381]! } - public var Passport_Language_fa: String { return self._s[2382]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2383]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2384]! } - public var PrivacySettings_LastSeen: String { return self._s[2385]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2378]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2379]! } + public var AutoNightTheme_Automatic: String { return self._s[2380]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2381]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2382]! } + public var Cache_Help: String { return self._s[2383]! } + public var Group_ErrorAccessDenied: String { return self._s[2384]! } + public var Passport_Language_fa: String { return self._s[2385]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2386]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2387]! } + public var PrivacySettings_LastSeen: String { return self._s[2388]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2386]!, self._r[2386]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2389]!, self._r[2389]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2390]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2391]! } - public var Profile_About: String { return self._s[2392]! } - public var Channel_About_Placeholder: String { return self._s[2393]! } - public var Login_InfoTitle: String { return self._s[2394]! } + public var Preview_SaveGif: String { return self._s[2393]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2394]! } + public var Profile_About: String { return self._s[2395]! } + public var Channel_About_Placeholder: String { return self._s[2396]! } + public var Login_InfoTitle: String { return self._s[2397]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2395]!, self._r[2395]!, [_0]) + return formatWithArgumentRanges(self._s[2398]!, self._r[2398]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2397]! } - public var ContactInfo_Title: String { return self._s[2398]! } - public var Media_ShareThisVideo: String { return self._s[2399]! } - public var Weekday_ShortFriday: String { return self._s[2400]! } - public var AccessDenied_Contacts: String { return self._s[2402]! } - public var Notification_CallIncomingShort: String { return self._s[2403]! } - public var Group_Setup_TypePublic: String { return self._s[2404]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2405]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2406]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2409]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2410]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2411]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2412]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2413]! } - public var DialogList_Typing: String { return self._s[2414]! } - public var CallFeedback_IncludeLogs: String { return self._s[2416]! } - public var Checkout_Phone: String { return self._s[2418]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2421]! } - public var Privacy_Calls_Integration: String { return self._s[2422]! } - public var Notifications_PermissionsAllow: String { return self._s[2423]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2427]! } - public var Settings_ChatSettings: String { return self._s[2428]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2400]! } + public var ContactInfo_Title: String { return self._s[2401]! } + public var Media_ShareThisVideo: String { return self._s[2402]! } + public var Weekday_ShortFriday: String { return self._s[2403]! } + public var AccessDenied_Contacts: String { return self._s[2405]! } + public var Notification_CallIncomingShort: String { return self._s[2406]! } + public var Group_Setup_TypePublic: String { return self._s[2407]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2408]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2409]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2412]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2413]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2414]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2415]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2416]! } + public var DialogList_Typing: String { return self._s[2417]! } + public var CallFeedback_IncludeLogs: String { return self._s[2419]! } + public var Checkout_Phone: String { return self._s[2421]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2424]! } + public var Privacy_Calls_Integration: String { return self._s[2425]! } + public var Notifications_PermissionsAllow: String { return self._s[2426]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2430]! } + public var Settings_ChatSettings: String { return self._s[2431]! } public func PUSH_MESSAGE_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2429]!, self._r[2429]!, [_1]) + return formatWithArgumentRanges(self._s[2432]!, self._r[2432]!, [_1]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2430]!, self._r[2430]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2432]! } + public var GroupRemoved_DeleteUser: String { return self._s[2435]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_0]) + return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2434]!, self._r[2434]!, [_1]) + return formatWithArgumentRanges(self._s[2437]!, self._r[2437]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2435]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2436]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2438]! } - public var Conversation_Unblock: String { return self._s[2439]! } - public var PrivacySettings_DataSettings: String { return self._s[2440]! } - public var Group_PublicLink_Info: String { return self._s[2441]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2442]! } + public var Login_ContinueWithLocalization: String { return self._s[2438]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2439]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2441]! } + public var Conversation_Unblock: String { return self._s[2442]! } + public var PrivacySettings_DataSettings: String { return self._s[2443]! } + public var Group_PublicLink_Info: String { return self._s[2444]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2445]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2446]!, self._r[2446]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2446]! } - public var Call_Mute: String { return self._s[2447]! } - public var Passport_Language_dz: String { return self._s[2448]! } - public var Passport_Language_tk: String { return self._s[2449]! } + public var PrivacySettings_Passcode: String { return self._s[2449]! } + public var Call_Mute: String { return self._s[2450]! } + public var Passport_Language_dz: String { return self._s[2451]! } + public var Passport_Language_tk: String { return self._s[2452]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_0]) + return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_0]) } - public var Settings_Search: String { return self._s[2451]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2452]! } - public var Conversation_ContextMenuReply: String { return self._s[2453]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2454]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2455]! } - public var Tour_Title1: String { return self._s[2456]! } - public var Conversation_ClearGroupHistory: String { return self._s[2458]! } - public var WallpaperPreview_Motion: String { return self._s[2459]! } + public var Settings_Search: String { return self._s[2454]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2455]! } + public var Conversation_ContextMenuReply: String { return self._s[2456]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2457]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2458]! } + public var Tour_Title1: String { return self._s[2459]! } + public var Conversation_ClearGroupHistory: String { return self._s[2461]! } + public var WallpaperPreview_Motion: String { return self._s[2462]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2460]!, self._r[2460]!, [_0]) + return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) } - public var Call_RateCall: String { return self._s[2461]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2462]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2463]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2464]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2466]! } + public var Call_RateCall: String { return self._s[2464]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2465]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2466]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2467]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2469]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) + return formatWithArgumentRanges(self._s[2471]!, self._r[2471]!, [_0]) } - public var Compose_Create: String { return self._s[2469]! } - public var Contacts_InviteToTelegram: String { return self._s[2470]! } - public var GroupInfo_Notifications: String { return self._s[2471]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2473]! } - public var Month_GenApril: String { return self._s[2474]! } - public var Appearance_AutoNightTheme: String { return self._s[2475]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2477]! } - public var Login_CodeSentSms: String { return self._s[2479]! } + public var Compose_Create: String { return self._s[2472]! } + public var Contacts_InviteToTelegram: String { return self._s[2473]! } + public var GroupInfo_Notifications: String { return self._s[2474]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2476]! } + public var Month_GenApril: String { return self._s[2477]! } + public var Appearance_AutoNightTheme: String { return self._s[2478]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2480]! } + public var Login_CodeSentSms: String { return self._s[2482]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, [_0]) + return formatWithArgumentRanges(self._s[2483]!, self._r[2483]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2481]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2482]! } - public var Passport_Language_hr: String { return self._s[2483]! } - public var Common_ActionNotAllowedError: String { return self._s[2484]! } + public var EmptyGroupInfo_Line3: String { return self._s[2484]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2485]! } + public var Passport_Language_hr: String { return self._s[2486]! } + public var Common_ActionNotAllowedError: String { return self._s[2487]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2485]!, self._r[2485]!, [_0]) + return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2486]! } - public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2487]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2488]! } - public var Privacy_SecretChatsTitle: String { return self._s[2489]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2491]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2492]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2493]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2494]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2495]! } - public var Preview_DeleteGif: String { return self._s[2496]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2497]! } - public var Group_ErrorNotMutualContact: String { return self._s[2498]! } - public var Notification_MessageLifetime5s: String { return self._s[2499]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2489]! } + public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2490]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2491]! } + public var Privacy_SecretChatsTitle: String { return self._s[2492]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2494]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2495]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2496]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2497]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2498]! } + public var Preview_DeleteGif: String { return self._s[2499]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2500]! } + public var Group_ErrorNotMutualContact: String { return self._s[2501]! } + public var Notification_MessageLifetime5s: String { return self._s[2502]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2500]!, self._r[2500]!, [_0]) + return formatWithArgumentRanges(self._s[2503]!, self._r[2503]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2501]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2503]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2504]! } - public var Passport_Address_AddBankStatement: String { return self._s[2505]! } - public var Notification_CallIncoming: String { return self._s[2506]! } - public var Compose_NewGroupTitle: String { return self._s[2507]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2509]! } - public var Passport_Address_Postcode: String { return self._s[2511]! } + public var VoiceOver_Chat_Video: String { return self._s[2504]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2506]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2507]! } + public var Passport_Address_AddBankStatement: String { return self._s[2508]! } + public var Notification_CallIncoming: String { return self._s[2509]! } + public var Compose_NewGroupTitle: String { return self._s[2510]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2512]! } + public var Passport_Address_Postcode: String { return self._s[2514]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2512]!, self._r[2512]!, [_0]) + return formatWithArgumentRanges(self._s[2515]!, self._r[2515]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2513]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2514]! } - public var WallpaperColors_Title: String { return self._s[2515]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2516]! } - public var VoiceOver_MessageContextForward: String { return self._s[2517]! } - public var GroupPermission_Duration: String { return self._s[2518]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2516]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2517]! } + public var WallpaperColors_Title: String { return self._s[2518]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2519]! } + public var VoiceOver_MessageContextForward: String { return self._s[2520]! } + public var GroupPermission_Duration: String { return self._s[2521]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_0]) + return formatWithArgumentRanges(self._s[2522]!, self._r[2522]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2520]! } - public var Username_Placeholder: String { return self._s[2521]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2522]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2523]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2524]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2523]! } + public var Username_Placeholder: String { return self._s[2524]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2525]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2526]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2527]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2526]!, self._r[2526]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2529]!, self._r[2529]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2527]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2528]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2529]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2530]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2531]! } - public var Conversation_ContextMenuMore: String { return self._s[2532]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2533]! } - public var CallSettings_TabIcon: String { return self._s[2534]! } - public var KeyCommand_Find: String { return self._s[2535]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2536]! } - public var Message_PinnedGame: String { return self._s[2537]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2538]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2540]! } - public var Login_CallRequestState2: String { return self._s[2542]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2544]! } + public var Passport_PasswordDescription: String { return self._s[2530]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2531]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2532]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2533]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2534]! } + public var Conversation_ContextMenuMore: String { return self._s[2535]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2536]! } + public var CallSettings_TabIcon: String { return self._s[2537]! } + public var KeyCommand_Find: String { return self._s[2538]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2539]! } + public var Message_PinnedGame: String { return self._s[2540]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2541]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2543]! } + public var Login_CallRequestState2: String { return self._s[2545]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2547]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2545]!, self._r[2545]!, [_0]) + return formatWithArgumentRanges(self._s[2548]!, self._r[2548]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2547]!, self._r[2547]!, [_0]) - } - public var WallpaperPreview_Blurred: String { return self._s[2548]! } - public var Conversation_InstantPagePreview: String { return self._s[2549]! } - public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2550]!, self._r[2550]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2553]! } - public var WallpaperSearch_ColorRed: String { return self._s[2554]! } - public var GroupPermission_NoPinMessages: String { return self._s[2555]! } - public var Passport_Language_es: String { return self._s[2556]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2558]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2559]! } + public var WallpaperPreview_Blurred: String { return self._s[2551]! } + public var Conversation_InstantPagePreview: String { return self._s[2552]! } + public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) + } + public var SecretTimer_VideoDescription: String { return self._s[2556]! } + public var WallpaperSearch_ColorRed: String { return self._s[2557]! } + public var GroupPermission_NoPinMessages: String { return self._s[2558]! } + public var Passport_Language_es: String { return self._s[2559]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2561]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2562]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2560]!, self._r[2560]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2563]!, self._r[2563]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2561]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2562]! } - public var Watch_UserInfo_Unmute: String { return self._s[2563]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2564]! } - public var AccessDenied_CameraRestricted: String { return self._s[2566]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2564]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2565]! } + public var Watch_UserInfo_Unmute: String { return self._s[2566]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2567]! } + public var AccessDenied_CameraRestricted: String { return self._s[2569]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2567]!, self._r[2567]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2570]!, self._r[2570]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2569]! } - public var Settings_CopyUsername: String { return self._s[2570]! } - public var Contacts_SearchLabel: String { return self._s[2571]! } - public var Map_OpenInYandexNavigator: String { return self._s[2573]! } - public var PasscodeSettings_EncryptData: String { return self._s[2574]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2575]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2576]! } - public var DialogList_AdNoticeAlert: String { return self._s[2577]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2579]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2580]! } - public var Localization_LanguageCustom: String { return self._s[2581]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2582]! } - public var CallFeedback_Title: String { return self._s[2583]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2586]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2587]! } - public var Conversation_InfoGroup: String { return self._s[2588]! } - public var Compose_NewMessage: String { return self._s[2589]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2590]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2591]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2592]! } + public var ChatList_ReadAll: String { return self._s[2572]! } + public var Settings_CopyUsername: String { return self._s[2573]! } + public var Contacts_SearchLabel: String { return self._s[2574]! } + public var Map_OpenInYandexNavigator: String { return self._s[2576]! } + public var PasscodeSettings_EncryptData: String { return self._s[2577]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2578]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2579]! } + public var DialogList_AdNoticeAlert: String { return self._s[2580]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2582]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2583]! } + public var Localization_LanguageCustom: String { return self._s[2584]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2585]! } + public var CallFeedback_Title: String { return self._s[2586]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2589]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2590]! } + public var Conversation_InfoGroup: String { return self._s[2591]! } + public var Compose_NewMessage: String { return self._s[2592]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2593]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2594]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2595]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2593]!, self._r[2593]!, [_0]) + return formatWithArgumentRanges(self._s[2596]!, self._r[2596]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2594]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2595]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2596]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2597]! } - public var Channel_BlackList_Title: String { return self._s[2598]! } - public var UserInfo_PhoneCall: String { return self._s[2599]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2601]! } - public var State_connecting: String { return self._s[2602]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2603]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2597]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2598]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2599]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2600]! } + public var Channel_BlackList_Title: String { return self._s[2601]! } + public var UserInfo_PhoneCall: String { return self._s[2602]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2604]! } + public var State_connecting: String { return self._s[2605]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2606]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2604]!, self._r[2604]!, [_0]) + return formatWithArgumentRanges(self._s[2607]!, self._r[2607]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2605]! } - public var Passport_Identity_EditPassport: String { return self._s[2606]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2608]! } - public var Localization_EnglishLanguageName: String { return self._s[2609]! } - public var Share_AuthDescription: String { return self._s[2610]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2611]! } - public var Passport_Identity_Surname: String { return self._s[2612]! } - public var Compose_TokenListPlaceholder: String { return self._s[2613]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2614]! } - public var Settings_AboutEmpty: String { return self._s[2615]! } - public var Conversation_Unmute: String { return self._s[2616]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2618]! } + public var Notifications_GroupNotifications: String { return self._s[2608]! } + public var Passport_Identity_EditPassport: String { return self._s[2609]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2611]! } + public var Localization_EnglishLanguageName: String { return self._s[2612]! } + public var Share_AuthDescription: String { return self._s[2613]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2614]! } + public var Passport_Identity_Surname: String { return self._s[2615]! } + public var Compose_TokenListPlaceholder: String { return self._s[2616]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2617]! } + public var Settings_AboutEmpty: String { return self._s[2618]! } + public var Conversation_Unmute: String { return self._s[2619]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2621]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_1]) + return formatWithArgumentRanges(self._s[2622]!, self._r[2622]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2620]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2622]! } - public var ChatSettings_Appearance: String { return self._s[2623]! } - public var Appearance_PickAccentColor: String { return self._s[2624]! } + public var Login_CodeSentCall: String { return self._s[2623]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2625]! } + public var ChatSettings_Appearance: String { return self._s[2626]! } + public var Appearance_PickAccentColor: String { return self._s[2627]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2628]!, self._r[2628]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_1]) + return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2627]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2628]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2629]! } - public var ChatAdmins_AdminLabel: String { return self._s[2631]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2632]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2634]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2635]! } - public var Month_GenJune: String { return self._s[2636]! } - public var Watch_Location_Current: String { return self._s[2637]! } - public var Conversation_TitleMute: String { return self._s[2638]! } + public var Notification_CallMissed: String { return self._s[2630]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2631]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2632]! } + public var ChatAdmins_AdminLabel: String { return self._s[2634]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2635]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2637]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2638]! } + public var Month_GenJune: String { return self._s[2639]! } + public var Watch_Location_Current: String { return self._s[2640]! } + public var Conversation_TitleMute: String { return self._s[2641]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_1]) + return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2640]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2643]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2641]!, self._r[2641]!, [_0]) + return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2642]! } - public var Chat_SlowmodeSendError: String { return self._s[2643]! } - public var MaskStickerSettings_Info: String { return self._s[2644]! } + public var Call_ReportPlaceholder: String { return self._s[2645]! } + public var Chat_SlowmodeSendError: String { return self._s[2646]! } + public var MaskStickerSettings_Info: String { return self._s[2647]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_0]) + return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2646]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2648]! } - public var Contacts_ShareTelegram: String { return self._s[2649]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2650]! } - public var Channel_ErrorAccessDenied: String { return self._s[2651]! } - public var UserInfo_ScamBotWarning: String { return self._s[2653]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2654]! } - public var Call_ConnectionErrorTitle: String { return self._s[2655]! } - public var UserInfo_NotificationsEnable: String { return self._s[2656]! } - public var ArchivedChats_IntroText1: String { return self._s[2657]! } - public var Tour_Text4: String { return self._s[2660]! } - public var WallpaperSearch_Recent: String { return self._s[2661]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2662]! } - public var Profile_MessageLifetime2s: String { return self._s[2664]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2665]! } - public var Notification_MessageLifetime2s: String { return self._s[2666]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2649]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2651]! } + public var Contacts_ShareTelegram: String { return self._s[2652]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2653]! } + public var Channel_ErrorAccessDenied: String { return self._s[2654]! } + public var UserInfo_ScamBotWarning: String { return self._s[2656]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2657]! } + public var Call_ConnectionErrorTitle: String { return self._s[2658]! } + public var UserInfo_NotificationsEnable: String { return self._s[2659]! } + public var ArchivedChats_IntroText1: String { return self._s[2660]! } + public var Tour_Text4: String { return self._s[2663]! } + public var WallpaperSearch_Recent: String { return self._s[2664]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2665]! } + public var Profile_MessageLifetime2s: String { return self._s[2667]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2668]! } + public var Notification_MessageLifetime2s: String { return self._s[2669]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2667]!, self._r[2667]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2670]!, self._r[2670]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2668]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2669]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2670]! } + public var Cache_ClearCache: String { return self._s[2671]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2672]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2673]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_0]) + return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2676]!, self._r[2676]!, [_0]) + return formatWithArgumentRanges(self._s[2679]!, self._r[2679]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2677]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2678]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2679]! } - public var ChatList_UnarchiveAction: String { return self._s[2680]! } - public var AutoNightTheme_Title: String { return self._s[2681]! } - public var InstantPage_FeedbackButton: String { return self._s[2682]! } - public var Passport_FieldAddress: String { return self._s[2683]! } + public var LocalGroup_Text: String { return self._s[2680]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2681]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2682]! } + public var ChatList_UnarchiveAction: String { return self._s[2683]! } + public var AutoNightTheme_Title: String { return self._s[2684]! } + public var InstantPage_FeedbackButton: String { return self._s[2685]! } + public var Passport_FieldAddress: String { return self._s[2686]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2684]!, self._r[2684]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2685]! } + public var Month_ShortMarch: String { return self._s[2688]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2686]!, self._r[2686]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2687]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2688]! } - public var Passport_FloodError: String { return self._s[2689]! } - public var SecretGif_Title: String { return self._s[2690]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2691]! } - public var Passport_Language_th: String { return self._s[2693]! } - public var Passport_Address_Address: String { return self._s[2694]! } - public var Login_InvalidLastNameError: String { return self._s[2695]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2696]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2697]! } - public var SettingsSearch_FAQ: String { return self._s[2698]! } - public var ShareMenu_Send: String { return self._s[2699]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2701]! } - public var Month_GenNovember: String { return self._s[2703]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2705]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2690]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2691]! } + public var Passport_FloodError: String { return self._s[2692]! } + public var SecretGif_Title: String { return self._s[2693]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2694]! } + public var Passport_Language_th: String { return self._s[2696]! } + public var Passport_Address_Address: String { return self._s[2697]! } + public var Login_InvalidLastNameError: String { return self._s[2698]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2699]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2700]! } + public var SettingsSearch_FAQ: String { return self._s[2701]! } + public var ShareMenu_Send: String { return self._s[2702]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2704]! } + public var Month_GenNovember: String { return self._s[2706]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2708]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2706]!, self._r[2706]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2709]!, self._r[2709]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2707]! } - public var NotificationsSound_Tritone: String { return self._s[2708]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2710]! } + public var Checkout_Email: String { return self._s[2710]! } + public var NotificationsSound_Tritone: String { return self._s[2711]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2713]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2713]!, self._r[2713]!, [_1]) + return formatWithArgumentRanges(self._s[2716]!, self._r[2716]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2714]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2717]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2715]!, self._r[2715]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2716]! } - public var Notification_Exceptions_Add: String { return self._s[2717]! } - public var DialogList_You: String { return self._s[2718]! } - public var MediaPicker_Send: String { return self._s[2721]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2722]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2723]! } - public var Call_AudioRouteSpeaker: String { return self._s[2724]! } - public var Watch_UserInfo_Title: String { return self._s[2725]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2726]! } - public var Appearance_AccentColor: String { return self._s[2727]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2719]! } + public var Notification_Exceptions_Add: String { return self._s[2720]! } + public var DialogList_You: String { return self._s[2721]! } + public var MediaPicker_Send: String { return self._s[2724]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2725]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2726]! } + public var Call_AudioRouteSpeaker: String { return self._s[2727]! } + public var Watch_UserInfo_Title: String { return self._s[2728]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2729]! } + public var Appearance_AccentColor: String { return self._s[2730]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_0]) + return formatWithArgumentRanges(self._s[2731]!, self._r[2731]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2729]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2732]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2730]!, self._r[2730]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2731]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2732]! } - public var Notification_CallOutgoing: String { return self._s[2733]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2734]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2735]! } - public var Call_RecordingDisabledMessage: String { return self._s[2736]! } - public var Message_Game: String { return self._s[2737]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2738]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2739]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2740]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2741]! } - public var Date_DialogDateFormat: String { return self._s[2742]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2743]! } - public var Notifications_InAppNotifications: String { return self._s[2744]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2734]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2735]! } + public var Notification_CallOutgoing: String { return self._s[2736]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2737]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2738]! } + public var Call_RecordingDisabledMessage: String { return self._s[2739]! } + public var Message_Game: String { return self._s[2740]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2741]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2742]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2743]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2744]! } + public var Date_DialogDateFormat: String { return self._s[2745]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2746]! } + public var Notifications_InAppNotifications: String { return self._s[2747]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2745]!, self._r[2745]!, [_0]) - } - public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2746]!, self._r[2746]!, [_1, _2]) - } - public var NewContact_Title: String { return self._s[2747]! } - public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2748]!, self._r[2748]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2749]! } + public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2749]!, self._r[2749]!, [_1, _2]) + } + public var NewContact_Title: String { return self._s[2750]! } + public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_0]) + } + public var Conversation_ViewContactDetails: String { return self._s[2752]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_1]) + return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2752]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2753]! } - public var PrivacySettings_Title: String { return self._s[2754]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2757]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2758]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2759]! } - public var Contacts_PhoneNumber: String { return self._s[2760]! } - public var Map_ShowPlaces: String { return self._s[2762]! } - public var ChatAdmins_Title: String { return self._s[2763]! } - public var InstantPage_Reference: String { return self._s[2765]! } - public var ReportGroupLocation_Text: String { return self._s[2766]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2755]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2756]! } + public var PrivacySettings_Title: String { return self._s[2757]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2760]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2761]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2762]! } + public var Contacts_PhoneNumber: String { return self._s[2763]! } + public var Map_ShowPlaces: String { return self._s[2765]! } + public var ChatAdmins_Title: String { return self._s[2766]! } + public var InstantPage_Reference: String { return self._s[2768]! } + public var ReportGroupLocation_Text: String { return self._s[2769]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2767]!, self._r[2767]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2770]!, self._r[2770]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2768]! } - public var Watch_UserInfo_Block: String { return self._s[2769]! } - public var ChatSettings_Stickers: String { return self._s[2770]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2771]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2772]! } + public var Camera_FlashOff: String { return self._s[2771]! } + public var Watch_UserInfo_Block: String { return self._s[2772]! } + public var ChatSettings_Stickers: String { return self._s[2773]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2774]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2775]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_0]) + return formatWithArgumentRanges(self._s[2776]!, self._r[2776]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2774]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2775]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2776]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2777]! } - public var VoiceOver_MessageContextShare: String { return self._s[2778]! } + public var Settings_ViewPhoto: String { return self._s[2777]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2778]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2779]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2780]! } + public var VoiceOver_MessageContextShare: String { return self._s[2781]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2780]!, self._r[2780]!, [_0]) - } - public var Privacy_DeleteDrafts: String { return self._s[2781]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2782]! } - public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2783]!, self._r[2783]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2784]! } - public var DialogList_SavedMessages: String { return self._s[2785]! } - public var GroupInfo_UpgradeButton: String { return self._s[2786]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2788]! } - public var DialogList_Pin: String { return self._s[2789]! } + public var Privacy_DeleteDrafts: String { return self._s[2784]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2785]! } + public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_0]) + } + public var DialogList_SavedMessagesHelp: String { return self._s[2787]! } + public var DialogList_SavedMessages: String { return self._s[2788]! } + public var GroupInfo_UpgradeButton: String { return self._s[2789]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2791]! } + public var DialogList_Pin: String { return self._s[2792]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2791]!, self._r[2791]!, [_0]) + return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2792]! } - public var UserInfo_NotificationsDisable: String { return self._s[2793]! } - public var Paint_Outlined: String { return self._s[2794]! } - public var Activity_PlayingGame: String { return self._s[2795]! } - public var SearchImages_NoImagesFound: String { return self._s[2796]! } - public var SocksProxySetup_ProxyType: String { return self._s[2797]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2799]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2800]! } - public var Settings_AppLanguage: String { return self._s[2801]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2802]! } - public var Common_ChoosePhoto: String { return self._s[2803]! } - public var CallFeedback_ReasonEcho: String { return self._s[2804]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2795]! } + public var UserInfo_NotificationsDisable: String { return self._s[2796]! } + public var Paint_Outlined: String { return self._s[2797]! } + public var Activity_PlayingGame: String { return self._s[2798]! } + public var SearchImages_NoImagesFound: String { return self._s[2799]! } + public var SocksProxySetup_ProxyType: String { return self._s[2800]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2802]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2803]! } + public var Settings_AppLanguage: String { return self._s[2804]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2805]! } + public var Common_ChoosePhoto: String { return self._s[2806]! } + public var CallFeedback_ReasonEcho: String { return self._s[2807]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2805]!, self._r[2805]!, [_1]) + return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2806]! } - public var Activity_UploadingVideo: String { return self._s[2807]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2808]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2809]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2810]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2811]! } - public var Checkout_PayWithTouchId: String { return self._s[2812]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2813]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2809]! } + public var Activity_UploadingVideo: String { return self._s[2810]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2811]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2812]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2813]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2814]! } + public var Checkout_PayWithTouchId: String { return self._s[2815]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2816]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2815]!, self._r[2815]!, [_1]) - } - public var Notifications_ExceptionsNone: String { return self._s[2816]! } - public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2817]!, self._r[2817]!, [_0]) - } - public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2818]!, self._r[2818]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2820]! } - public var Passport_Address_Region: String { return self._s[2823]! } - public var ChatList_DeleteChat: String { return self._s[2824]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2825]! } - public var PhotoEditor_TiltShift: String { return self._s[2826]! } - public var Settings_FAQ_URL: String { return self._s[2827]! } - public var Passport_Language_sl: String { return self._s[2828]! } - public var Settings_PrivacySettings: String { return self._s[2830]! } - public var SharedMedia_TitleLink: String { return self._s[2831]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2832]! } - public var Settings_SetProfilePhoto: String { return self._s[2833]! } - public var Channel_About_Help: String { return self._s[2834]! } - public var Contacts_PermissionsEnable: String { return self._s[2835]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2836]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2837]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2839]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2840]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2841]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2842]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2843]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2845]! } - public var Map_OpenInYandexMaps: String { return self._s[2847]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2848]! } - public var VoiceOver_MessageContextReply: String { return self._s[2849]! } - public var PhotoEditor_SaturationTool: String { return self._s[2850]! } + public var Notifications_ExceptionsNone: String { return self._s[2819]! } + public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_0]) + } + public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2821]!, self._r[2821]!, [_1]) + } + public var AuthSessions_IncompleteAttempts: String { return self._s[2823]! } + public var Passport_Address_Region: String { return self._s[2826]! } + public var ChatList_DeleteChat: String { return self._s[2827]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2828]! } + public var PhotoEditor_TiltShift: String { return self._s[2829]! } + public var Settings_FAQ_URL: String { return self._s[2830]! } + public var Passport_Language_sl: String { return self._s[2831]! } + public var Settings_PrivacySettings: String { return self._s[2833]! } + public var SharedMedia_TitleLink: String { return self._s[2834]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2835]! } + public var Settings_SetProfilePhoto: String { return self._s[2836]! } + public var Channel_About_Help: String { return self._s[2837]! } + public var Contacts_PermissionsEnable: String { return self._s[2838]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2839]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2840]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2842]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2843]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2844]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2845]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2846]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2848]! } + public var Map_OpenInYandexMaps: String { return self._s[2850]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2851]! } + public var VoiceOver_MessageContextReply: String { return self._s[2852]! } + public var PhotoEditor_SaturationTool: String { return self._s[2853]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2851]!, self._r[2851]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2852]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2853]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2854]! } - public var Appearance_TextSize: String { return self._s[2855]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2855]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2856]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2857]! } + public var Appearance_TextSize: String { return self._s[2858]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2857]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2859]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2860]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2862]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2860]!, self._r[2860]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2863]!, self._r[2863]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2861]!, self._r[2861]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2864]!, self._r[2864]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2862]! } - public var Passport_PassportInformation: String { return self._s[2865]! } - public var WatchRemote_AlertTitle: String { return self._s[2866]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2867]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2869]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2865]! } + public var Passport_PassportInformation: String { return self._s[2868]! } + public var WatchRemote_AlertTitle: String { return self._s[2869]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2870]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2872]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2870]!, self._r[2870]!, [_0]) + return formatWithArgumentRanges(self._s[2873]!, self._r[2873]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2871]!, self._r[2871]!, [_1]) + return formatWithArgumentRanges(self._s[2874]!, self._r[2874]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2872]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2874]! } - public var AccessDenied_CameraDisabled: String { return self._s[2875]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2875]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2877]! } + public var AccessDenied_CameraDisabled: String { return self._s[2878]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2879]! } + public var PhotoEditor_ContrastTool: String { return self._s[2882]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1]) + return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_1]) } - public var DialogList_Draft: String { return self._s[2881]! } - public var Privacy_TopPeersDelete: String { return self._s[2883]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2884]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2885]! } - public var WebSearch_RecentSectionClear: String { return self._s[2886]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2888]! } - public var Common_Done: String { return self._s[2890]! } - public var AuthSessions_EmptyText: String { return self._s[2891]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2892]! } - public var Tour_Title5: String { return self._s[2893]! } + public var DialogList_Draft: String { return self._s[2884]! } + public var Privacy_TopPeersDelete: String { return self._s[2886]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2887]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2888]! } + public var WebSearch_RecentSectionClear: String { return self._s[2889]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2891]! } + public var Common_Done: String { return self._s[2893]! } + public var AuthSessions_EmptyText: String { return self._s[2894]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2895]! } + public var Tour_Title5: String { return self._s[2896]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2894]!, self._r[2894]!, [_0]) + return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2895]! } - public var Conversation_LinkDialogSave: String { return self._s[2896]! } - public var GroupInfo_ActionRestrict: String { return self._s[2897]! } - public var Checkout_Title: String { return self._s[2898]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2900]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2902]! } - public var Notification_RenamedGroup: String { return self._s[2903]! } - public var PeopleNearby_Groups: String { return self._s[2904]! } - public var Checkout_PayWithFaceId: String { return self._s[2905]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2906]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2908]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2909]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2910]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2898]! } + public var Conversation_LinkDialogSave: String { return self._s[2899]! } + public var GroupInfo_ActionRestrict: String { return self._s[2900]! } + public var Checkout_Title: String { return self._s[2901]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2903]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2905]! } + public var Notification_RenamedGroup: String { return self._s[2906]! } + public var PeopleNearby_Groups: String { return self._s[2907]! } + public var Checkout_PayWithFaceId: String { return self._s[2908]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2909]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2911]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2912]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2913]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2911]!, self._r[2911]!, [_0]) + return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2913]! } + public var Profile_AddToExisting: String { return self._s[2916]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2917]!, self._r[2917]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2916]! } - public var Permissions_PrivacyPolicy: String { return self._s[2917]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2918]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2919]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2921]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2923]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2924]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2925]! } - public var VoiceOver_AttachMedia: String { return self._s[2927]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2928]! } + public var Cache_Files: String { return self._s[2919]! } + public var Permissions_PrivacyPolicy: String { return self._s[2920]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2921]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2922]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2924]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2926]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2927]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2928]! } + public var VoiceOver_AttachMedia: String { return self._s[2930]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2931]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2929]!, self._r[2929]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2932]!, self._r[2932]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2930]! } - public var Conversation_SetReminder_Title: String { return self._s[2931]! } - public var Passport_FieldAddressHelp: String { return self._s[2932]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2933]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2933]! } + public var Conversation_SetReminder_Title: String { return self._s[2934]! } + public var Passport_FieldAddressHelp: String { return self._s[2935]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2936]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2934]!, self._r[2934]!, [_0]) + return formatWithArgumentRanges(self._s[2937]!, self._r[2937]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2935]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2937]! } - public var Login_UnknownError: String { return self._s[2938]! } - public var Group_UpgradeNoticeText2: String { return self._s[2940]! } - public var Watch_Compose_AddContact: String { return self._s[2941]! } - public var Web_Error: String { return self._s[2942]! } - public var Gif_Search: String { return self._s[2943]! } - public var Profile_MessageLifetime1h: String { return self._s[2944]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2945]! } - public var Channel_Username_CheckingUsername: String { return self._s[2946]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2947]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2948]! } - public var Channel_AboutItem: String { return self._s[2949]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2951]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2952]! } - public var GroupInfo_SharedMedia: String { return self._s[2953]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2938]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2940]! } + public var Login_UnknownError: String { return self._s[2941]! } + public var Group_UpgradeNoticeText2: String { return self._s[2943]! } + public var Watch_Compose_AddContact: String { return self._s[2944]! } + public var Web_Error: String { return self._s[2945]! } + public var Gif_Search: String { return self._s[2946]! } + public var Profile_MessageLifetime1h: String { return self._s[2947]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2948]! } + public var Channel_Username_CheckingUsername: String { return self._s[2949]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2950]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2951]! } + public var Channel_AboutItem: String { return self._s[2952]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2954]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2955]! } + public var GroupInfo_SharedMedia: String { return self._s[2956]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2954]!, self._r[2954]!, [_1]) + return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2955]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2958]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2956]!, self._r[2956]!, [_1]) + return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2957]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2958]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2959]! } - public var CreatePoll_AddOption: String { return self._s[2960]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2961]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2962]! } - public var Channel_Management_AddModerator: String { return self._s[2963]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2964]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2965]! } - public var NotificationsSound_Hello: String { return self._s[2966]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2967]! } - public var Channel_Stickers_Placeholder: String { return self._s[2969]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2960]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2961]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2962]! } + public var CreatePoll_AddOption: String { return self._s[2963]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2964]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2965]! } + public var Channel_Management_AddModerator: String { return self._s[2966]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2967]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2968]! } + public var NotificationsSound_Hello: String { return self._s[2969]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2970]! } + public var Channel_Stickers_Placeholder: String { return self._s[2972]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2970]!, self._r[2970]!, [_0]) + return formatWithArgumentRanges(self._s[2973]!, self._r[2973]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2971]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2972]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2973]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2974]! } - public var AutoDownloadSettings_Channels: String { return self._s[2975]! } - public var Passport_Language_mn: String { return self._s[2976]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2979]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2980]! } - public var Passport_Language_ja: String { return self._s[2982]! } - public var Settings_About_Title: String { return self._s[2983]! } - public var Settings_NotificationsAndSounds: String { return self._s[2984]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2985]! } - public var Settings_BlockedUsers: String { return self._s[2986]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2974]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2975]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2976]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2977]! } + public var AutoDownloadSettings_Channels: String { return self._s[2978]! } + public var Passport_Language_mn: String { return self._s[2979]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2982]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2983]! } + public var Passport_Language_ja: String { return self._s[2985]! } + public var Settings_About_Title: String { return self._s[2986]! } + public var Settings_NotificationsAndSounds: String { return self._s[2987]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2988]! } + public var Settings_BlockedUsers: String { return self._s[2989]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2987]!, self._r[2987]!, [_0]) + return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2988]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2989]! } - public var Channel_Username_Title: String { return self._s[2990]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2991]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2992]! } + public var Channel_Username_Title: String { return self._s[2993]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) + return formatWithArgumentRanges(self._s[2994]!, self._r[2994]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[2993]! } - public var AppleWatch_Title: String { return self._s[2994]! } - public var Activity_RecordingVideoMessage: String { return self._s[2995]! } + public var AttachmentMenu_File: String { return self._s[2996]! } + public var AppleWatch_Title: String { return self._s[2997]! } + public var Activity_RecordingVideoMessage: String { return self._s[2998]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2996]!, self._r[2996]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[2997]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[2998]! } - public var Profile_CreateEncryptedChatError: String { return self._s[2999]! } - public var Common_Next: String { return self._s[3001]! } - public var Channel_Stickers_YourStickers: String { return self._s[3003]! } - public var Call_AudioRouteHeadphones: String { return self._s[3004]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3006]! } - public var Watch_Contacts_NoResults: String { return self._s[3008]! } - public var PhotoEditor_TintTool: String { return self._s[3011]! } - public var LoginPassword_ResetAccount: String { return self._s[3013]! } - public var Settings_SavedMessages: String { return self._s[3014]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3015]! } - public var Bot_GenericSupportStatus: String { return self._s[3016]! } - public var StickerPack_Add: String { return self._s[3017]! } - public var Checkout_TotalAmount: String { return self._s[3018]! } - public var Your_cards_number_is_invalid: String { return self._s[3019]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3020]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3021]! } + public var Weekday_Saturday: String { return self._s[3000]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3001]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3002]! } + public var Common_Next: String { return self._s[3004]! } + public var Channel_Stickers_YourStickers: String { return self._s[3006]! } + public var Call_AudioRouteHeadphones: String { return self._s[3007]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3009]! } + public var Watch_Contacts_NoResults: String { return self._s[3011]! } + public var PhotoEditor_TintTool: String { return self._s[3014]! } + public var LoginPassword_ResetAccount: String { return self._s[3016]! } + public var Settings_SavedMessages: String { return self._s[3017]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3018]! } + public var Bot_GenericSupportStatus: String { return self._s[3019]! } + public var StickerPack_Add: String { return self._s[3020]! } + public var Checkout_TotalAmount: String { return self._s[3021]! } + public var Your_cards_number_is_invalid: String { return self._s[3022]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3023]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3024]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_0]) + return formatWithArgumentRanges(self._s[3025]!, self._r[3025]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_1, _2]) - } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3024]! } - public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3026]!, self._r[3026]!, [_1, _2]) } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3027]! } + public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3029]!, self._r[3029]!, [_1, _2]) + } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3027]!, self._r[3027]!, [_0]) + return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3028]! } - public var StickerPack_Share: String { return self._s[3029]! } - public var Passport_DeleteAddress: String { return self._s[3030]! } - public var Settings_Passport: String { return self._s[3031]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3032]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3033]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3034]! } - public var Contacts_PermissionsText: String { return self._s[3035]! } - public var Group_Setup_HistoryVisible: String { return self._s[3036]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3038]! } - public var SocksProxySetup_Title: String { return self._s[3039]! } - public var Notification_Mute1h: String { return self._s[3040]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3031]! } + public var StickerPack_Share: String { return self._s[3032]! } + public var Passport_DeleteAddress: String { return self._s[3033]! } + public var Settings_Passport: String { return self._s[3034]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3035]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3036]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3037]! } + public var Contacts_PermissionsText: String { return self._s[3038]! } + public var Group_Setup_HistoryVisible: String { return self._s[3039]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3041]! } + public var SocksProxySetup_Title: String { return self._s[3042]! } + public var Notification_Mute1h: String { return self._s[3043]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3041]!, self._r[3041]!, [_0]) + return formatWithArgumentRanges(self._s[3044]!, self._r[3044]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3042]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3045]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3043]!, self._r[3043]!, [_1]) + return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3044]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3047]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3049]! } - public var DialogList_NoMessagesText: String { return self._s[3050]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3051]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3052]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3054]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3055]! } - public var Common_TakePhotoOrVideo: String { return self._s[3056]! } - public var Call_StatusBusy: String { return self._s[3057]! } - public var Conversation_PinnedMessage: String { return self._s[3058]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3059]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3060]! } - public var Undo_ChatCleared: String { return self._s[3061]! } - public var AppleWatch_ReplyPresets: String { return self._s[3062]! } - public var Passport_DiscardMessageDescription: String { return self._s[3064]! } - public var Login_NetworkError: String { return self._s[3065]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3047]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3050]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3052]! } + public var DialogList_NoMessagesText: String { return self._s[3053]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3054]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3055]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3057]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3058]! } + public var Common_TakePhotoOrVideo: String { return self._s[3059]! } + public var Call_StatusBusy: String { return self._s[3060]! } + public var Conversation_PinnedMessage: String { return self._s[3061]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3062]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3063]! } + public var Undo_ChatCleared: String { return self._s[3064]! } + public var AppleWatch_ReplyPresets: String { return self._s[3065]! } + public var Passport_DiscardMessageDescription: String { return self._s[3067]! } + public var Login_NetworkError: String { return self._s[3068]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3066]!, self._r[3066]!, [_0]) + return formatWithArgumentRanges(self._s[3069]!, self._r[3069]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3067]!, self._r[3067]!, [_0]) + return formatWithArgumentRanges(self._s[3070]!, self._r[3070]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3068]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3070]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3071]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3073]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3072]!, self._r[3072]!, [_0]) + return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3073]! } - public var VoiceOver_Chat_Music: String { return self._s[3074]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3075]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3077]! } - public var ConversationMedia_Title: String { return self._s[3078]! } - public var EncryptionKey_Title: String { return self._s[3080]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3081]! } - public var Notification_Exceptions_AddException: String { return self._s[3082]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3083]! } - public var Profile_MessageLifetime1m: String { return self._s[3084]! } + public var Call_ConnectionErrorMessage: String { return self._s[3076]! } + public var VoiceOver_Chat_Music: String { return self._s[3077]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3078]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3080]! } + public var ConversationMedia_Title: String { return self._s[3081]! } + public var EncryptionKey_Title: String { return self._s[3083]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3084]! } + public var Notification_Exceptions_AddException: String { return self._s[3085]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3086]! } + public var Profile_MessageLifetime1m: String { return self._s[3087]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3085]!, self._r[3085]!, [_1]) + return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_1]) } - public var Month_GenMay: String { return self._s[3086]! } + public var Month_GenMay: String { return self._s[3089]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3087]!, self._r[3087]!, [_0]) + return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3088]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3089]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3090]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3092]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3093]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3094]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3095]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3096]! } - public var Channel_JoinChannel: String { return self._s[3098]! } - public var Appearance_Animations: String { return self._s[3101]! } + public var PeopleNearby_Users: String { return self._s[3091]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3092]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3093]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3095]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3096]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3097]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3098]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3099]! } + public var Channel_JoinChannel: String { return self._s[3101]! } + public var Appearance_Animations: String { return self._s[3104]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3102]!, self._r[3102]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3105]!, self._r[3105]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3104]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3106]! } - public var Passport_Address_Street: String { return self._s[3107]! } - public var Conversation_AddContact: String { return self._s[3108]! } - public var Login_PhonePlaceholder: String { return self._s[3109]! } - public var Channel_Members_InviteLink: String { return self._s[3111]! } - public var Bot_Stop: String { return self._s[3112]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3114]! } - public var Notification_PassportValueAddress: String { return self._s[3115]! } - public var Month_ShortJuly: String { return self._s[3116]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3117]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3118]! } - public var Passport_Identity_ReverseSide: String { return self._s[3119]! } - public var Watch_Stickers_Recents: String { return self._s[3122]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3124]! } - public var Map_SendThisLocation: String { return self._s[3125]! } + public var Stickers_GroupStickers: String { return self._s[3107]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3109]! } + public var Passport_Address_Street: String { return self._s[3110]! } + public var Conversation_AddContact: String { return self._s[3111]! } + public var Login_PhonePlaceholder: String { return self._s[3112]! } + public var Channel_Members_InviteLink: String { return self._s[3114]! } + public var Bot_Stop: String { return self._s[3115]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3117]! } + public var Notification_PassportValueAddress: String { return self._s[3118]! } + public var Month_ShortJuly: String { return self._s[3119]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3120]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3121]! } + public var Passport_Identity_ReverseSide: String { return self._s[3122]! } + public var Watch_Stickers_Recents: String { return self._s[3125]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3127]! } + public var Map_SendThisLocation: String { return self._s[3128]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3127]!, self._r[3127]!, [_0]) - } - public var ConvertToSupergroup_Note: String { return self._s[3128]! } - public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3129]!, self._r[3129]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3130]! } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3131]! } + public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_0]) + } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3133]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3131]!, self._r[3131]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3133]! } - public var Wallpaper_SearchShort: String { return self._s[3134]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3136]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3137]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3138]! } + public var Login_CallRequestState3: String { return self._s[3136]! } + public var Wallpaper_SearchShort: String { return self._s[3137]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3139]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3140]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3141]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3142]!, self._r[3142]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3140]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3142]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3145]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3143]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3145]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3148]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_0]) - } - public var Passport_CorrectErrors: String { return self._s[3147]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3148]! } - public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3150]! } - public var Channel_DiscussionGroup: String { return self._s[3151]! } + public var Passport_CorrectErrors: String { return self._s[3150]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3151]! } + public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) + } + public var Map_SendMyCurrentLocation: String { return self._s[3153]! } + public var Channel_DiscussionGroup: String { return self._s[3154]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3153]! } - public var Permissions_NotificationsText_v0: String { return self._s[3154]! } - public var Appearance_AppIcon: String { return self._s[3155]! } - public var LoginPassword_FloodError: String { return self._s[3156]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3158]! } + public var SharedMedia_SearchNoResults: String { return self._s[3156]! } + public var Permissions_NotificationsText_v0: String { return self._s[3157]! } + public var Appearance_AppIcon: String { return self._s[3158]! } + public var LoginPassword_FloodError: String { return self._s[3159]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3161]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3160]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_0]) - } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_0]) } + public var Passport_Language_bn: String { return self._s[3163]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_0]) + } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3165]!, self._r[3165]!, [_0]) + } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3163]!, self._r[3163]!, [_0]) + return formatWithArgumentRanges(self._s[3166]!, self._r[3166]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3166]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3168]! } - public var Contacts_PermissionsAllow: String { return self._s[3169]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3170]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3171]! } - public var WallpaperPreview_Pattern: String { return self._s[3172]! } - public var Paint_Duplicate: String { return self._s[3173]! } - public var Passport_Address_Country: String { return self._s[3174]! } - public var Notification_RenamedChannel: String { return self._s[3176]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3177]! } - public var Group_MessagePhotoUpdated: String { return self._s[3178]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3179]! } - public var Conversation_ContextMenuBan: String { return self._s[3180]! } - public var TwoStepAuth_EmailSent: String { return self._s[3181]! } - public var MessagePoll_NoVotes: String { return self._s[3182]! } - public var Passport_Language_is: String { return self._s[3183]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3185]! } - public var Tour_Text5: String { return self._s[3186]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3169]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3171]! } + public var Contacts_PermissionsAllow: String { return self._s[3172]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3173]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3174]! } + public var WallpaperPreview_Pattern: String { return self._s[3175]! } + public var Paint_Duplicate: String { return self._s[3176]! } + public var Passport_Address_Country: String { return self._s[3177]! } + public var Notification_RenamedChannel: String { return self._s[3179]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3180]! } + public var Group_MessagePhotoUpdated: String { return self._s[3181]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3182]! } + public var Conversation_ContextMenuBan: String { return self._s[3183]! } + public var TwoStepAuth_EmailSent: String { return self._s[3184]! } + public var MessagePoll_NoVotes: String { return self._s[3185]! } + public var Passport_Language_is: String { return self._s[3186]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3188]! } + public var Tour_Text5: String { return self._s[3189]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3191]!, self._r[3191]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3189]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3190]! } + public var Undo_SecretChatDeleted: String { return self._s[3192]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3193]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3191]!, self._r[3191]!, [_0]) + return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3192]! } - public var Paint_Edit: String { return self._s[3194]! } - public var Undo_DeletedGroup: String { return self._s[3197]! } - public var LoginPassword_ForgotPassword: String { return self._s[3198]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3199]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3195]! } + public var Paint_Edit: String { return self._s[3197]! } + public var Undo_DeletedGroup: String { return self._s[3200]! } + public var LoginPassword_ForgotPassword: String { return self._s[3201]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3202]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3200]!, self._r[3200]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3203]!, self._r[3203]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3201]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3202]! } - public var Passport_Language_uz: String { return self._s[3203]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3204]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3205]! } - public var Map_StopLiveLocation: String { return self._s[3207]! } - public var VoiceOver_MessageContextSend: String { return self._s[3209]! } - public var PasscodeSettings_Help: String { return self._s[3210]! } - public var NotificationsSound_Input: String { return self._s[3211]! } - public var Share_Title: String { return self._s[3214]! } - public var LogoutOptions_Title: String { return self._s[3215]! } - public var Login_TermsOfServiceAgree: String { return self._s[3216]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3217]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3218]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3219]! } - public var EnterPasscode_EnterTitle: String { return self._s[3220]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3204]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3205]! } + public var Passport_Language_uz: String { return self._s[3206]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3207]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3208]! } + public var Map_StopLiveLocation: String { return self._s[3210]! } + public var VoiceOver_MessageContextSend: String { return self._s[3212]! } + public var PasscodeSettings_Help: String { return self._s[3213]! } + public var NotificationsSound_Input: String { return self._s[3214]! } + public var Share_Title: String { return self._s[3217]! } + public var LogoutOptions_Title: String { return self._s[3218]! } + public var Login_TermsOfServiceAgree: String { return self._s[3219]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3220]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3221]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3222]! } + public var EnterPasscode_EnterTitle: String { return self._s[3223]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3221]!, self._r[3221]!, [_0]) - } - public var Settings_CopyPhoneNumber: String { return self._s[3222]! } - public var Conversation_AddToContacts: String { return self._s[3223]! } - public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3224]!, self._r[3224]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3225]! } - public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3226]!, self._r[3226]!, [_0]) + public var Settings_CopyPhoneNumber: String { return self._s[3225]! } + public var Conversation_AddToContacts: String { return self._s[3226]! } + public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3227]! } - public var Message_Video: String { return self._s[3228]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3229]! } + public var NotificationsSound_Keys: String { return self._s[3228]! } + public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_0]) + } + public var Notification_MessageLifetime1w: String { return self._s[3230]! } + public var Message_Video: String { return self._s[3231]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3232]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_1]) + return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_0]) + return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3234]!, self._r[3234]!, [_0]) + return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3235]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3236]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3238]! } - public var PrivacyPolicy_Decline: String { return self._s[3239]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3240]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3241]! } - public var Permissions_SiriAllow_v0: String { return self._s[3243]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3244]! } + public var Passport_Language_mk: String { return self._s[3238]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3239]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3241]! } + public var PrivacyPolicy_Decline: String { return self._s[3242]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3243]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3244]! } + public var Permissions_SiriAllow_v0: String { return self._s[3246]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3247]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3245]!, self._r[3245]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_0]) + return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) } - public var Paint_Regular: String { return self._s[3247]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3248]! } - public var SocksProxySetup_ShareLink: String { return self._s[3249]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3250]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3252]! } - public var GroupInfo_InviteByLink: String { return self._s[3253]! } - public var MessageTimer_Custom: String { return self._s[3254]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3255]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3257]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3258]! } - public var VoiceOver_Chat_Selected: String { return self._s[3259]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3260]! } - public var Channel_Username_InvalidTaken: String { return self._s[3261]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3262]! } - public var Settings_ChatBackground: String { return self._s[3263]! } - public var Channel_Subscribers_Title: String { return self._s[3264]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3265]! } - public var Watch_ConnectionDescription: String { return self._s[3266]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3270]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3271]! } - public var EditProfile_Title: String { return self._s[3272]! } - public var NotificationsSound_Bamboo: String { return self._s[3274]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3276]! } - public var Login_SmsRequestState2: String { return self._s[3277]! } - public var Passport_Language_ar: String { return self._s[3278]! } + public var Paint_Regular: String { return self._s[3250]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3251]! } + public var SocksProxySetup_ShareLink: String { return self._s[3252]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3253]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3255]! } + public var GroupInfo_InviteByLink: String { return self._s[3256]! } + public var MessageTimer_Custom: String { return self._s[3257]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3258]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3260]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3261]! } + public var VoiceOver_Chat_Selected: String { return self._s[3262]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3263]! } + public var Channel_Username_InvalidTaken: String { return self._s[3264]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3265]! } + public var Settings_ChatBackground: String { return self._s[3266]! } + public var Channel_Subscribers_Title: String { return self._s[3267]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3268]! } + public var Watch_ConnectionDescription: String { return self._s[3269]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3273]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3274]! } + public var EditProfile_Title: String { return self._s[3275]! } + public var NotificationsSound_Bamboo: String { return self._s[3277]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3279]! } + public var Login_SmsRequestState2: String { return self._s[3280]! } + public var Passport_Language_ar: String { return self._s[3281]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3279]!, self._r[3279]!, [_0]) + return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3280]! } - public var Conversation_MessageDialogEdit: String { return self._s[3281]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3282]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3283]! } + public var Conversation_MessageDialogEdit: String { return self._s[3284]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3285]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3283]!, self._r[3283]!, [_1]) + return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_1]) } - public var Common_Close: String { return self._s[3284]! } - public var GroupInfo_PublicLink: String { return self._s[3285]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3286]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3287]! } + public var Common_Close: String { return self._s[3287]! } + public var GroupInfo_PublicLink: String { return self._s[3288]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3289]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3290]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3291]!, self._r[3291]!, [_0]) + return formatWithArgumentRanges(self._s[3294]!, self._r[3294]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3292]! } + public var UserInfo_About_Placeholder: String { return self._s[3295]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3293]!, self._r[3293]!, [_0]) + return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3294]! } - public var Channel_Info_Banned: String { return self._s[3296]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3297]! } + public var Channel_Info_Banned: String { return self._s[3299]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3297]!, self._r[3297]!, [_0]) + return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_0]) } - public var Appearance_Other: String { return self._s[3298]! } - public var Passport_Language_my: String { return self._s[3299]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3300]! } + public var Appearance_Other: String { return self._s[3301]! } + public var Passport_Language_my: String { return self._s[3302]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3303]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3301]!, self._r[3301]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3302]! } - public var Preview_CopyAddress: String { return self._s[3303]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3305]! } + public var Preview_CopyAddress: String { return self._s[3306]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_0]) + return formatWithArgumentRanges(self._s[3307]!, self._r[3307]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3305]! } - public var UserInfo_BotSettings: String { return self._s[3306]! } - public var LiveLocation_MenuStopAll: String { return self._s[3308]! } - public var Passport_PasswordCreate: String { return self._s[3309]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3310]! } - public var Message_PinnedLocationMessage: String { return self._s[3311]! } - public var Map_Satellite: String { return self._s[3312]! } - public var Watch_Message_Unsupported: String { return self._s[3313]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3314]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3315]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3308]! } + public var UserInfo_BotSettings: String { return self._s[3309]! } + public var LiveLocation_MenuStopAll: String { return self._s[3311]! } + public var Passport_PasswordCreate: String { return self._s[3312]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3313]! } + public var Message_PinnedLocationMessage: String { return self._s[3314]! } + public var Map_Satellite: String { return self._s[3315]! } + public var Watch_Message_Unsupported: String { return self._s[3316]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3317]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3318]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3319]!, self._r[3319]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3317]!, self._r[3317]!, [_0]) + return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3318]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3319]! } - public var NotificationsSound_None: String { return self._s[3320]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3322]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3323]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3321]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3322]! } + public var NotificationsSound_None: String { return self._s[3323]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3325]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3326]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_1]) + return formatWithArgumentRanges(self._s[3327]!, self._r[3327]!, [_1]) } - public var Cache_Indexing: String { return self._s[3325]! } - public var DialogList_RecentTitlePeople: String { return self._s[3327]! } - public var DialogList_EncryptionRejected: String { return self._s[3328]! } - public var GroupInfo_Administrators: String { return self._s[3329]! } - public var Passport_ScanPassportHelp: String { return self._s[3330]! } - public var Application_Name: String { return self._s[3331]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3332]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3334]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3335]! } + public var Cache_Indexing: String { return self._s[3328]! } + public var DialogList_RecentTitlePeople: String { return self._s[3330]! } + public var DialogList_EncryptionRejected: String { return self._s[3331]! } + public var GroupInfo_Administrators: String { return self._s[3332]! } + public var Passport_ScanPassportHelp: String { return self._s[3333]! } + public var Application_Name: String { return self._s[3334]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3335]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3337]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3338]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3336]!, self._r[3336]!, [_0]) + return formatWithArgumentRanges(self._s[3339]!, self._r[3339]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3337]!, self._r[3337]!, [_0]) + return formatWithArgumentRanges(self._s[3340]!, self._r[3340]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3338]!, self._r[3338]!, [_0]) + return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3339]! } - public var Privacy_ChatsTitle: String { return self._s[3340]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3341]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3342]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3343]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3344]! } - public var Group_LinkedChannel: String { return self._s[3345]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3346]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3347]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3348]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3349]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3351]! } - public var Channel_Setup_TypePublic: String { return self._s[3353]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3342]! } + public var Privacy_ChatsTitle: String { return self._s[3343]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3344]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3345]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3346]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3347]! } + public var Group_LinkedChannel: String { return self._s[3348]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3349]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3350]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3351]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3352]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3354]! } + public var Channel_Setup_TypePublic: String { return self._s[3356]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_0]) + return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3356]! } - public var Map_OpenInMaps: String { return self._s[3358]! } + public var Channel_TypeSetup_Title: String { return self._s[3359]! } + public var Map_OpenInMaps: String { return self._s[3361]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_1]) + return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3361]! } + public var NotificationsSound_Tremolo: String { return self._s[3364]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3363]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3364]! } - public var Passport_PasswordHelp: String { return self._s[3365]! } - public var Login_CodeExpiredError: String { return self._s[3366]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3367]! } - public var Conversation_TitleUnmute: String { return self._s[3368]! } - public var Passport_Identity_ScansHelp: String { return self._s[3369]! } - public var Passport_Language_lo: String { return self._s[3370]! } - public var Camera_FlashAuto: String { return self._s[3371]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3372]! } - public var Common_Cancel: String { return self._s[3373]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3374]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3375]! } - public var Appearance_TintAllColors: String { return self._s[3376]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3366]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3367]! } + public var Passport_PasswordHelp: String { return self._s[3368]! } + public var Login_CodeExpiredError: String { return self._s[3369]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3370]! } + public var Conversation_TitleUnmute: String { return self._s[3371]! } + public var Passport_Identity_ScansHelp: String { return self._s[3372]! } + public var Passport_Language_lo: String { return self._s[3373]! } + public var Camera_FlashAuto: String { return self._s[3374]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3375]! } + public var Common_Cancel: String { return self._s[3376]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3377]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3378]! } + public var Appearance_TintAllColors: String { return self._s[3379]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3377]!, self._r[3377]!, [_1]) + return formatWithArgumentRanges(self._s[3380]!, self._r[3380]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3378]! } - public var ChatSettings_Title: String { return self._s[3380]! } - public var Passport_PasswordReset: String { return self._s[3381]! } - public var SocksProxySetup_TypeNone: String { return self._s[3382]! } - public var PhoneNumberHelp_Help: String { return self._s[3384]! } - public var Checkout_EnterPassword: String { return self._s[3385]! } - public var Share_AuthTitle: String { return self._s[3387]! } - public var Activity_UploadingDocument: String { return self._s[3388]! } - public var State_Connecting: String { return self._s[3389]! } - public var Profile_MessageLifetime1w: String { return self._s[3390]! } - public var Conversation_ContextMenuReport: String { return self._s[3391]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3392]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3393]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3381]! } + public var ChatSettings_Title: String { return self._s[3383]! } + public var Passport_PasswordReset: String { return self._s[3384]! } + public var SocksProxySetup_TypeNone: String { return self._s[3385]! } + public var PhoneNumberHelp_Help: String { return self._s[3387]! } + public var Checkout_EnterPassword: String { return self._s[3388]! } + public var Share_AuthTitle: String { return self._s[3390]! } + public var Activity_UploadingDocument: String { return self._s[3391]! } + public var State_Connecting: String { return self._s[3392]! } + public var Profile_MessageLifetime1w: String { return self._s[3393]! } + public var Conversation_ContextMenuReport: String { return self._s[3394]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3395]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3396]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_0]) + return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3395]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3396]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3397]! } - public var PhotoEditor_Set: String { return self._s[3398]! } - public var EmptyGroupInfo_Title: String { return self._s[3399]! } - public var Login_PadPhoneHelp: String { return self._s[3400]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3402]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3404]! } - public var NotificationsSound_Complete: String { return self._s[3405]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3406]! } - public var Group_Info_AdminLog: String { return self._s[3407]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3408]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3409]! } - public var Conversation_Admin: String { return self._s[3411]! } - public var Conversation_GifTooltip: String { return self._s[3412]! } - public var Passport_NotLoggedInMessage: String { return self._s[3413]! } + public var AuthSessions_Terminate: String { return self._s[3398]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3399]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3400]! } + public var PhotoEditor_Set: String { return self._s[3401]! } + public var EmptyGroupInfo_Title: String { return self._s[3402]! } + public var Login_PadPhoneHelp: String { return self._s[3403]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3405]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3407]! } + public var NotificationsSound_Complete: String { return self._s[3408]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3409]! } + public var Group_Info_AdminLog: String { return self._s[3410]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3411]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3412]! } + public var Conversation_Admin: String { return self._s[3414]! } + public var Conversation_GifTooltip: String { return self._s[3415]! } + public var Passport_NotLoggedInMessage: String { return self._s[3416]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3414]!, self._r[3414]!, [_0]) + return formatWithArgumentRanges(self._s[3417]!, self._r[3417]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3415]! } - public var SharedMedia_EmptyTitle: String { return self._s[3417]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3419]! } - public var Username_Help: String { return self._s[3420]! } - public var DialogList_LanguageTooltip: String { return self._s[3422]! } - public var Map_LoadError: String { return self._s[3423]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3424]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3425]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3426]! } - public var Notification_Exceptions_NewException: String { return self._s[3427]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3428]! } - public var WatchRemote_AlertText: String { return self._s[3429]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3432]! } + public var Profile_MessageLifetimeForever: String { return self._s[3418]! } + public var SharedMedia_EmptyTitle: String { return self._s[3420]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3422]! } + public var Username_Help: String { return self._s[3423]! } + public var DialogList_LanguageTooltip: String { return self._s[3425]! } + public var Map_LoadError: String { return self._s[3426]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3427]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3428]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3429]! } + public var Notification_Exceptions_NewException: String { return self._s[3430]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3431]! } + public var WatchRemote_AlertText: String { return self._s[3432]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3435]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_0]) - } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3434]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3435]! } - public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_0]) } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3437]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3438]! } + public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3439]!, self._r[3439]!, [_0]) + } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3437]!, self._r[3437]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3438]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3439]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3441]! } - public var ChatList_UndoArchiveText1: String { return self._s[3442]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3443]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3444]! } - public var Cache_ClearNone: String { return self._s[3445]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3446]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3447]! } + public var Group_AdminLog_EmptyText: String { return self._s[3441]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3442]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3444]! } + public var ChatList_UndoArchiveText1: String { return self._s[3445]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3446]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3447]! } + public var Cache_ClearNone: String { return self._s[3448]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3449]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3450]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3448]!, self._r[3448]!, [_0]) - } - public var Passport_Identity_Country: String { return self._s[3449]! } - public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3450]!, self._r[3450]!, [_0]) - } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3452]! } - public var AccessDenied_Settings: String { return self._s[3453]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3454]! } - public var Month_ShortMay: String { return self._s[3455]! } - public var Compose_NewGroup: String { return self._s[3456]! } - public var Group_Setup_TypePrivate: String { return self._s[3458]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3460]! } - public var Appearance_ThemeDayClassic: String { return self._s[3461]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3462]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3463]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3464]! } - public var Conversation_typing: String { return self._s[3466]! } - public var Paint_Masks: String { return self._s[3467]! } - public var Contacts_DeselectAll: String { return self._s[3468]! } - public var Username_InvalidTaken: String { return self._s[3469]! } - public var Call_StatusNoAnswer: String { return self._s[3470]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3471]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3472]! } - public var Passport_Identity_Selfie: String { return self._s[3473]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3474]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3475]! } - public var Conversation_ClearSecretHistory: String { return self._s[3476]! } - public var PeopleNearby_Description: String { return self._s[3478]! } - public var NetworkUsageSettings_Title: String { return self._s[3479]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3481]! } + public var Passport_Identity_Country: String { return self._s[3452]! } + public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3453]!, self._r[3453]!, [_0]) + } + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3454]!, self._r[3454]!, [_0]) + } + public var Exceptions_AddToExceptions: String { return self._s[3455]! } + public var AccessDenied_Settings: String { return self._s[3456]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3457]! } + public var Month_ShortMay: String { return self._s[3458]! } + public var Compose_NewGroup: String { return self._s[3459]! } + public var Group_Setup_TypePrivate: String { return self._s[3461]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3463]! } + public var Appearance_ThemeDayClassic: String { return self._s[3464]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3465]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3466]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3467]! } + public var Conversation_typing: String { return self._s[3469]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3470]! } + public var Paint_Masks: String { return self._s[3471]! } + public var Contacts_DeselectAll: String { return self._s[3472]! } + public var Username_InvalidTaken: String { return self._s[3473]! } + public var Call_StatusNoAnswer: String { return self._s[3474]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3475]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3476]! } + public var Passport_Identity_Selfie: String { return self._s[3477]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3478]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3479]! } + public var Conversation_ClearSecretHistory: String { return self._s[3480]! } + public var PeopleNearby_Description: String { return self._s[3482]! } + public var NetworkUsageSettings_Title: String { return self._s[3483]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3485]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3483]!, self._r[3483]!, [_0]) + return formatWithArgumentRanges(self._s[3487]!, self._r[3487]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3484]!, self._r[3484]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3486]! } - public var VoiceOver_Navigation_Search: String { return self._s[3487]! } - public var Map_LiveLocationTitle: String { return self._s[3488]! } - public var Login_InfoAvatarAdd: String { return self._s[3489]! } - public var Passport_Identity_FilesView: String { return self._s[3490]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3491]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3492]! } - public var VoiceOver_Chat_File: String { return self._s[3493]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3490]! } + public var VoiceOver_Navigation_Search: String { return self._s[3491]! } + public var Map_LiveLocationTitle: String { return self._s[3492]! } + public var Login_InfoAvatarAdd: String { return self._s[3493]! } + public var Passport_Identity_FilesView: String { return self._s[3494]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3495]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3496]! } + public var VoiceOver_Chat_File: String { return self._s[3497]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3494]!, self._r[3494]!, [_0]) + return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3495]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3496]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3497]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3499]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3500]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3501]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3499]! } - public var Tour_Title2: String { return self._s[3500]! } - public var Conversation_FileOpenIn: String { return self._s[3501]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3502]! } - public var Wallpaper_Set: String { return self._s[3503]! } - public var Passport_Identity_Translations: String { return self._s[3505]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3503]! } + public var Tour_Title2: String { return self._s[3504]! } + public var Conversation_FileOpenIn: String { return self._s[3505]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3506]! } + public var Wallpaper_Set: String { return self._s[3507]! } + public var Passport_Identity_Translations: String { return self._s[3509]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3506]!, self._r[3506]!, [_0]) + return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3507]! } + public var Channel_LeaveChannel: String { return self._s[3511]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3508]!, self._r[3508]!, [_1]) + return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3510]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3511]! } - public var Passport_Email_Delete: String { return self._s[3512]! } - public var Conversation_Mute: String { return self._s[3514]! } - public var Channel_AddBotAsAdmin: String { return self._s[3515]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3517]! } - public var Channel_Management_LabelOwner: String { return self._s[3519]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3514]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3515]! } + public var Passport_Email_Delete: String { return self._s[3516]! } + public var Conversation_Mute: String { return self._s[3518]! } + public var Channel_AddBotAsAdmin: String { return self._s[3519]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3521]! } + public var Channel_Management_LabelOwner: String { return self._s[3523]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3520]!, self._r[3520]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3524]!, self._r[3524]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3521]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3522]! } - public var Common_No: String { return self._s[3523]! } - public var Weekday_Sunday: String { return self._s[3524]! } - public var Notification_Reply: String { return self._s[3525]! } - public var Conversation_ViewMessage: String { return self._s[3526]! } + public var Calls_CallTabDescription: String { return self._s[3525]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3526]! } + public var Common_No: String { return self._s[3527]! } + public var Weekday_Sunday: String { return self._s[3528]! } + public var Notification_Reply: String { return self._s[3529]! } + public var Conversation_ViewMessage: String { return self._s[3530]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3527]!, self._r[3527]!, [_0]) + return formatWithArgumentRanges(self._s[3531]!, self._r[3531]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3528]!, self._r[3528]!, [_0]) + return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3529]! } - public var Message_PinnedDocumentMessage: String { return self._s[3530]! } - public var DialogList_TabTitle: String { return self._s[3532]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3533]! } - public var Passport_FieldEmail: String { return self._s[3534]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3535]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3536]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3537]! } - public var Privacy_Calls_P2P: String { return self._s[3538]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3533]! } + public var Message_PinnedDocumentMessage: String { return self._s[3534]! } + public var DialogList_TabTitle: String { return self._s[3536]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3537]! } + public var Passport_FieldEmail: String { return self._s[3538]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3539]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3540]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3541]! } + public var Privacy_Calls_P2P: String { return self._s[3542]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3540]!, self._r[3540]!, [_0]) + return formatWithArgumentRanges(self._s[3544]!, self._r[3544]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3541]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3545]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3542]!, self._r[3542]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3543]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3544]! } - public var Passport_InfoText: String { return self._s[3545]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3546]! } + public var Stickers_ClearRecent: String { return self._s[3547]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3548]! } + public var Passport_InfoText: String { return self._s[3549]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3550]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3547]!, self._r[3547]!, [_0]) + return formatWithArgumentRanges(self._s[3551]!, self._r[3551]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3548]!, self._r[3548]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3549]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3550]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3551]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3553]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3554]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3553]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3554]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3555]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3557]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3558]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3555]!, self._r[3555]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3559]!, self._r[3559]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3557]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3561]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3559]!, self._r[3559]!, [_0]) + return formatWithArgumentRanges(self._s[3563]!, self._r[3563]!, [_0]) } - public var DialogList_Unread: String { return self._s[3560]! } + public var DialogList_Unread: String { return self._s[3564]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3565]!, self._r[3565]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3562]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3563]! } + public var User_DeletedAccount: String { return self._s[3566]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3567]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_0]) + return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3565]! } - public var SharedMedia_CategoryMedia: String { return self._s[3566]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3567]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3568]! } - public var Watch_ChatList_Compose: String { return self._s[3569]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3570]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3571]! } - public var Watch_Microphone_Access: String { return self._s[3572]! } - public var Group_Setup_HistoryHeader: String { return self._s[3573]! } - public var Map_SetThisLocation: String { return self._s[3574]! } - public var Activity_UploadingPhoto: String { return self._s[3575]! } - public var Conversation_Edit: String { return self._s[3577]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3578]! } - public var Login_TermsOfServiceDecline: String { return self._s[3579]! } - public var Message_PinnedContactMessage: String { return self._s[3580]! } + public var UserInfo_NotificationsDefault: String { return self._s[3569]! } + public var SharedMedia_CategoryMedia: String { return self._s[3570]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3571]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3572]! } + public var Watch_ChatList_Compose: String { return self._s[3573]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3574]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3575]! } + public var Watch_Microphone_Access: String { return self._s[3576]! } + public var Group_Setup_HistoryHeader: String { return self._s[3577]! } + public var Map_SetThisLocation: String { return self._s[3578]! } + public var Activity_UploadingPhoto: String { return self._s[3579]! } + public var Conversation_Edit: String { return self._s[3581]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3582]! } + public var Login_TermsOfServiceDecline: String { return self._s[3583]! } + public var Message_PinnedContactMessage: String { return self._s[3584]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3585]!, self._r[3585]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3582]!, self._r[3582]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3583]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3585]! } + public var Appearance_LargeEmoji: String { return self._s[3587]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3589]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3587]! } - public var Message_PinnedPhotoMessage: String { return self._s[3588]! } - public var Passport_FieldPhone: String { return self._s[3589]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3590]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3591]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3593]! } - public var Conversation_Call: String { return self._s[3594]! } - public var Common_TakePhoto: String { return self._s[3596]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3597]! } - public var Channel_NotificationLoading: String { return self._s[3598]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3591]! } + public var Message_PinnedPhotoMessage: String { return self._s[3592]! } + public var Passport_FieldPhone: String { return self._s[3593]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3594]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3595]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3597]! } + public var Conversation_Call: String { return self._s[3598]! } + public var Common_TakePhoto: String { return self._s[3600]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3601]! } + public var Channel_NotificationLoading: String { return self._s[3602]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3599]!, self._r[3599]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_0]) - } - public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3601]!, self._r[3601]!, [_1]) - } - public var Permissions_SiriTitle_v0: String { return self._s[3602]! } - public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_0]) } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3605]! } - public var Common_edit: String { return self._s[3606]! } - public var PrivacySettings_AuthSessions: String { return self._s[3607]! } - public var Month_ShortJune: String { return self._s[3608]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3609]! } - public var Call_ReportSend: String { return self._s[3610]! } - public var Watch_LastSeen_JustNow: String { return self._s[3611]! } - public var Notifications_MessageNotifications: String { return self._s[3612]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3613]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3615]! } - public var Group_Status: String { return self._s[3616]! } + public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_1]) + } + public var Permissions_SiriTitle_v0: String { return self._s[3606]! } + public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_0]) + } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[3609]! } + public var Common_edit: String { return self._s[3610]! } + public var PrivacySettings_AuthSessions: String { return self._s[3611]! } + public var Month_ShortJune: String { return self._s[3612]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3613]! } + public var Call_ReportSend: String { return self._s[3614]! } + public var Watch_LastSeen_JustNow: String { return self._s[3615]! } + public var Notifications_MessageNotifications: String { return self._s[3616]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3617]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3619]! } + public var Group_Status: String { return self._s[3620]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3617]!, self._r[3617]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3618]! } - public var ShareMenu_ShareTo: String { return self._s[3619]! } - public var Conversation_Moderate_Ban: String { return self._s[3620]! } + public var TextFormat_AddLinkTitle: String { return self._s[3622]! } + public var ShareMenu_ShareTo: String { return self._s[3623]! } + public var Conversation_Moderate_Ban: String { return self._s[3624]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, [_0]) + return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3622]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3623]! } + public var SharedMedia_ViewInChat: String { return self._s[3626]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3627]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3624]!, self._r[3624]!, [_1]) + return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0]) + return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3628]! } - public var Appearance_ReduceMotion: String { return self._s[3629]! } + public var Map_OpenInHereMaps: String { return self._s[3632]! } + public var Appearance_ReduceMotion: String { return self._s[3633]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3631]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3632]! } - public var PhotoEditor_Skip: String { return self._s[3633]! } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[3635]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3636]! } + public var PhotoEditor_Skip: String { return self._s[3637]! } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func MessageTimer_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideoMessages(_ value: Int32) -> String { + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + public func AttachmentMenu_SendGif(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } public func Passport_Scans(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, _1, _2) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } public func UserCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + public func ChatList_SelectedChats(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) } public func Map_ETAMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) } public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index 5f4b04f860..01a6e71566 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -437,8 +437,8 @@ extension PresentationThemeContextMenu: Codable { case background case itemSeparator case sectionSeparator - case itemBackground - case itemHighlightedBackground + case itemBg + case itemHighlightedBg case primary case secondary case destructive @@ -446,16 +446,15 @@ extension PresentationThemeContextMenu: Codable { public convenience init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) - self.init( - dimColor: try decodeColor(values, .dim), - backgroundColor: try decodeColor(values, .background), - itemSeparatorColor: try decodeColor(values, .itemSeparator), - sectionSeparatorColor: try decodeColor(values, .sectionSeparator), - itemBackgroundColor: try decodeColor(values, .itemBackground), - itemHighlightedBackgroundColor: try decodeColor(values, .itemHighlightedBackground), - primaryColor: try decodeColor(values, .primary), - secondaryColor: try decodeColor(values, .secondary), - destructiveColor: try decodeColor(values, .destructive) + self.init(dimColor: try decodeColor(values, .dim), + backgroundColor: try decodeColor(values, .background), + itemSeparatorColor: try decodeColor(values, .itemSeparator), + sectionSeparatorColor: try decodeColor(values, .sectionSeparator), + itemBackgroundColor: try decodeColor(values, .itemBg), + itemHighlightedBackgroundColor: try decodeColor(values, .itemHighlightedBg), + primaryColor: try decodeColor(values, .primary), + secondaryColor: try decodeColor(values, .secondary), + destructiveColor: try decodeColor(values, .destructive) ) } @@ -465,8 +464,8 @@ extension PresentationThemeContextMenu: Codable { try encodeColor(&values, self.backgroundColor, .background) try encodeColor(&values, self.itemSeparatorColor, .itemSeparator) try encodeColor(&values, self.sectionSeparatorColor, .sectionSeparator) - try encodeColor(&values, self.itemBackgroundColor, .itemBackground) - try encodeColor(&values, self.itemHighlightedBackgroundColor, .itemHighlightedBackground) + try encodeColor(&values, self.itemBackgroundColor, .itemBg) + try encodeColor(&values, self.itemHighlightedBackgroundColor, .itemHighlightedBg) try encodeColor(&values, self.primaryColor, .primary) try encodeColor(&values, self.secondaryColor, .secondary) try encodeColor(&values, self.destructiveColor, .destructive) @@ -1500,6 +1499,7 @@ extension PresentationTheme: Codable { try container.encode(self.chatList, forKey: .chatList) try container.encode(self.chat, forKey: .chat) try container.encode(self.actionSheet, forKey: .actionSheet) + try container.encode(self.contextMenu, forKey: .contextMenu) try container.encode(self.inAppNotification, forKey: .notification) } } diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift index c0d6797d29..bac9bd0cb7 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift @@ -216,7 +216,7 @@ public final class PrincipalThemeEssentialGraphics { let outgoingKnockout = self.outgoingBubbleGradientImage != nil let emptyImage = UIImage() - if false && preview { + if preview { self.chatMessageBackgroundIncomingMaskImage = messageBubbleImage(incoming: true, fillColor: UIColor.black, strokeColor: UIColor.clear, neighbors: .none, theme: theme, wallpaper: .color(0xffffff), knockout: true, mask: true) self.chatMessageBackgroundIncomingImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .none, theme: theme, wallpaper: wallpaper, knockout: incomingKnockout) self.chatMessageBackgroundOutgoingMaskImage = messageBubbleImage(incoming: false, fillColor: .black, strokeColor: .clear, neighbors: .none, theme: theme, wallpaper: .color(0xffffff), knockout: true, mask: true) @@ -240,17 +240,17 @@ public final class PrincipalThemeEssentialGraphics { self.chatMessageBackgroundIncomingMergedSideImage = emptyImage self.chatMessageBackgroundIncomingMergedSideHighlightedImage = emptyImage self.chatMessageBackgroundOutgoingHighlightedImage = emptyImage - self.chatMessageBackgroundOutgoingMergedTopMaskImage = emptyImage - self.chatMessageBackgroundOutgoingMergedTopImage = emptyImage + self.chatMessageBackgroundOutgoingMergedTopMaskImage = messageBubbleImage(incoming: false, fillColor: .black, strokeColor: .clear, neighbors: .top(side: false), theme: theme, wallpaper: .color(0xffffff), knockout: true, mask: true) + self.chatMessageBackgroundOutgoingMergedTopImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .top(side: false), theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) self.chatMessageBackgroundOutgoingMergedTopHighlightedImage = emptyImage self.chatMessageBackgroundOutgoingMergedTopSideMaskImage = emptyImage self.chatMessageBackgroundOutgoingMergedTopSideImage = emptyImage self.chatMessageBackgroundOutgoingMergedTopSideHighlightedImage = emptyImage - self.chatMessageBackgroundOutgoingMergedBottomMaskImage = emptyImage - self.chatMessageBackgroundOutgoingMergedBottomImage = emptyImage + self.chatMessageBackgroundOutgoingMergedBottomMaskImage = messageBubbleImage(incoming: false, fillColor: .black, strokeColor: .white, neighbors: .bottom, theme: theme, wallpaper: .color(0xffffff), knockout: true, mask: true) + self.chatMessageBackgroundOutgoingMergedBottomImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .bottom, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) self.chatMessageBackgroundOutgoingMergedBottomHighlightedImage = emptyImage - self.chatMessageBackgroundOutgoingMergedBothMaskImage = emptyImage - self.chatMessageBackgroundOutgoingMergedBothImage = emptyImage + self.chatMessageBackgroundOutgoingMergedBothMaskImage = messageBubbleImage(incoming: false, fillColor: .black, strokeColor: .clear, neighbors: .both, theme: theme, wallpaper: .color(0xffffff), knockout: true, mask: true) + self.chatMessageBackgroundOutgoingMergedBothImage = messageBubbleImage(incoming: false, fillColor: outgoing.fill, strokeColor: outgoing.stroke, neighbors: .both, theme: theme, wallpaper: wallpaper, knockout: outgoingKnockout) self.chatMessageBackgroundOutgoingMergedBothHighlightedImage = emptyImage self.chatMessageBackgroundOutgoingMergedSideMaskImage = emptyImage self.chatMessageBackgroundOutgoingMergedSideImage = emptyImage diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/Contents.json index 3572e6fcaa..87fe67be38 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/Contents.json @@ -6,12 +6,12 @@ }, { "idiom" : "universal", - "filename" : "ScheduleInput@2x.png", + "filename" : "ScheduleInput@2x (2).png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "ScheduleInput@3x.png", + "filename" : "ScheduleInput@3x (2).png", "scale" : "3x" } ], diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@2x (2).png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@2x (2).png new file mode 100644 index 0000000000000000000000000000000000000000..2fdc3b772ed28a2cd975f4f5cfd826063e8f348b GIT binary patch literal 1838 zcmV+}2hsS6P)~S}}OgslrzaLCPdP)FTBQR)H9}YZ*^l29(cj`RDo3j-F-oyS~4A=>r z`t!P6(Fl5pV4}M|6lo3yyBs!@PI`^DhA)lbXpt${r%cKjLo@+CSyka%GlZ`(4jedo zTi-xWkzmY+p|A|?Owq&`&T!U{#9JxI; z6=myn`EYbJ8l7^npKW4-Z9p5hXu5F#V_i)}$v%zeARSY$OX`CMH>ZO{WFef=uXVj_ zXrIs5TT|}al4p4CLtD*S-yA8;kIARTbC9k;>q3#$l8Nm~6Gv{4Grk(9Ienfs;S|u~yf%f$opRrsHOW z+h4Na>h7-gm%gRis^-$O9Y^^$lz)fDKT`a$);Mc#pxxujjudQ5IDB-nYTH|Ayicyh zl;KqZ&I}B6!1U)VSM%N7PVU%SaV{L^Lom{Io6+I|HjmDtqv|fWW3a?! za~fy4a85VI1)Hw7v!a3htn@KAKiJdXb9hu>xp2%fpJbfpD~pRS=;=U6Hd{H%w$9^| z-l45m^~0Sme>7m77@(gpTB{z@!I_lt(F67Sm;UR`^)4MNSlmAC!BW_+rYHHU0tzyf zQxz|pdinCj7sm=#$AGh9VY7hZ7w!hhg6UvMLsyr6pHZR_*JA-oz6pbJrm$H+Jsu;X z1e6Zgg??){Nb$0#h676n^o$lQ-^qhJ=_qU#(C1f_e2=kUCwjr;x{QXh5M%;-wr{X7 zlNsGNVIpj#YXP-7NocY=OZF6=4aYpHWN#=~=*JV%3EP)OSU%CW&C)R0K=TamZrr;5 zR!Vq%-GRB#mMi{fY63gs)|^GSnLJ|{Y#!c|eoVJRzR0KI6BfdxwH3)&LrY}65bOiR z0nT>Rl$X`2_ITFyEs^bb{jl%#oU@mz%ga7gJ{=?W@Z33j^;o5jjiKmDr956W`OrZU z2EwBIa{#4tsKIkqprU=#G$q@I?@xFI9-l(C$%nE|z6nG6nb-l8lq>y380fqbFI%`l zP?5Pp$hNwc2wk+UYayFt+e(ROIq8#ECNVf&Va&RhhESvy_uOp`DZUp?;+~E4B;(*` z*$9W*@3<@yJMm2E2rFQ`wkA+&FDTt?MxdlrABwHPl}OJ!_NxW%fmJ7?4jVAdK?aSUb*^s!K8+WpIMbs|^GSepmcV z^)*LS??~_N_@qr6fqiJu*ZG?@VsK c|ChY~0D92P!bJH*YXATM07*qoM6N<$f)vGnNB{r; literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@2x.png deleted file mode 100644 index 678cba56095fded48f2efe9200679b1ec61ba75a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1767 zcmVq zdwX}c?Y8zNn=@x-&dk?y=KRc*DfD&qx^1NOM$#M$iSk|68BO$cd!qS^Jd@~1I$fI? z9@|UAOCZ0@_>uAk6!FiyocJHM?o?^m%6~^wXP+F)jQyDBl%~`?eyVkA{0F1e)#G+* zt=}^Jf|mJLrOBmv+TFD!evz5+w@m(1lUI$<9H-?G+-R28k9nkbdt>x{vZwDNR&H&y zVl=nPX76w|{R9K;6PBK7A!%BrNiVkbiRodxAFG|W4@(c0UWw_d!<^NjEgU0K(yPd$ z@2~>rm|`8RiRXW@?L^T9OCP0>>~&wma(<{a)r94WxurD`?+NqmzU#URZ;a9gfNKWm z2B5s(mJ{FO&Zci&)- z_Dq;*=FYZlO}i1hUX+>0813)xuRk9t@)#x*uC|z_W{P` zL22EAuuI7VMcIpFUixR`Gb~k0Fo5}LOsjSHi{B1-6%dZI?nYZ8-a#?mjAg$Wn9{VR ztGDm{pl=ZqfFADYd)1yvoQap`SE*-qwlscgjf*6csng32A9K&iPv}S`i`nkP`;*PmB@*cqkU5XSZ){{N3T3id+)w7d6oGmehuj4fu>*`8?p#`J@hc{k3_YXIC=qw33sLoluk z;fDe90i%XZwb8y5f&<_4y!VU}mVAI8sNQG#cH5R{`V@Wn&G=WN?%6+@x%Fajba^CK z@@iR0e@2tXUAc7-pV^NUzuUTgeXzuaKijRG20*mm_>mi|`-Hn%`aV$Hzb_dfmi5L0 zez4>%5$MhW@zBEg2Z7;wV0w(>Li<3m;~E2j=3|btW;E#k&xBkG2)(p%>oH}4%6W%4 z2p$(Wj?NgRxoWXdPX)g5>grCp%N2Rv8pD*Jt)}V=raxEhq8j?j_KoM^3M{>@x0ruB z&W3ANe@@7FJU)V19W>76xu{4h>yV}^MmX24W<6jqcv>w*I%7SCSq~Xu#Vyl{lPCKN z-=0%2iVbzysDrLU8p9dGKwCVavy_UGOn(^}Hs~Y6w};PH0@m1)7C`gJLD$*BsnT+@ zAhv>JPY&$qg0-;-MpZDy2->NFv-Ra>sa;UJZYIFW1~RqW)x{|gOSV{6q*)G5U zY=Y6h>-`EwZX~9>p`4*oPHb5*uvc&1ZLsxhT6_xz!!y`?pi*Wr0?E52r49NO5);Al z?Qpo+E_~m1?w`Yk4TVcoYnC#L94FETb4XHJ*~QYIiBD!qW>P@f>5XkWl{&u&59dG4 zMv~K`HPPfhoc$NRJVx;B?~pQ!3>3vt@83NjJ8VOh(DHo4_>-k_OnCp9zcS|l~@~ah%O6M^m73(RSR=;h0Mq~$AgkSz@Yy!$Bdyg&P#ELESaF3V_=DAt~72t z@oPa+X35=Pwrnc2|6avmj(F^!?6^tIsBKJw-!HSEf`J)q#*89(0`d@>5)Eo1K87eofp5~!}f~x{{ue`<3*yUiEjV^002ov JPDHLkV1i3uX>I@j diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@3x (2).png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Text/AccessoryIconSchedule.imageset/ScheduleInput@3x (2).png new file mode 100644 index 0000000000000000000000000000000000000000..56f5e7d68d06dd8528bcf7a45de2f0b341caafb2 GIT binary patch literal 2928 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 af&T+mvReSF9r@n?0000j{00004XF*Lt006O% z3;baP000UfNkl%E8X+}-Q!oteA7>+WuB?!(SK-klW=vmq6-+ULYxjkqJzY&NTi0(2_cj94dQTbEcSkhgk`BzS+UEA z4C6mjM)Zv&(1R<4H@-557G1T;hka?6H4PE-_vJ>SK zM2Va|MA`ELso?|3W4~XyzyUD^aRPl z(KbisGC{rY-MTkgU-xApWy+R6uQ1N6{NusF7q{E=IyNtPEG=6c z%B8W~H0X&jK}{$rd*eM@_ZYe=0Xw&Ec@Gm@FUsvgB}^H`5G~6Q9Znt{{)VB`fRf~s zsnK<4ZH#d;W^}anTgzzKSK>V}Yb$8wR9r;4&&xV-9~$8AM&_^=JzyAf)MpJ{5fC`$ zd5e2_n$DobjSU5ezuCOJ`Mcg89Ltl$mencB*L@8d^J8OU%P(HKvQJ3*CYHE2ZeQK} z^o9)^uIlN-$j_zItFlvc+`1}Y5^Pi}?+;o90$cv0X*ysdj+#E%(kQ;;5f5Xa9_Qlt z=Wf%qr;m+cCx?HRa^Ul2{+9*40LjV=rJ&;QC3Sm43`QyjOT5u?NQjdwQ zeg!Mc_IO*{$A(TyLdDD!m(@XDce@qAU|>K z%8$_!x9UZM%%0sno8Q&(BKg&#cYYny;ylNX#HcTpbW;|f3V+vNvOzU!Lh5S;Z?x84l?-XV$Am5w|&z;fN!?xYK=vsksoDeW_ivk-U*_ibNr3rQO};amgiF(M&l!% z!V58+pQ+>r1TWuehP)9HLK!DL9Ebakq|>)~WzUhv@pT6#qDD`_A$Q@MZ;Jf97+Wgu z^`DYY<|k>N#nG8*vC~85$YX{#$EcKt+S}XBEu@!v5r=#hz!LN;(?p7Um`fhV#II?<|fuEQgn+S#%+rb@9Wr-mPx#$+wbI5s}hbd$fN18KmR{^Bz>r}!GzwdNSZB= zrms2q#efoW4-ZZ&C&&zM9L7vs@%Zl}I&>s~NiO;k1PbQNw zyt9nBH3ZnfiS1(h^kSJukZ-P)JZHeZtmyt{^~`w3^skATvBlB@*p7>rCQjIPa%{iL zLnl#?1Ie@d7W=YdoxP-|<$`9W>GX}B1Gs#)!$usF-Un=dkQ*9v3M9`;cH&iav<($- zjb-11E=IHBwHvhxaJgK*t*f)W?1MX>6EZ4j{wFas+=;KehcKBKW1V+jsQE#51*yeG z$lbv3zJsX8YB`8Uq};iyd+Q5UeGwRnJjZ8WR(9z`p{tA1&%I(|nITfYVUGxQ446|? z=p~HTH4jnlsbRgYLz8C??8^#&dn_m7?jTO=3c?-{>=?lJ<3aJl;)}xH-ZOS+=u`u{ zbfT}DyC^SGAwW?qCg1@|M-Ma|@e)Sz|sZ)4XS6ZXf%( zA&!2U3QD#R9KA;!;?tRaNLff`6(R2x%np8eKR1eFPFUyRpETr8PdIN>{2!GSC0|UE z-Mw6|CpiCL9{?X1D&s&@oBz^QjeK!M@H_j!uqz0AM6hFkdp|CnMu*fCTK0zgi~4^s W7de~twk`4i0000 deliverOn(Queue.concurrentDefaultQueue()) |> map { color -> PresentationTheme in - return makePresentationTheme(themeReference: currentTheme, accentColor: color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, preview: true) + let theme = makePresentationTheme(themeReference: currentTheme, accentColor: color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, preview: true) + + let wallpaper = context.sharedContext.currentPresentationData.with { $0 }.chatWallpaper + let _ = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: theme, wallpaper: wallpaper) + + return theme } |> deliverOnMainQueue).start(next: { [weak self] theme in if let strongSelf = self { @@ -245,7 +251,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) let controllerInteraction = ChatControllerInteraction.default - let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.theme, wallpaper: self.theme.chat.defaultWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false) + let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.theme, wallpaper: self.theme.chat.defaultWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false, isPreview: true) items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false)) diff --git a/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift b/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift index 68e8369cfd..d077697d90 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift @@ -5,17 +5,16 @@ import SwiftSignalKit import Display import TelegramPresentationData -private var currentTextInputBackgroundImage: (UIColor, UIColor, UIColor, CGFloat, UIImage)? -private func textInputBackgroundImage(backgroundColor: UIColor, fieldColor: UIColor, strokeColor: UIColor, diameter: CGFloat) -> UIImage? { +private var currentTextInputBackgroundImage: (UIColor, UIColor, CGFloat, UIImage)? +private func textInputBackgroundImage(fieldColor: UIColor, strokeColor: UIColor, diameter: CGFloat) -> UIImage? { if let current = currentTextInputBackgroundImage { - if current.0.isEqual(backgroundColor) && current.1.isEqual(fieldColor) && current.2.isEqual(strokeColor) && current.3.isEqual(to: diameter) { - return current.4 + if current.0.isEqual(fieldColor) && current.1.isEqual(strokeColor) && current.2.isEqual(to: diameter) { + return current.3 } } let image = generateImage(CGSize(width: diameter, height: diameter), rotatedContext: { size, context in - context.setFillColor(backgroundColor.cgColor) - context.fill(CGRect(x: 0.0, y: 0.0, width: diameter, height: diameter)) + context.clear(CGRect(x: 0.0, y: 0.0, width: diameter, height: diameter)) context.setFillColor(fieldColor.cgColor) context.fillEllipse(in: CGRect(x: 0.0, y: 0.0, width: diameter, height: diameter)) context.setStrokeColor(strokeColor.cgColor) @@ -24,7 +23,7 @@ private func textInputBackgroundImage(backgroundColor: UIColor, fieldColor: UICo context.strokeEllipse(in: CGRect(x: strokeWidth / 2.0, y: strokeWidth / 2.0, width: diameter - strokeWidth, height: diameter - strokeWidth)) })?.stretchableImage(withLeftCapWidth: Int(diameter) / 2, topCapHeight: Int(diameter) / 2) if let image = image { - currentTextInputBackgroundImage = (backgroundColor, fieldColor, strokeColor, diameter, image) + currentTextInputBackgroundImage = (fieldColor, strokeColor, diameter, image) return image } else { return nil @@ -40,7 +39,6 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { private let textBackgroundNode: ASImageNode private let textFieldNode: TextFieldNode private let prefixNode: ASTextNode - private let palleteButton: HighlightableButtonNode private let doneButton: HighlightableButtonNode private let colorPickerNode: WallpaperColorPickerNode @@ -68,15 +66,14 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { self.bottomSeparatorNode.backgroundColor = theme.chat.inputPanel.panelSeparatorColor self.textBackgroundNode = ASImageNode() - self.textBackgroundNode.image = textInputBackgroundImage(backgroundColor: theme.chat.inputPanel.panelBackgroundColor, fieldColor: theme.chat.inputPanel.inputBackgroundColor, strokeColor: theme.chat.inputPanel.inputStrokeColor, diameter: 33.0) + self.textBackgroundNode.image = textInputBackgroundImage(fieldColor: theme.chat.inputPanel.inputBackgroundColor, strokeColor: theme.chat.inputPanel.inputStrokeColor, diameter: 33.0) + self.textBackgroundNode.displayWithoutProcessing = true + self.textBackgroundNode.displaysAsynchronously = false self.textFieldNode = TextFieldNode() self.prefixNode = ASTextNode() self.prefixNode.attributedText = NSAttributedString(string: "#", font: Font.regular(17.0), textColor: self.theme.chat.inputPanel.inputTextColor) - - self.palleteButton = HighlightableButtonNode() - self.palleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Settings/WallpaperColorIcon"), color: theme.chat.inputPanel.panelControlColor), for: .normal) - + self.doneButton = HighlightableButtonNode() self.doneButton.setImage(PresentationResourcesChat.chatInputPanelApplyButtonImage(theme), for: .normal) @@ -121,7 +118,7 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { self.backgroundNode.backgroundColor = self.theme.chat.inputPanel.panelBackgroundColor self.topSeparatorNode.backgroundColor = self.theme.chat.inputPanel.panelSeparatorColor self.bottomSeparatorNode.backgroundColor = self.theme.chat.inputPanel.panelSeparatorColor - self.textBackgroundNode.image = textInputBackgroundImage(backgroundColor: self.theme.chat.inputPanel.panelBackgroundColor, fieldColor: self.theme.chat.inputPanel.inputBackgroundColor, strokeColor: self.theme.chat.inputPanel.inputStrokeColor, diameter: 33.0) + self.textBackgroundNode.image = textInputBackgroundImage(fieldColor: self.theme.chat.inputPanel.inputBackgroundColor, strokeColor: self.theme.chat.inputPanel.inputStrokeColor, diameter: 33.0) self.textFieldNode.textField.textColor = self.theme.chat.inputPanel.inputTextColor self.textFieldNode.textField.keyboardAppearance = self.theme.chat.inputPanel.keyboardColor.keyboardAppearance @@ -147,7 +144,6 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { let leftInset: CGFloat = 5.0 let rightInset: CGFloat = 5.0 - transition.updateFrame(node: self.palleteButton, frame: CGRect(x: 0.0, y: 0.0, width: topPanelHeight, height: topPanelHeight)) transition.updateFrame(node: self.textBackgroundNode, frame: CGRect(x: leftInset, y: (topPanelHeight - fieldHeight) / 2.0, width: size.width - leftInset - rightInset, height: fieldHeight)) transition.updateFrame(node: self.textFieldNode, frame: CGRect(x: leftInset + 24.0, y: (topPanelHeight - fieldHeight) / 2.0 + 1.0, width: size.width - leftInset - rightInset - 36.0, height: fieldHeight - 2.0)) From 4041715e5b040faf17a4def942c3a9a0188cc3b3 Mon Sep 17 00:00:00 2001 From: peter <> Date: Thu, 22 Aug 2019 19:18:12 +0400 Subject: [PATCH 22/86] Fix reactions --- .../ContextUI/Sources/ContextController.swift | 4 ++- submodules/Display/Display/TextNode.swift | 11 +++--- .../Sources/ReactionContextNode.swift | 36 +++++++++---------- .../Sources/ReactionSelectionNode.swift | 11 ++++-- .../TelegramUI/ChatControllerNode.swift | 5 ++- .../ChatMessageAttachedContentNode.swift | 2 +- .../TelegramUI/OpenChatMessage.swift | 7 ++++ 7 files changed, 48 insertions(+), 28 deletions(-) diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index e1a9e3b786..37efed99fa 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -579,7 +579,9 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi contentParentNode.updateAbsoluteRect?(absoluteContentRect, layout.size) if let reactionContextNode = self.reactionContextNode { - reactionContextNode.updateLayout(size: layout.size, anchorRect: CGRect(origin: CGPoint(x: absoluteContentRect.minX + contentParentNode.contentRect.minX, y: absoluteContentRect.minY + contentParentNode.contentRect.minY), size: contentParentNode.contentRect.size), transition: transition) + let insets = layout.insets(options: [.statusBar]) + transition.updateFrame(node: reactionContextNode, frame: CGRect(origin: CGPoint(), size: layout.size)) + reactionContextNode.updateLayout(size: layout.size, insets: insets, anchorRect: CGRect(origin: CGPoint(x: absoluteContentRect.minX + contentParentNode.contentRect.minX, y: absoluteContentRect.minY + contentParentNode.contentRect.minY), size: contentParentNode.contentRect.size), transition: transition) } } diff --git a/submodules/Display/Display/TextNode.swift b/submodules/Display/Display/TextNode.swift index 7ba43f2cfb..0a8588b8d9 100644 --- a/submodules/Display/Display/TextNode.swift +++ b/submodules/Display/Display/TextNode.swift @@ -120,6 +120,7 @@ public final class TextNodeLayout: NSObject { fileprivate let cutout: TextNodeCutout? fileprivate let insets: UIEdgeInsets public let size: CGSize + public let rawTextSize: CGSize public let truncated: Bool fileprivate let firstLineOffset: CGFloat fileprivate let lines: [TextNodeLine] @@ -128,7 +129,7 @@ public final class TextNodeLayout: NSObject { fileprivate let textShadowColor: UIColor? public let hasRTL: Bool - fileprivate init(attributedString: NSAttributedString?, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, constrainedSize: CGSize, alignment: NSTextAlignment, lineSpacing: CGFloat, cutout: TextNodeCutout?, insets: UIEdgeInsets, size: CGSize, truncated: Bool, firstLineOffset: CGFloat, lines: [TextNodeLine], blockQuotes: [TextNodeBlockQuote], backgroundColor: UIColor?, lineColor: UIColor?, textShadowColor: UIColor?) { + fileprivate init(attributedString: NSAttributedString?, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, constrainedSize: CGSize, alignment: NSTextAlignment, lineSpacing: CGFloat, cutout: TextNodeCutout?, insets: UIEdgeInsets, size: CGSize, rawTextSize: CGSize, truncated: Bool, firstLineOffset: CGFloat, lines: [TextNodeLine], blockQuotes: [TextNodeBlockQuote], backgroundColor: UIColor?, lineColor: UIColor?, textShadowColor: UIColor?) { self.attributedString = attributedString self.maximumNumberOfLines = maximumNumberOfLines self.truncationType = truncationType @@ -138,6 +139,7 @@ public final class TextNodeLayout: NSObject { self.cutout = cutout self.insets = insets self.size = size + self.rawTextSize = rawTextSize self.truncated = truncated self.firstLineOffset = firstLineOffset self.lines = lines @@ -816,7 +818,7 @@ public class TextNode: ASDisplayNode { var maybeTypesetter: CTTypesetter? maybeTypesetter = CTTypesetterCreateWithAttributedString(attributedString as CFAttributedString) if maybeTypesetter == nil { - return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], blockQuotes: [], backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) + return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), rawTextSize: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], blockQuotes: [], backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) } let typesetter = maybeTypesetter! @@ -997,6 +999,7 @@ public class TextNode: ASDisplayNode { } } + let rawLayoutSize = layoutSize if !lines.isEmpty && bottomCutoutEnabled { let proposedWidth = lines[lines.count - 1].frame.width + bottomCutoutSize.width if proposedWidth > layoutSize.width { @@ -1008,9 +1011,9 @@ public class TextNode: ASDisplayNode { } } - return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(width: ceil(layoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), truncated: truncated, firstLineOffset: firstLineOffset, lines: lines, blockQuotes: blockQuotes, backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) + return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(width: ceil(layoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), rawTextSize: CGSize(width: ceil(rawLayoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), truncated: truncated, firstLineOffset: firstLineOffset, lines: lines, blockQuotes: blockQuotes, backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) } else { - return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], blockQuotes: [], backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) + return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), rawTextSize: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], blockQuotes: [], backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) } } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift index 8c958722c4..f0753116f6 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift @@ -90,7 +90,7 @@ public final class ReactionContextNode: ASDisplayNode { private var isExpanded: Bool = false private var highlightedReaction: String? - private var validLayout: (CGSize, CGRect)? + private var validLayout: (CGSize, UIEdgeInsets, CGRect)? public var reactionSelected: ((ReactionGestureItem) -> Void)? @@ -151,7 +151,7 @@ public final class ReactionContextNode: ASDisplayNode { self.addSubnode(self.backgroundContainerNode) self.itemNodes = self.items.map { item in - return ReactionNode(account: account, theme: theme, reaction: .reaction(value: item.value, text: item.text, path: item.path), maximizedReactionSize: 30.0 - 18.0, loadFirstFrame: false) + return ReactionNode(account: account, theme: theme, reaction: .reaction(value: item.value, text: item.text, path: item.path), maximizedReactionSize: 30.0 - 18.0, loadFirstFrame: true) } self.itemNodes.forEach(self.addSubnode) } @@ -162,11 +162,11 @@ public final class ReactionContextNode: ASDisplayNode { self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:)))) } - public func updateLayout(size: CGSize, anchorRect: CGRect, transition: ContainedViewLayoutTransition) { - self.updateLayout(size: size, anchorRect: anchorRect, transition: transition, animateInFromAnchorRect: nil, animateOutToAnchorRect: nil) + public func updateLayout(size: CGSize, insets: UIEdgeInsets, anchorRect: CGRect, transition: ContainedViewLayoutTransition) { + self.updateLayout(size: size, insets: insets, anchorRect: anchorRect, transition: transition, animateInFromAnchorRect: nil, animateOutToAnchorRect: nil) } - private func calculateBackgroundFrame(containerSize: CGSize, anchorRect: CGRect, contentSize: CGSize) -> (CGRect, Bool) { + private func calculateBackgroundFrame(containerSize: CGSize, insets: UIEdgeInsets, anchorRect: CGRect, contentSize: CGSize) -> (CGRect, Bool) { let sideInset: CGFloat = 12.0 let backgroundOffset: CGPoint = CGPoint(x: 22.0, y: -7.0) @@ -180,13 +180,13 @@ public final class ReactionContextNode: ASDisplayNode { isLeftAligned = false } rect.origin.x = max(sideInset, rect.origin.x) - rect.origin.y = max(sideInset, rect.origin.y) + rect.origin.y = max(insets.top + sideInset, rect.origin.y) rect.origin.x = min(containerSize.width - contentSize.width - sideInset, rect.origin.x) return (rect, isLeftAligned) } - private func updateLayout(size: CGSize, anchorRect: CGRect, transition: ContainedViewLayoutTransition, animateInFromAnchorRect: CGRect?, animateOutToAnchorRect: CGRect?, animateReactionHighlight: Bool = false) { - self.validLayout = (size, anchorRect) + private func updateLayout(size: CGSize, insets: UIEdgeInsets, anchorRect: CGRect, transition: ContainedViewLayoutTransition, animateInFromAnchorRect: CGRect?, animateOutToAnchorRect: CGRect?, animateReactionHighlight: Bool = false) { + self.validLayout = (size, insets, anchorRect) let sideInset: CGFloat = 10.0 let itemSpacing: CGFloat = 6.0 @@ -200,7 +200,7 @@ public final class ReactionContextNode: ASDisplayNode { let rowCount = self.items.count / columnCount + (self.items.count % columnCount == 0 ? 0 : 1) let contentHeight = rowHeight * CGFloat(rowCount) - let (backgroundFrame, isLeftAligned) = self.calculateBackgroundFrame(containerSize: size, anchorRect: anchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)) + let (backgroundFrame, isLeftAligned) = self.calculateBackgroundFrame(containerSize: size, insets: insets, anchorRect: anchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)) for i in 0 ..< self.items.count { let row = CGFloat(i / columnCount) @@ -226,7 +226,7 @@ public final class ReactionContextNode: ASDisplayNode { transition.updateFrame(node: self.itemNodes[i], frame: CGRect(origin: CGPoint(x: backgroundFrame.minX + sideInset + column * (minimizedItemSize + itemSpacing) - itemOffset, y: backgroundFrame.minY + row * rowHeight + floor((rowHeight - minimizedItemSize) / 2.0) - itemOffset), size: CGSize(width: itemSize, height: itemSize)), beginWithCurrentState: true) self.itemNodes[i].updateLayout(size: CGSize(width: itemSize, height: itemSize), scale: itemSize / (maximizedItemSize + 18.0), transition: transition, displayText: false) - self.itemNodes[i].updateIsAnimating(true, animated: false) + self.itemNodes[i].updateIsAnimating(false, animated: false) if row != 0 { if self.isExpanded { self.itemNodes[i].alpha = 1.0 @@ -270,11 +270,11 @@ public final class ReactionContextNode: ASDisplayNode { let springDuration: Double = 0.42 let springDamping: CGFloat = 104.0 - let sourceBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, anchorRect: animateInFromAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0 + let sourceBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, insets: insets, anchorRect: animateInFromAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0 self.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: sourceBackgroundFrame.minX - backgroundFrame.minX, y: sourceBackgroundFrame.minY - backgroundFrame.minY)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true) } else if let animateOutToAnchorRect = animateOutToAnchorRect { - let targetBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, anchorRect: animateOutToAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0 + let targetBackgroundFrame = self.calculateBackgroundFrame(containerSize: size, insets: insets, anchorRect: animateOutToAnchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)).0 self.layer.animatePosition(from: CGPoint(), to: CGPoint(x: targetBackgroundFrame.minX - backgroundFrame.minX, y: targetBackgroundFrame.minY - backgroundFrame.minY), duration: 0.2, removeOnCompletion: false, additive: true) } @@ -283,8 +283,8 @@ public final class ReactionContextNode: ASDisplayNode { public func animateIn(from sourceAnchorRect: CGRect) { self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - if let (size, anchorRect) = self.validLayout { - self.updateLayout(size: size, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: sourceAnchorRect, animateOutToAnchorRect: nil) + if let (size, insets, anchorRect) = self.validLayout { + self.updateLayout(size: size, insets: insets, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: sourceAnchorRect, animateOutToAnchorRect: nil) } } @@ -299,8 +299,8 @@ public final class ReactionContextNode: ASDisplayNode { itemNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) } - if let targetAnchorRect = targetAnchorRect, let (size, anchorRect) = self.validLayout { - self.updateLayout(size: size, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: nil, animateOutToAnchorRect: targetAnchorRect) + if let targetAnchorRect = targetAnchorRect, let (size, insets, anchorRect) = self.validLayout { + self.updateLayout(size: size, insets: insets, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: nil, animateOutToAnchorRect: targetAnchorRect) } } @@ -416,8 +416,8 @@ public final class ReactionContextNode: ASDisplayNode { public func setHighlightedReaction(_ value: String?) { self.highlightedReaction = value - if let (size, anchorRect) = self.validLayout { - self.updateLayout(size: size, anchorRect: anchorRect, transition: .animated(duration: 0.18, curve: .easeInOut), animateInFromAnchorRect: nil, animateOutToAnchorRect: nil, animateReactionHighlight: true) + if let (size, insets, anchorRect) = self.validLayout { + self.updateLayout(size: size, insets: insets, anchorRect: anchorRect, transition: .animated(duration: 0.18, curve: .easeInOut), animateInFromAnchorRect: nil, animateOutToAnchorRect: nil, animateReactionHighlight: true) } } } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift index d8d0a005a3..10e3d67288 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -208,6 +208,11 @@ final class ReactionSelectionNode: ASDisplayNode { func updateLayout(constrainedSize: CGSize, startingPoint: CGPoint, offsetFromStart: CGFloat, isInitial: Bool) { let initialAnchorX = startingPoint.x + var isRightAligned = false + if initialAnchorX > constrainedSize.width / 2.0 { + isRightAligned = true + } + if isInitial && self.reactionNodes.isEmpty { let availableContentWidth = constrainedSize.width //max(100.0, initialAnchorX) var minimizedReactionSize = (availableContentWidth - self.maximizedReactionSize) / (CGFloat(self.reactions.count - 1) + CGFloat(self.reactions.count + 1) * 0.2) @@ -241,13 +246,13 @@ final class ReactionSelectionNode: ASDisplayNode { let contentWidth: CGFloat = CGFloat(self.reactionNodes.count - 1) * (minimizedReactionSize) + maximizedReactionSize + CGFloat(self.reactionNodes.count + 1) * reactionSpacing var backgroundFrame = CGRect(origin: CGPoint(x: -shadowBlur, y: -shadowBlur), size: CGSize(width: contentWidth + shadowBlur * 2.0, height: backgroundHeight + shadowBlur * 2.0)) - var isRightAligned = false - if initialAnchorX > constrainedSize.width / 2.0 { - isRightAligned = true + if isRightAligned { backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - contentWidth + backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0) } else { backgroundFrame = backgroundFrame.offsetBy(dx: initialAnchorX - backgroundHeight / 2.0, dy: startingPoint.y - backgroundHeight - 16.0) } + backgroundFrame.origin.x = max(0.0, backgroundFrame.minX) + backgroundFrame.origin.x = min(constrainedSize.width - backgroundFrame.width, backgroundFrame.minX) self.isRightAligned = isRightAligned self.backgroundNode.frame = backgroundFrame diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 3eca14e4cf..cf3142c490 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -213,7 +213,6 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.historyNodeContainer.addSubnode(self.historyNode) self.reactionContainerNode = ReactionSelectionParentNode(account: context.account, theme: chatPresentationInterfaceState.theme) - self.historyNodeContainer.addSubnode(self.reactionContainerNode) self.loadingNode = ChatLoadingNode(theme: self.chatPresentationInterfaceState.theme, chatWallpaper: self.chatPresentationInterfaceState.chatWallpaper) @@ -1447,6 +1446,10 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } } + + if self.reactionContainerNode.supernode == nil { + self.addSubnode(self.reactionContainerNode) + } } func updateAutomaticMediaDownloadSettings(_ settings: MediaAutoDownloadSettings) { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift index 9aa176ad01..3a6d352d0f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift @@ -596,7 +596,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { let lineImage = incoming ? PresentationResourcesChat.chatBubbleVerticalLineIncomingImage(presentationData.theme.theme) : PresentationResourcesChat.chatBubbleVerticalLineOutgoingImage(presentationData.theme.theme) var boundingSize = textFrame.size - var lineHeight = textFrame.size.height + var lineHeight = textLayout.rawTextSize.height if let statusFrame = statusFrame { boundingSize = textFrame.union(statusFrame).size if let _ = actionTitle { diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index c0461ff305..83f94dad37 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -158,6 +158,13 @@ private func chatMessageGalleryControllerData(context: AccountContext, message: #endif } + if internalDocumentItemSupportsMimeType(file.mimeType, fileName: file.fileName ?? "file") { + let gallery = GalleryController(context: context, source: .peerMessagesAtId(message.id), invertItemOrder: reverseMessageGalleryOrder, streamSingleVideo: stream, fromPlayingVideo: autoplayingVideo, landscape: landscape, timecode: timecode, synchronousLoad: synchronousLoad, replaceRootController: { [weak navigationController] controller, ready in + navigationController?.replaceTopController(controller, animated: false, ready: ready) + }, baseNavigationController: navigationController, actionInteraction: actionInteraction) + return .gallery(gallery) + } + if !file.isVideo { return .document(file) } From 1eb0916e2598b89d1df6d5364dcfbda8ac3871f0 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 22 Aug 2019 20:09:25 +0400 Subject: [PATCH 23/86] Fix rawTextSize --- submodules/Display/Display/TextNode.swift | 2 +- .../TelegramCallsUI_Xcode.xcodeproj/project.pbxproj | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/submodules/Display/Display/TextNode.swift b/submodules/Display/Display/TextNode.swift index 0a8588b8d9..2b5fa41930 100644 --- a/submodules/Display/Display/TextNode.swift +++ b/submodules/Display/Display/TextNode.swift @@ -1011,7 +1011,7 @@ public class TextNode: ASDisplayNode { } } - return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(width: ceil(layoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), rawTextSize: CGSize(width: ceil(rawLayoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), truncated: truncated, firstLineOffset: firstLineOffset, lines: lines, blockQuotes: blockQuotes, backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) + return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(width: ceil(layoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), rawTextSize: CGSize(width: ceil(rawLayoutSize.width) + insets.left + insets.right, height: ceil(rawLayoutSize.height) + insets.top + insets.bottom), truncated: truncated, firstLineOffset: firstLineOffset, lines: lines, blockQuotes: blockQuotes, backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) } else { return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), rawTextSize: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], blockQuotes: [], backgroundColor: backgroundColor, lineColor: lineColor, textShadowColor: textShadowColor) } diff --git a/submodules/TelegramCallsUI/TelegramCallsUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCallsUI/TelegramCallsUI_Xcode.xcodeproj/project.pbxproj index 5cd9614efa..bdd2583767 100644 --- a/submodules/TelegramCallsUI/TelegramCallsUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCallsUI/TelegramCallsUI_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + D021289F230EF3B2006B8456 /* ItemListUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D021289E230EF3B2006B8456 /* ItemListUI.framework */; }; D0750C6A22B28A8000BE5F6E /* UniversalMediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C6922B28A8000BE5F6E /* UniversalMediaPlayer.framework */; }; D0AE30FB22B1DC3F0058D3BC /* TelegramCallsUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE30F922B1DC3F0058D3BC /* TelegramCallsUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0AE310D22B1DD160058D3BC /* PresentationCallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE310922B1DD160058D3BC /* PresentationCallManager.swift */; }; @@ -37,6 +38,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + D021289E230EF3B2006B8456 /* ItemListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ItemListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0750C6922B28A8000BE5F6E /* UniversalMediaPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UniversalMediaPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0AE30F622B1DC3F0058D3BC /* TelegramCallsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramCallsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0AE30F922B1DC3F0058D3BC /* TelegramCallsUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramCallsUI.h; sourceTree = ""; }; @@ -73,6 +75,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D021289F230EF3B2006B8456 /* ItemListUI.framework in Frameworks */, D0C9C14B22FE439300FAB518 /* TelegramNotices.framework in Frameworks */, D0C9C0CF22FE3E2400FAB518 /* PhotoResources.framework in Frameworks */, D0750C6A22B28A8000BE5F6E /* UniversalMediaPlayer.framework in Frameworks */, @@ -134,6 +137,7 @@ D0AE315522B1DEF10058D3BC /* Frameworks */ = { isa = PBXGroup; children = ( + D021289E230EF3B2006B8456 /* ItemListUI.framework */, D0C9C14A22FE439300FAB518 /* TelegramNotices.framework */, D0C9C0CE22FE3E2400FAB518 /* PhotoResources.framework */, D0750C6922B28A8000BE5F6E /* UniversalMediaPlayer.framework */, From 47c4ab17a3216ebfef568c7bfee9a4467c2f2039 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 23 Aug 2019 02:44:09 +0400 Subject: [PATCH 24/86] Don't read "PIC" tags as they might be too large --- .../TelegramUI/TelegramUI/AppDelegate.swift | 270 ++---------------- .../SharedNotificationManager.swift | 32 ++- .../TelegramUI/SharedWakeupManager.swift | 61 +++- .../FFMpeg/ffmpeg-4.1/libavformat/id3v2.c | 2 +- 4 files changed, 96 insertions(+), 269 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index 80e1b842af..faf983cda1 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -1229,6 +1229,9 @@ final class SharedApplicationContext { extendNow = true } } + #if DEBUG + extendNow = false + #endif sharedApplicationContext.wakeupManager.allowBackgroundTimeExtension(timeout: 4.0, extendNow: extendNow) }) @@ -1300,7 +1303,20 @@ final class SharedApplicationContext { } Logger.shared.log("App \(self.episodeId)", "remoteNotification: \(redactedPayload)") - completionHandler(UIBackgroundFetchResult.noData) + + if userInfo["p"] == nil { + return + } + + let _ = (self.sharedContextPromise.get() + |> take(1) + |> deliverOnMainQueue).start(next: { sharedApplicationContext in + + sharedApplicationContext.wakeupManager.replaceCurrentExtensionWithExternalTime(completion: { + completionHandler(.newData) + }, timeout: 29.0) + sharedApplicationContext.notificationManager.addNotification(userInfo) + }) } func application(_ application: UIApplication, didReceive notification: UILocalNotification) { @@ -1325,261 +1341,11 @@ final class SharedApplicationContext { if case PKPushType.voIP = type { Logger.shared.log("App \(self.episodeId)", "pushRegistry payload: \(payload.dictionaryPayload)") - sharedApplicationContext.notificationManager.addEncryptedNotification(payload.dictionaryPayload) + sharedApplicationContext.notificationManager.addNotification(payload.dictionaryPayload) } }) } - /*private func processPushPayload(_ payload: [AnyHashable: Any], account: Account) { - let decryptedPayload: Signal<[AnyHashable: Any]?, NoError> - if let _ = payload["aps"] as? [AnyHashable: Any] { - decryptedPayload = .single(payload) - } else if var encryptedPayload = payload["p"] as? String { - encryptedPayload = encryptedPayload.replacingOccurrences(of: "-", with: "+") - encryptedPayload = encryptedPayload.replacingOccurrences(of: "_", with: "/") - while encryptedPayload.count % 4 != 0 { - encryptedPayload.append("=") - } - if let data = Data(base64Encoded: encryptedPayload) { - decryptedPayload = decryptedNotificationPayload(account: account, data: data) - |> map { value -> [AnyHashable: Any]? in - if let value = value, let object = try? JSONSerialization.jsonObject(with: value, options: []) { - return object as? [AnyHashable: Any] - } - return nil - } - } else { - decryptedPayload = .single(nil) - } - } else { - decryptedPayload = .single(nil) - } - - let _ = (decryptedPayload - |> deliverOnMainQueue).start(next: { payload in - guard let payload = payload else { - return - } - - var redactedPayload = payload - if var aps = redactedPayload["aps"] as? [AnyHashable: Any] { - if Logger.shared.redactSensitiveData { - if aps["alert"] != nil { - aps["alert"] = "[[redacted]]" - } - if aps["body"] != nil { - aps["body"] = "[[redacted]]" - } - } - redactedPayload["aps"] = aps - } - Logger.shared.log("Apns \(self.episodeId)", "\(redactedPayload)") - - let aps = payload["aps"] as? [AnyHashable: Any] - - if UIApplication.shared.applicationState == .background { - var readMessageId: MessageId? - var isCall = false - var isAnnouncement = false - var isLocationPolling = false - var isMutePolling = false - var title: String = "" - var body: String? - var apnsSound: String? - var configurationUpdate: (Int32, String, Int32, Data?)? - if let aps = aps, let alert = aps["alert"] as? String { - if let range = alert.range(of: ": ") { - title = String(alert[..() - if isCall { - addedWakeups.insert(.call) - } - if isLocationPolling { - addedWakeups.insert(.backgroundLocation) - } - if !addedWakeups.isEmpty { - self.queuedWakeups.formUnion(addedWakeups) - self.maybeDequeueWakeups() - } - if let readMessageId = readMessageId { - self.clearNotificationsManager?.append(readMessageId) - self.clearNotificationsManager?.commitNow() - - let signal = self.context.get() - |> take(1) - |> mapToSignal { context -> Signal in - if let context = context { - return context.context.account.postbox.transaction (ignoreDisabled: true, { transaction -> Void in - transaction.applyIncomingReadMaxId(readMessageId) - }) - } else { - return .complete() - } - } - let _ = signal.start() - } - - if let (datacenterId, host, port, secret) = configurationUpdate { - let signal = self.context.get() - |> take(1) - |> mapToSignal { context -> Signal in - if let context = context { - context.context.account.network.mergeBackupDatacenterAddress(datacenterId: datacenterId, host: host, port: port, secret: secret) - } - return .complete() - } - let _ = signal.start() - } - } - }) - }*/ - public func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) { Logger.shared.log("App \(self.episodeId)", "invalidated token for \(type)") } diff --git a/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift b/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift index 127075c8a5..232c40158c 100644 --- a/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift +++ b/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift @@ -21,6 +21,14 @@ private final class PollStateContext { } } +private final class NotificationInfo { + let dict: [AnyHashable: Any] + + init(dict: [AnyHashable: Any]) { + self.dict = dict + } +} + public final class SharedNotificationManager { private let episodeId: UInt32 private let application: UIApplication @@ -35,7 +43,7 @@ public final class SharedNotificationManager { private var accountsAndKeys: [(Account, Bool, MasterNotificationKey)]? private var accountsAndKeysDisposable: Disposable? - private var encryptedNotifications: [[AnyHashable: Any]] = [] + private var notifications: [NotificationInfo] = [] private var pollStateContexts: [AccountRecordId: PollStateContext] = [:] @@ -149,8 +157,8 @@ public final class SharedNotificationManager { } } - func addEncryptedNotification(_ dict: [AnyHashable: Any]) { - self.encryptedNotifications.append(dict) + func addNotification(_ dict: [AnyHashable: Any]) { + self.notifications.append(NotificationInfo(dict: dict)) if self.accountsAndKeys != nil { self.process() @@ -162,8 +170,8 @@ public final class SharedNotificationManager { return } var decryptedNotifications: [(Account, Bool, [AnyHashable: Any])] = [] - for dict in self.encryptedNotifications { - if var encryptedPayload = dict["p"] as? String { + for notification in self.notifications { + if var encryptedPayload = notification.dict["p"] as? String { encryptedPayload = encryptedPayload.replacingOccurrences(of: "-", with: "+") encryptedPayload = encryptedPayload.replacingOccurrences(of: "_", with: "/") while encryptedPayload.count % 4 != 0 { @@ -181,7 +189,7 @@ public final class SharedNotificationManager { } } } - self.encryptedNotifications.removeAll() + self.notifications.removeAll() for (account, isCurrent, payload) in decryptedNotifications { var redactedPayload = payload @@ -206,7 +214,7 @@ public final class SharedNotificationManager { var isAnnouncement = false var isLocationPolling = false var notificationRequestId: NotificationManagedNotificationRequestId? - var isMutePolling = false + var shouldPollState = false var title: String = "" var body: String? var apnsSound: String? @@ -234,7 +242,7 @@ public final class SharedNotificationManager { } else if locKey == "GEO_LIVE_PENDING" { isLocationPolling = true } else if locKey == "MESSAGE_MUTED" { - isMutePolling = true + shouldPollState = true } else if locKey == "MESSAGE_DELETED" { var peerId: PeerId? if let fromId = payload["from_id"] { @@ -281,8 +289,6 @@ public final class SharedNotificationManager { } else { body = nil } - } else { - body = nil } } @@ -326,6 +332,8 @@ public final class SharedNotificationManager { } else { var peerId: PeerId? + shouldPollState = true + if let fromId = payload["from_id"] { let fromIdValue = fromId as! NSString peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: Int32(fromIdValue.intValue)) @@ -350,7 +358,7 @@ public final class SharedNotificationManager { } notificationRequestId = .globallyUniqueId(randomIdValue.longLongValue, peerId) } else { - isMutePolling = true + shouldPollState = true } } } else if let _ = payload["max_id"] { @@ -386,7 +394,7 @@ public final class SharedNotificationManager { return } - if notificationRequestId != nil || isMutePolling || isCall { + if notificationRequestId != nil || shouldPollState || isCall { if !self.inForeground || !isCurrent { self.beginPollingState(account: account) } diff --git a/submodules/TelegramUI/TelegramUI/SharedWakeupManager.swift b/submodules/TelegramUI/TelegramUI/SharedWakeupManager.swift index f4aa1a9a63..e6d31125b9 100644 --- a/submodules/TelegramUI/TelegramUI/SharedWakeupManager.swift +++ b/submodules/TelegramUI/TelegramUI/SharedWakeupManager.swift @@ -60,6 +60,8 @@ public final class SharedWakeupManager { private var hasActiveAudioSessionDisposable: Disposable? private var tasksDisposable: Disposable? private var currentTask: (UIBackgroundTaskIdentifier, Double, SwiftSignalKit.Timer)? + private var currentExternalCompletion: (() -> Void, SwiftSignalKit.Timer)? + private var currentExternalCompletionValidationTimer: SwiftSignalKit.Timer? private var managedPausedInBackgroundPlayer: Disposable? @@ -201,8 +203,51 @@ public final class SharedWakeupManager { } } + func replaceCurrentExtensionWithExternalTime(completion: @escaping () -> Void, timeout: Double) { + if let (currentCompletion, timer) = self.currentExternalCompletion { + currentCompletion() + timer.invalidate() + self.currentExternalCompletion = nil + } + let timer = SwiftSignalKit.Timer(timeout: timeout - 5.0, repeat: false, completion: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.currentExternalCompletionValidationTimer?.invalidate() + strongSelf.currentExternalCompletionValidationTimer = nil + if let (completion, timer) = strongSelf.currentExternalCompletion { + strongSelf.currentExternalCompletion = nil + timer.invalidate() + completion() + } + strongSelf.checkTasks() + }, queue: Queue.mainQueue()) + self.currentExternalCompletion = (completion, timer) + timer.start() + + self.currentExternalCompletionValidationTimer?.invalidate() + let validationTimer = SwiftSignalKit.Timer(timeout: 1.0, repeat: false, completion: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.currentExternalCompletionValidationTimer?.invalidate() + strongSelf.currentExternalCompletionValidationTimer = nil + strongSelf.checkTasks() + }, queue: Queue.mainQueue()) + self.currentExternalCompletionValidationTimer = validationTimer + validationTimer.start() + self.checkTasks() + } + func checkTasks() { + var hasTasksForBackgroundExtension = false if self.inForeground || self.hasActiveAudioSession { + if let (completion, timer) = self.currentExternalCompletion { + self.currentExternalCompletion = nil + completion() + timer.invalidate() + } + if let (taskId, _, timer) = self.currentTask { self.currentTask = nil timer.invalidate() @@ -210,13 +255,21 @@ public final class SharedWakeupManager { self.isInBackgroundExtension = false } } else { - var hasTasksForBackgroundExtension = false for (_, _, tasks) in self.accountsAndTasks { if !tasks.isEmpty { hasTasksForBackgroundExtension = true break } } + + if !hasTasksForBackgroundExtension && self.currentExternalCompletionValidationTimer == nil { + if let (completion, timer) = self.currentExternalCompletion { + self.currentExternalCompletion = nil + completion() + timer.invalidate() + } + } + if self.activeExplicitExtensionTimer != nil { hasTasksForBackgroundExtension = true } @@ -265,11 +318,11 @@ public final class SharedWakeupManager { self.isInBackgroundExtension = false } } - self.updateAccounts() + self.updateAccounts(hasTasks: hasTasksForBackgroundExtension) } - private func updateAccounts() { - if self.inForeground || self.hasActiveAudioSession || self.isInBackgroundExtension || self.activeExplicitExtensionTimer != nil { + private func updateAccounts(hasTasks: Bool) { + if self.inForeground || self.hasActiveAudioSession || self.isInBackgroundExtension || (hasTasks && self.currentExternalCompletion != nil) || self.activeExplicitExtensionTimer != nil { for (account, primary, tasks) in self.accountsAndTasks { if (self.inForeground && primary) || !tasks.isEmpty || (self.activeExplicitExtensionTimer != nil && primary) { account.shouldBeServiceTaskMaster.set(.single(.always)) diff --git a/submodules/ffmpeg/FFMpeg/ffmpeg-4.1/libavformat/id3v2.c b/submodules/ffmpeg/FFMpeg/ffmpeg-4.1/libavformat/id3v2.c index f7de26a1d8..934bd52771 100644 --- a/submodules/ffmpeg/FFMpeg/ffmpeg-4.1/libavformat/id3v2.c +++ b/submodules/ffmpeg/FFMpeg/ffmpeg-4.1/libavformat/id3v2.c @@ -791,7 +791,7 @@ typedef struct ID3v2EMFunc { static const ID3v2EMFunc id3v2_extra_meta_funcs[] = { { "GEO", "GEOB", read_geobtag, free_geobtag }, - { "PIC", "APIC", read_apic, free_apic }, + //{ "PIC", "APIC", read_apic, free_apic }, { "CHAP","CHAP", read_chapter, free_chapter }, { "PRIV","PRIV", read_priv, free_priv }, { NULL } From cfb5d2027aecfbf5ff03804e9e5e924aa0addf2e Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 23 Aug 2019 06:55:33 +0300 Subject: [PATCH 25/86] Various UI fixes --- .../NotificationViewController.swift | 1 - Share/ShareRootController.swift | 1 - Telegram-iOS/en.lproj/Localizable.strings | 1 + .../Sources/BotCheckoutControllerNode.swift | 2 +- .../BotCheckoutPasswordEntryController.swift | 1 + .../Sources/BotPaymentFieldItemNode.swift | 2 + .../Sources/ChatListController.swift | 2 +- .../Sources/Node/ChatListItem.swift | 1 - .../Sources/CreatePollOptionItem.swift | 1 + .../DeviceAccess/Sources/DeviceAccess.swift | 8 +- .../Sources/InstantPageFeedbackNode.swift | 2 +- .../InstantPageGalleryFooterContentNode.swift | 2 +- .../Sources/InstantPageTextItem.swift | 6 +- .../Sources/ItemListControllerNode.swift | 2 - .../Items/ItemListMultilineInputItem.swift | 1 + .../Items/ItemListSingleLineInputItem.swift | 2 + .../LegacyComponents/POPAnimation.h | 2 +- .../TGVideoMessageCaptureController.m | 8 +- .../Sources/LegacyMediaPickers.swift | 2 +- .../LegacyUI/Sources/LegacyController.swift | 11 - .../ChatMessageLiveLocationPositionNode.swift | 2 +- .../Sources/PasscodeEntryInputFieldNode.swift | 1 + .../Form/FormControllerTextInputItem.swift | 1 + .../Sources/SecureIdAuthControllerNode.swift | 3 +- ...ecureIdAuthPasswordOptionContentNode.swift | 1 + .../SecureIdDocumentFormControllerNode.swift | 4 +- .../Sources/SecureIdValueFormPhoneItem.swift | 4 +- .../SetupTwoStepVerificationContentNode.swift | 2 + .../Sources/PeerAvatarImageGalleryItem.swift | 6 +- .../ChannelOwnershipTransferController.swift | 4 +- .../Sources/UserInfoEditingPhoneItem.swift | 2 + .../Sources/PhotoResources.swift | 124 +- .../Postbox/Postbox/ItemCollection.swift | 1 + .../Postbox/ItemCollectionItemTable.swift | 2 + .../Postbox/Postbox/MessageHistoryTable.swift | 4 +- submodules/Postbox/Postbox/Postbox.swift | 10 +- .../Postbox/ReverseIndexReferenceTable.swift | 8 +- .../SearchBarNode/Sources/SearchBarNode.swift | 1 + .../ChangePhoneNumberControllerNode.swift | 2 + .../ProxyListSettingsController.swift | 6 +- .../ProxyServerActionSheetController.swift | 2 +- .../ProxyServerSettingsController.swift | 4 +- .../RecentSessionsController.swift | 2 +- .../Themes/WallpaperColorPanelNode.swift | 2 + .../Themes/WallpaperGalleryController.swift | 2 +- .../Sources/Themes/WallpaperGalleryItem.swift | 4 +- .../Sources/ShareInputFieldNode.swift | 10 +- .../Sources/SharePeersContainerNode.swift | 2 +- .../Sources/ShareSearchBarNode.swift | 15 +- .../Sources/ShareSearchContainerNode.swift | 6 +- .../Sources/SolidRoundedButtonNode.swift | 5 +- .../Sources/StickerPackPreviewGridItem.swift | 2 +- .../TelegramCore/DeleteMessages.swift | 4 +- .../DeleteMessagesInteractively.swift | 10 +- ...gedCloudChatRemoveMessagesOperations.swift | 4 +- ...ecretChatIncomingDecryptedOperations.swift | 2 +- .../TelegramCore/RemovePeerChat.swift | 6 +- .../TelegramCore/RequestEditMessage.swift | 6 +- .../TelegramCore/SearchStickers.swift | 2 +- .../Sources/ComponentsThemes.swift | 16 +- .../Sources/DefaultDayPresentationTheme.swift | 2 +- .../Sources/PresentationStrings.swift | 1159 +++++++++-------- .../PresentationResourcesChatList.swift | 1 - .../PresentationResourcesItemList.swift | 1 - .../PresentationResourcesRootController.swift | 1 - .../Sources/StringPluralization.swift | 2 + ...tionSequencePhoneEntryControllerNode.swift | 2 + ...rizationSequenceSignUpControllerNode.swift | 4 + .../TelegramUI/ChatController.swift | 19 +- .../ChatInterfaceInputContexts.swift | 3 +- .../ChatInterfaceStateInputPanels.swift | 16 +- .../ChatMessageBubbleItemNode.swift | 2 +- .../ChatMessagePollBubbleContentNode.swift | 3 + .../ChatScheduleTimeController.swift | 13 + .../ChatScheduleTimeControllerNode.swift | 33 +- .../ChatTextLinkEditController.swift | 6 +- .../TelegramUI/TelegramUI/ChatTitleView.swift | 9 +- .../ContactMultiselectionControllerNode.swift | 2 +- .../TelegramUI/EditableTokenListNode.swift | 12 +- .../TelegramUI/PaneSearchBarNode.swift | 9 +- .../Resources/PresentationStrings.mapping | Bin 124672 -> 124717 bytes .../Sources/WallpaperResources.swift | 4 +- .../Sources/WatchRequestHandlers.swift | 2 + .../Sources/WebSearchControllerNode.swift | 9 +- 84 files changed, 860 insertions(+), 806 deletions(-) diff --git a/NotificationContent/NotificationViewController.swift b/NotificationContent/NotificationViewController.swift index 327854aae7..2c901bb4a2 100644 --- a/NotificationContent/NotificationViewController.swift +++ b/NotificationContent/NotificationViewController.swift @@ -21,7 +21,6 @@ class NotificationViewController: UIViewController, UNNotificationContentExtensi let buildConfig = BuildConfig(baseAppBundleId: baseAppBundleId) - let apiId: Int32 = buildConfig.apiId let languagesCategory = "ios" let appGroupName = "group.\(baseAppBundleId)" diff --git a/Share/ShareRootController.swift b/Share/ShareRootController.swift index 9e30ed6bde..969578d05f 100644 --- a/Share/ShareRootController.swift +++ b/Share/ShareRootController.swift @@ -19,7 +19,6 @@ class ShareRootController: UIViewController { let buildConfig = BuildConfig(baseAppBundleId: baseAppBundleId) - let apiId: Int32 = buildConfig.apiId let languagesCategory = "ios" let appGroupName = "group.\(baseAppBundleId)" diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index a45da3d3cd..a3d042db4f 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4614,6 +4614,7 @@ Any member of this group will be able to see messages in the channel."; "ScheduledMessages.DeleteMany" = "Delete Scheduled Messages"; "ScheduledMessages.EmptyPlaceholder" = "No scheduled messages here yet..."; "ScheduledMessages.BotActionUnavailable" = "This action will become available after the message is published."; +"ScheduledMessages.PollUnavailable" = "Voting will become available after the message is published."; "Conversation.SendMessage.SetReminder" = "Set a Reminder"; diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift index 4119dd80e3..0eef514668 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift @@ -838,7 +838,7 @@ final class BotCheckoutControllerNode: ItemListControllerNode, } if let shippingOptions = strongSelf.currentValidatedFormInfo?.shippingOptions, let shippingOptionId = strongSelf.currentShippingOptionId { - if let shippingOptionIndex = shippingOptions.index(where: { $0.id == shippingOptionId }) { + if let shippingOptionIndex = shippingOptions.firstIndex(where: { $0.id == shippingOptionId }) { for price in shippingOptions[shippingOptionIndex].prices { totalAmount += price.amount diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift index 044183124f..a7422626cc 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift @@ -154,6 +154,7 @@ private final class BotCheckoutPasswordAlertContentNode: AlertContentNode { self.textFieldNode.textField.typingAttributes = [NSAttributedString.Key.font: Font.regular(12.0)] self.textFieldNode.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance self.textFieldNode.textField.isSecureTextEntry = true + self.textFieldNode.textField.tintColor = theme.list.itemAccentColor super.init() diff --git a/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift b/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift index 9f6f0685be..6226c05a11 100644 --- a/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift +++ b/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift @@ -80,6 +80,7 @@ final class BotPaymentFieldItemNode: BotPaymentItemNode, UITextFieldDelegate { self.textField.textField.textColor = theme.list.itemPrimaryTextColor self.textField.textField.attributedPlaceholder = NSAttributedString(string: placeholder, font: titleFont, textColor: theme.list.itemPlaceholderTextColor) self.textField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textField.textField.tintColor = theme.list.itemAccentColor } let leftInset: CGFloat = 16.0 @@ -97,6 +98,7 @@ final class BotPaymentFieldItemNode: BotPaymentItemNode, UITextFieldDelegate { self.theme = theme self.titleNode.attributedText = NSAttributedString(string: self.title, font: titleFont, textColor: theme.list.itemPrimaryTextColor) self.textField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textField.textField.tintColor = theme.list.itemAccentColor } let leftInset: CGFloat = 16.0 diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 21ea059670..8dad0a3b23 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -853,7 +853,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, } self.chatListDisplayNode.isEmptyUpdated = { [weak self] isEmpty in - if let strongSelf = self, let searchContentNode = strongSelf.searchContentNode, let validLayout = strongSelf.validLayout { + if let strongSelf = self, let searchContentNode = strongSelf.searchContentNode, let _ = strongSelf.validLayout { if isEmpty { searchContentNode.updateListVisibleContentOffset(.known(0.0)) } diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index 5fb4d03f4f..129717df82 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1402,7 +1402,6 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { let titlePosition = strongSelf.titleNode.position transition.animatePosition(node: strongSelf.titleNode, from: CGPoint(x: titlePosition.x - contentDelta.x, y: titlePosition.y - contentDelta.y)) - let textPosition = strongSelf.textNode.position transition.animatePositionAdditive(node: strongSelf.textNode, offset: CGPoint(x: -contentDelta.x, y: -contentDelta.y)) let authorPosition = strongSelf.authorNode.position diff --git a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift index c9ebc5f006..6aa6af90e3 100644 --- a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift @@ -275,6 +275,7 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode, if strongSelf.isNodeLoaded { strongSelf.textNode.typingAttributes = [NSAttributedString.Key.font.rawValue: Font.regular(17.0), NSAttributedString.Key.foregroundColor.rawValue: item.theme.list.itemPrimaryTextColor] + strongSelf.textNode.tintColor = item.theme.list.itemAccentColor } } diff --git a/submodules/DeviceAccess/Sources/DeviceAccess.swift b/submodules/DeviceAccess/Sources/DeviceAccess.swift index 3a2ec05ec6..f0f32bda1f 100644 --- a/submodules/DeviceAccess/Sources/DeviceAccess.swift +++ b/submodules/DeviceAccess/Sources/DeviceAccess.swift @@ -223,6 +223,8 @@ public final class DeviceAccess { subscriber.putNext(.denied) case .notDetermined: subscriber.putNext(.notDetermined) + @unknown default: + fatalError() } subscriber.putCompletion() return EmptyDisposable @@ -333,6 +335,8 @@ public final class DeviceAccess { value = false case .authorized: value = true + @unknown default: + fatalError() } let _ = cachedMediaLibraryAccessStatus.swap(value) continueWithValue(value) @@ -376,7 +380,9 @@ public final class DeviceAccess { } case .notDetermined: completion(true) - } + @unknown default: + fatalError() + } case .contacts: let _ = (self.contactsPromise.get() |> take(1) diff --git a/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift b/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift index 9805d1847b..37e2e309ec 100644 --- a/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift +++ b/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift @@ -63,7 +63,7 @@ final class InstantPageFeedbackNode: ASDisplayNode, InstantPageNode { @objc func buttonPressed() { self.resolveDisposable.set((resolvePeerByName(account: self.context.account, name: "previews") |> deliverOnMainQueue).start(next: { [weak self] peerId in - if let strongSelf = self, let peerId = peerId, let webPageId = strongSelf.webPage.id?.id { + if let strongSelf = self, let _ = peerId, let webPageId = strongSelf.webPage.id?.id { strongSelf.openUrl(InstantPageUrlItem(url: "https://t.me/previews?start=webpage\(webPageId)", webpageId: nil)) } })) diff --git a/submodules/InstantPageUI/Sources/InstantPageGalleryFooterContentNode.swift b/submodules/InstantPageUI/Sources/InstantPageGalleryFooterContentNode.swift index 1f075d89c6..6d4bd12264 100644 --- a/submodules/InstantPageUI/Sources/InstantPageGalleryFooterContentNode.swift +++ b/submodules/InstantPageUI/Sources/InstantPageGalleryFooterContentNode.swift @@ -112,7 +112,7 @@ final class InstantPageGalleryFooterContentNode: GalleryFooterContentNode { let sideInset: CGFloat = leftInset + 8.0 let topInset: CGFloat = 0.0 let bottomInset: CGFloat = 0.0 - var textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude)) + let textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude)) var x = sideInset if let hasRTL = self.textNode.cachedLayout?.hasRTL, hasRTL { diff --git a/submodules/InstantPageUI/Sources/InstantPageTextItem.swift b/submodules/InstantPageUI/Sources/InstantPageTextItem.swift index 6b67e5b365..3bd1f5caeb 100644 --- a/submodules/InstantPageUI/Sources/InstantPageTextItem.swift +++ b/submodules/InstantPageUI/Sources/InstantPageTextItem.swift @@ -787,12 +787,12 @@ func layoutTextItemWithString(_ string: NSAttributedString, boundingWidth: CGFlo } if requiresScroll { - textItem.frame = textItem.frame.offsetBy(dx: 0.0, dy: fabs(topInset)) + textItem.frame = textItem.frame.offsetBy(dx: 0.0, dy: abs(topInset)) for var item in additionalItems { - item.frame = item.frame.offsetBy(dx: 0.0, dy: fabs(topInset)) + item.frame = item.frame.offsetBy(dx: 0.0, dy: abs(topInset)) } - let scrollableItem = InstantPageScrollableTextItem(frame: CGRect(x: 0.0, y: 0.0, width: boundingWidth + horizontalInset * 2.0, height: height + fabs(topInset) + bottomInset), item: textItem, additionalItems: additionalItems, totalWidth: textWidth, horizontalInset: horizontalInset, rtl: textItem.containsRTL) + let scrollableItem = InstantPageScrollableTextItem(frame: CGRect(x: 0.0, y: 0.0, width: boundingWidth + horizontalInset * 2.0, height: height + abs(topInset) + bottomInset), item: textItem, additionalItems: additionalItems, totalWidth: textWidth, horizontalInset: horizontalInset, rtl: textItem.containsRTL) items.append(scrollableItem) } else { items.append(contentsOf: additionalItems) diff --git a/submodules/ItemListUI/Sources/ItemListControllerNode.swift b/submodules/ItemListUI/Sources/ItemListControllerNode.swift index 8955f4eba2..358ad954c3 100644 --- a/submodules/ItemListUI/Sources/ItemListControllerNode.swift +++ b/submodules/ItemListUI/Sources/ItemListControllerNode.swift @@ -523,13 +523,11 @@ open class ItemListControllerNode: ASDisplayNode, UISc } if updatedFocusItemTag { if let focusItemTag = focusItemTag { - var applied = false strongSelf.listNode.forEachItemNode { itemNode in if let itemNode = itemNode as? ItemListItemNode { if let itemTag = itemNode.tag { if itemTag.isEqual(to: focusItemTag) { if let focusableNode = itemNode as? ItemListItemFocusableNode { - applied = true focusableNode.focus() } } diff --git a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift index 271f2a0a56..1fb5e0f02b 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift @@ -208,6 +208,7 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod if strongSelf.isNodeLoaded { strongSelf.textNode.typingAttributes = [NSAttributedString.Key.font.rawValue: Font.regular(17.0), NSAttributedString.Key.foregroundColor.rawValue: item.theme.list.itemPrimaryTextColor] + strongSelf.textNode.tintColor = item.theme.list.itemAccentColor } } diff --git a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift index b3762f6bb8..8799de23b2 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift @@ -154,6 +154,7 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg if let item = self.item { self.textNode.textField.textColor = item.theme.list.itemPrimaryTextColor self.textNode.textField.keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textNode.textField.tintColor = item.theme.list.itemAccentColor self.textNode.textField.accessibilityHint = item.placeholder } self.textNode.clipsToBounds = true @@ -210,6 +211,7 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg strongSelf.textNode.textField.textColor = item.theme.list.itemPrimaryTextColor strongSelf.textNode.textField.keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + strongSelf.textNode.textField.tintColor = item.theme.list.itemAccentColor } let _ = titleApply() diff --git a/submodules/LegacyComponents/LegacyComponents/POPAnimation.h b/submodules/LegacyComponents/LegacyComponents/POPAnimation.h index 2e75c09a8c..521a73f64c 100644 --- a/submodules/LegacyComponents/LegacyComponents/POPAnimation.h +++ b/submodules/LegacyComponents/LegacyComponents/POPAnimation.h @@ -163,7 +163,7 @@ When combined with the autoreverses property, a singular animation is effectivel /** @abstract Returns an array containing the keys of all animations currently attached to the receiver. - @param The order of keys reflects the order in which animations will be applied. + @discussion The order of keys reflects the order in which animations will be applied. */ - (NSArray *)pop_animationKeys; diff --git a/submodules/LegacyComponents/LegacyComponents/TGVideoMessageCaptureController.m b/submodules/LegacyComponents/LegacyComponents/TGVideoMessageCaptureController.m index bf812cf29b..7491c0aec7 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGVideoMessageCaptureController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGVideoMessageCaptureController.m @@ -1330,8 +1330,9 @@ static UIImage *startImage = nil; { NSTimeInterval timestamp = timestampVal.doubleValue; NSNumber *closestTimestamp = [self closestTimestampForTimestamp:timestamp timestamps:thumbnailTimestamps start:i finalIndex:&i]; - - [thumbnails addObject:_thumbnails[closestTimestamp]]; + if (closestTimestamp != nil) { + [thumbnails addObject:_thumbnails[closestTimestamp]]; + } }]; return thumbnails; @@ -1339,6 +1340,9 @@ static UIImage *startImage = nil; - (NSNumber *)closestTimestampForTimestamp:(NSTimeInterval)timestamp timestamps:(NSArray *)timestamps start:(NSUInteger)start finalIndex:(NSUInteger *)finalIndex { + if (start >= timestamps.count) { + return nil; + } NSTimeInterval leftTimestamp = [timestamps[start - 1] doubleValue]; NSTimeInterval rightTimestamp = [timestamps[start] doubleValue]; diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift index dc772c8dca..1bef9419c7 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift @@ -183,7 +183,7 @@ public func legacyAssetPickerItemGenerator() -> ((Any?, String?, [Any]?, String? return result } } else if (dict["type"] as! NSString) == "video" { - var thumbnail = dict["previewImage"] as? UIImage + let thumbnail = dict["previewImage"] as? UIImage var asFile = false if let document = dict["document"] as? NSNumber, document.boolValue { asFile = true diff --git a/submodules/LegacyUI/Sources/LegacyController.swift b/submodules/LegacyUI/Sources/LegacyController.swift index bccfc2f78f..50f9d64cce 100644 --- a/submodules/LegacyUI/Sources/LegacyController.swift +++ b/submodules/LegacyUI/Sources/LegacyController.swift @@ -503,21 +503,10 @@ open class LegacyController: ViewController, PresentableController { switch self.presentation { case .modal: self.controllerNode.animateModalOut { [weak self] in - if let controller = self?.legacyController as? TGViewController { - //controller.didDismiss() - } else if let controller = self?.legacyController as? TGNavigationController { - //controller.didDismiss() - } self?.presentingViewController?.dismiss(animated: false, completion: completion) } case .custom: - if let controller = self.legacyController as? TGViewController { - //controller.didDismiss() - } else if let controller = self.legacyController as? TGNavigationController { - //controller.didDismiss() - } self.presentingViewController?.dismiss(animated: false, completion: completion) - case .navigation: break } diff --git a/submodules/LiveLocationPositionNode/Sources/ChatMessageLiveLocationPositionNode.swift b/submodules/LiveLocationPositionNode/Sources/ChatMessageLiveLocationPositionNode.swift index 36b3898bfa..7d49098b6f 100644 --- a/submodules/LiveLocationPositionNode/Sources/ChatMessageLiveLocationPositionNode.swift +++ b/submodules/LiveLocationPositionNode/Sources/ChatMessageLiveLocationPositionNode.swift @@ -73,7 +73,7 @@ public final class ChatMessageLiveLocationPositionNode: ASDisplayNode { return { [weak self] account, theme, peer, liveActive in let backgroundImage: UIImage? var hasPulse = false - if let peer = peer { + if let _ = peer { backgroundImage = avatarBackgroundImage if let liveActive = liveActive { diff --git a/submodules/PasscodeUI/Sources/PasscodeEntryInputFieldNode.swift b/submodules/PasscodeUI/Sources/PasscodeEntryInputFieldNode.swift index 60f4279ba7..97fb1f56b7 100644 --- a/submodules/PasscodeUI/Sources/PasscodeEntryInputFieldNode.swift +++ b/submodules/PasscodeUI/Sources/PasscodeEntryInputFieldNode.swift @@ -185,6 +185,7 @@ final class PasscodeEntryInputFieldNode: ASDisplayNode, UITextFieldDelegate { self.textFieldNode.textField.tintColor = self.accentColor self.textFieldNode.textField.keyboardAppearance = self.keyboardAppearance self.textFieldNode.textField.keyboardType = self.fieldType.keyboardType + self.textFieldNode.textField.tintColor = self.accentColor if self.useCustomNumpad { switch self.fieldType { diff --git a/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift b/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift index a94b686695..c9b9cbc0af 100644 --- a/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift +++ b/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift @@ -144,6 +144,7 @@ final class FormControllerTextInputItemNode: FormBlockItemNode Void = { [weak self] requestedData in - guard let strongSelf = self, let state = strongSelf.state, let verificationState = state.verificationState, case let .verified(context) = verificationState, let formData = form.formData, let validLayout = strongSelf.validLayout?.0 else { + guard let strongSelf = self, let state = strongSelf.state, let verificationState = state.verificationState, case .verified = verificationState, let formData = form.formData, let validLayout = strongSelf.validLayout?.0 else { return } diff --git a/submodules/PassportUI/Sources/SecureIdAuthPasswordOptionContentNode.swift b/submodules/PassportUI/Sources/SecureIdAuthPasswordOptionContentNode.swift index 82d7d57159..408341b540 100644 --- a/submodules/PassportUI/Sources/SecureIdAuthPasswordOptionContentNode.swift +++ b/submodules/PassportUI/Sources/SecureIdAuthPasswordOptionContentNode.swift @@ -60,6 +60,7 @@ final class SecureIdAuthPasswordOptionContentNode: ASDisplayNode, SecureIdAuthCo self.inputField.textField.textColor = theme.list.freeInputField.primaryColor self.inputField.textField.attributedPlaceholder = NSAttributedString(string: hint.isEmpty ? strings.LoginPassword_PasswordPlaceholder : hint, font: passwordFont, textColor: theme.list.freeInputField.placeholderColor) self.inputField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.inputField.textField.tintColor = theme.list.itemAccentColor self.buttonNode = HighlightableButtonNode() diff --git a/submodules/PassportUI/Sources/SecureIdDocumentFormControllerNode.swift b/submodules/PassportUI/Sources/SecureIdDocumentFormControllerNode.swift index 51b0071ed7..6ce48f0ca8 100644 --- a/submodules/PassportUI/Sources/SecureIdDocumentFormControllerNode.swift +++ b/submodules/PassportUI/Sources/SecureIdDocumentFormControllerNode.swift @@ -2953,7 +2953,7 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode thumbnailContextSize.width { - let additionalContextSize = thumbnailContextFittingSize - let additionalBlurContext = DrawingContext(size: additionalContextSize, scale: 1.0) - additionalBlurContext.withFlippedContext { c in - c.interpolationQuality = .default - if let image = thumbnailContext.generateImage()?.cgImage { - c.draw(image, in: CGRect(origin: CGPoint(), size: additionalContextSize)) - } + let initialThumbnailContextFittingSize = fittedSize.fitted(CGSize(width: 100.0, height: 100.0)) + + let thumbnailContextSize = thumbnailSize.aspectFitted(initialThumbnailContextFittingSize) + let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) + thumbnailContext.withFlippedContext { c in + c.interpolationQuality = .none + c.draw(fullSizeImage, in: CGRect(origin: CGPoint(), size: thumbnailContextSize)) + } + imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + + var thumbnailContextFittingSize = CGSize(width: floor(arguments.drawingSize.width * 0.5), height: floor(arguments.drawingSize.width * 0.5)) + if thumbnailContextFittingSize.width < 150.0 || thumbnailContextFittingSize.height < 150.0 { + thumbnailContextFittingSize = thumbnailContextFittingSize.aspectFilled(CGSize(width: 150.0, height: 150.0)) + } + + if thumbnailContextFittingSize.width > thumbnailContextSize.width { + let additionalContextSize = thumbnailContextFittingSize + let additionalBlurContext = DrawingContext(size: additionalContextSize, scale: 1.0) + additionalBlurContext.withFlippedContext { c in + c.interpolationQuality = .default + if let image = thumbnailContext.generateImage()?.cgImage { + c.draw(image, in: CGRect(origin: CGPoint(), size: additionalContextSize)) } - imageFastBlur(Int32(additionalContextSize.width), Int32(additionalContextSize.height), Int32(additionalBlurContext.bytesPerRow), additionalBlurContext.bytes) - sideBlurredImage = additionalBlurContext.generateImage() - } else { - sideBlurredImage = thumbnailContext.generateImage() } + imageFastBlur(Int32(additionalContextSize.width), Int32(additionalContextSize.height), Int32(additionalBlurContext.bytesPerRow), additionalBlurContext.bytes) + sideBlurredImage = additionalBlurContext.generateImage() } else { - let thumbnailContextSize = thumbnailSize.aspectFitted(CGSize(width: 74.0, height: 74.0)) - let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) - thumbnailContext.withFlippedContext { c in - c.interpolationQuality = .none - c.draw(fullSizeImage, in: CGRect(origin: CGPoint(), size: thumbnailContextSize)) - } - imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) - imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) sideBlurredImage = thumbnailContext.generateImage() } @@ -1230,7 +1218,7 @@ public func chatSecretPhoto(account: Account, photoReference: ImageMediaReferenc } private func avatarGalleryThumbnailDatas(postbox: Postbox, representations: [ImageRepresentationWithReference], fullRepresentationSize: CGSize = CGSize(width: 1280.0, height: 1280.0), autoFetchFullSize: Bool = false) -> Signal, NoError> { - if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = imageRepresentationLargerThan(representations.map({ $0.representation }), size: fullRepresentationSize), let smallestIndex = representations.index(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.index(where: { $0.representation == largestRepresentation }) { + if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = imageRepresentationLargerThan(representations.map({ $0.representation }), size: fullRepresentationSize), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) { let maybeFullSize = postbox.mediaBox.resourceData(largestRepresentation.resource) let signal = maybeFullSize @@ -1670,45 +1658,33 @@ public func internalMediaGridMessageVideo(postbox: Postbox, videoReference: File if let fullSizeImage = blurSourceImage { var sideBlurredImage: UIImage? let thumbnailSize = CGSize(width: fullSizeImage.width, height: fullSizeImage.height) - if true { - let initialThumbnailContextFittingSize = drawingSize.fitted(CGSize(width: 100.0, height: 100.0)) - - let thumbnailContextSize = thumbnailSize.aspectFitted(initialThumbnailContextFittingSize) - let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) - thumbnailContext.withFlippedContext { c in - c.interpolationQuality = .none - c.draw(fullSizeImage, in: CGRect(origin: CGPoint(), size: thumbnailContextSize)) - } - imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) - - var thumbnailContextFittingSize = CGSize(width: floor(arguments.drawingSize.width * 0.5), height: floor(arguments.drawingSize.width * 0.5)) - if thumbnailContextFittingSize.width < 150.0 || thumbnailContextFittingSize.height < 150.0 { - thumbnailContextFittingSize = thumbnailContextFittingSize.aspectFilled(CGSize(width: 150.0, height: 150.0)) - } - - if thumbnailContextFittingSize.width > thumbnailContextSize.width { - let additionalContextSize = thumbnailContextFittingSize - let additionalBlurContext = DrawingContext(size: additionalContextSize, scale: 1.0) - additionalBlurContext.withFlippedContext { c in - c.interpolationQuality = .default - if let image = thumbnailContext.generateImage()?.cgImage { - c.draw(image, in: CGRect(origin: CGPoint(), size: additionalContextSize)) - } + let initialThumbnailContextFittingSize = drawingSize.fitted(CGSize(width: 100.0, height: 100.0)) + + let thumbnailContextSize = thumbnailSize.aspectFitted(initialThumbnailContextFittingSize) + let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) + thumbnailContext.withFlippedContext { c in + c.interpolationQuality = .none + c.draw(fullSizeImage, in: CGRect(origin: CGPoint(), size: thumbnailContextSize)) + } + imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + + var thumbnailContextFittingSize = CGSize(width: floor(arguments.drawingSize.width * 0.5), height: floor(arguments.drawingSize.width * 0.5)) + if thumbnailContextFittingSize.width < 150.0 || thumbnailContextFittingSize.height < 150.0 { + thumbnailContextFittingSize = thumbnailContextFittingSize.aspectFilled(CGSize(width: 150.0, height: 150.0)) + } + + if thumbnailContextFittingSize.width > thumbnailContextSize.width { + let additionalContextSize = thumbnailContextFittingSize + let additionalBlurContext = DrawingContext(size: additionalContextSize, scale: 1.0) + additionalBlurContext.withFlippedContext { c in + c.interpolationQuality = .default + if let image = thumbnailContext.generateImage()?.cgImage { + c.draw(image, in: CGRect(origin: CGPoint(), size: additionalContextSize)) } - imageFastBlur(Int32(additionalContextSize.width), Int32(additionalContextSize.height), Int32(additionalBlurContext.bytesPerRow), additionalBlurContext.bytes) - sideBlurredImage = additionalBlurContext.generateImage() - } else { - sideBlurredImage = thumbnailContext.generateImage() } + imageFastBlur(Int32(additionalContextSize.width), Int32(additionalContextSize.height), Int32(additionalBlurContext.bytesPerRow), additionalBlurContext.bytes) + sideBlurredImage = additionalBlurContext.generateImage() } else { - let thumbnailContextSize = thumbnailSize.aspectFitted(CGSize(width: 74.0, height: 74.0)) - let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) - thumbnailContext.withFlippedContext { c in - c.interpolationQuality = .none - c.draw(fullSizeImage, in: CGRect(origin: CGPoint(), size: thumbnailContextSize)) - } - imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) - imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) sideBlurredImage = thumbnailContext.generateImage() } @@ -2307,7 +2283,7 @@ public func instantPageImageFile(account: Account, fileReference: FileMediaRefer } private func avatarGalleryPhotoDatas(account: Account, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], autoFetchFullSize: Bool = false) -> Signal, NoError> { - if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.index(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.index(where: { $0.representation == largestRepresentation }) { + if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) { let maybeFullSize = account.postbox.mediaBox.resourceData(largestRepresentation.resource) diff --git a/submodules/Postbox/Postbox/ItemCollection.swift b/submodules/Postbox/Postbox/ItemCollection.swift index 947f2d53ec..c42322acc0 100644 --- a/submodules/Postbox/Postbox/ItemCollection.swift +++ b/submodules/Postbox/Postbox/ItemCollection.swift @@ -103,4 +103,5 @@ public protocol ItemCollectionItem: PostboxCoding { public enum ItemCollectionSearchQuery { case exact(ValueBoxKey) case matching([ValueBoxKey]) + case any([ValueBoxKey]) } diff --git a/submodules/Postbox/Postbox/ItemCollectionItemTable.swift b/submodules/Postbox/Postbox/ItemCollectionItemTable.swift index 402987a7f9..bd9852319c 100644 --- a/submodules/Postbox/Postbox/ItemCollectionItemTable.swift +++ b/submodules/Postbox/Postbox/ItemCollectionItemTable.swift @@ -229,6 +229,8 @@ final class ItemCollectionItemTable: Table { references = self.reverseIndexTable.exactReferences(namespace: ReverseIndexNamespace(namespace), token: token) case let .matching(tokens): references = Array(self.reverseIndexTable.matchingReferences(namespace: ReverseIndexNamespace(namespace), tokens: tokens)) + case let .any(tokens): + references = Array(self.reverseIndexTable.matchingReferences(namespace: ReverseIndexNamespace(namespace), tokens: tokens, union: true)) } var resultsByCollectionId: [ItemCollectionId: [(ItemCollectionItemIndex, ItemCollectionItem)]] = [:] for reference in references { diff --git a/submodules/Postbox/Postbox/MessageHistoryTable.swift b/submodules/Postbox/Postbox/MessageHistoryTable.swift index 701d92990a..ca5f4307e5 100644 --- a/submodules/Postbox/Postbox/MessageHistoryTable.swift +++ b/submodules/Postbox/Postbox/MessageHistoryTable.swift @@ -426,8 +426,8 @@ final class MessageHistoryTable: Table { self.processIndexOperations(peerId, operations: operations, processedOperationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations) } - func clearHistory(peerId: PeerId, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation]) { - let indices = self.allMessageIndices(peerId: peerId) + func clearHistory(peerId: PeerId, namespaces: MessageIdNamespaces, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation]) { + let indices = self.allMessageIndices(peerId: peerId).filter { namespaces.contains($0.id.namespace) } self.removeMessages(indices.map { $0.id }, operationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations) } diff --git a/submodules/Postbox/Postbox/Postbox.swift b/submodules/Postbox/Postbox/Postbox.swift index c7216d6498..653c023d84 100644 --- a/submodules/Postbox/Postbox/Postbox.swift +++ b/submodules/Postbox/Postbox/Postbox.swift @@ -86,9 +86,9 @@ public final class Transaction { self.postbox?.withAllMessages(peerId: peerId, namespace: namespace, f) } - public func clearHistory(_ peerId: PeerId) { + public func clearHistory(_ peerId: PeerId, namespaces: MessageIdNamespaces) { assert(!self.disposed) - self.postbox?.clearHistory(peerId) + self.postbox?.clearHistory(peerId, namespaces: namespaces) } public func removeAllMessagesWithAuthor(_ peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace) { @@ -1519,9 +1519,9 @@ public final class Postbox { } } - fileprivate func clearHistory(_ peerId: PeerId) { - self.messageHistoryTable.clearHistory(peerId: peerId, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations) - for namespace in self.messageHistoryHoleIndexTable.existingNamespaces(peerId: peerId, holeSpace: .everywhere) { + fileprivate func clearHistory(_ peerId: PeerId, namespaces: MessageIdNamespaces) { + self.messageHistoryTable.clearHistory(peerId: peerId, namespaces: namespaces, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations) + for namespace in self.messageHistoryHoleIndexTable.existingNamespaces(peerId: peerId, holeSpace: .everywhere) where namespaces.contains(namespace) { self.messageHistoryHoleIndexTable.remove(peerId: peerId, namespace: namespace, space: .everywhere, range: 1 ... Int32.max - 1, operations: &self.currentPeerHoleOperations) } } diff --git a/submodules/Postbox/Postbox/ReverseIndexReferenceTable.swift b/submodules/Postbox/Postbox/ReverseIndexReferenceTable.swift index b2991cf8ae..4e8b6f37a3 100644 --- a/submodules/Postbox/Postbox/ReverseIndexReferenceTable.swift +++ b/submodules/Postbox/Postbox/ReverseIndexReferenceTable.swift @@ -188,7 +188,7 @@ final class ReverseIndexReferenceTable: Table { } } - func matchingReferences(namespace: ReverseIndexNamespace, tokens: [ValueBoxKey]) -> Set { + func matchingReferences(namespace: ReverseIndexNamespace, tokens: [ValueBoxKey], union: Bool = false) -> Set { var references: Set? for token in tokens { if let references = references, references.isEmpty { @@ -208,7 +208,11 @@ final class ReverseIndexReferenceTable: Table { return true }, limit: 0) if let previousReferences = references { - references = previousReferences.intersection(currentReferences) + if union { + references = previousReferences.union(currentReferences) + } else { + references = previousReferences.intersection(currentReferences) + } } else { references = currentReferences } diff --git a/submodules/SearchBarNode/Sources/SearchBarNode.swift b/submodules/SearchBarNode/Sources/SearchBarNode.swift index 03ead7c44f..0ca4a86aec 100644 --- a/submodules/SearchBarNode/Sources/SearchBarNode.swift +++ b/submodules/SearchBarNode/Sources/SearchBarNode.swift @@ -398,6 +398,7 @@ public class SearchBarNode: ASDisplayNode, UITextFieldDelegate { self.clearButton.setImage(generateClearIcon(color: theme.inputClear), for: []) self.iconNode.image = generateLoupeIcon(color: theme.inputIcon) self.textField.keyboardAppearance = theme.keyboard.keyboardAppearance + self.textField.tintColor = theme.accent if let activityIndicator = self.activityIndicator { activityIndicator.type = .custom(theme.inputIcon, 13.0, 1.0, false) diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift index 20018cba42..490fd4fc26 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift @@ -128,8 +128,10 @@ final class ChangePhoneNumberControllerNode: ASDisplayNode { self.phoneInputNode = PhoneInputNode(fontSize: 17.0) self.phoneInputNode.countryCodeField.textField.textColor = self.presentationData.theme.list.itemPrimaryTextColor self.phoneInputNode.countryCodeField.textField.keyboardAppearance = self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.phoneInputNode.countryCodeField.textField.tintColor = self.presentationData.theme.list.itemAccentColor self.phoneInputNode.numberField.textField.textColor = self.presentationData.theme.list.itemPrimaryTextColor self.phoneInputNode.numberField.textField.keyboardAppearance = self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.phoneInputNode.numberField.textField.tintColor = self.presentationData.theme.list.itemAccentColor super.init() diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift index 05d4320b44..52490f215b 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift @@ -340,7 +340,7 @@ public func proxySettingsController(accountManager: AccountManager, postbox: Pos let _ = updateProxySettingsInteractively(accountManager: accountManager, { current in var current = current if current.activeServer != server { - if let _ = current.servers.index(of: server) { + if let _ = current.servers.firstIndex(of: server) { current.activeServer = server current.enabled = true } @@ -352,7 +352,7 @@ public func proxySettingsController(accountManager: AccountManager, postbox: Pos }, removeServer: { server in let _ = updateProxySettingsInteractively(accountManager: accountManager, { current in var current = current - if let index = current.servers.index(of: server) { + if let index = current.servers.firstIndex(of: server) { current.servers.remove(at: index) if current.activeServer == server { current.activeServer = nil @@ -462,7 +462,7 @@ public func proxySettingsController(accountManager: AccountManager, postbox: Pos let _ = updateProxySettingsInteractively(accountManager: accountManager, { current in var current = current - if let index = current.servers.index(of: fromServer) { + if let index = current.servers.firstIndex(of: fromServer) { current.servers.remove(at: index) } if let referenceServer = referenceServer { diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift index c6e2c85ee9..1692b8b0cc 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift @@ -384,7 +384,7 @@ private final class ProxyServerActionItemNode: ActionSheetItemNode { updateProxySettingsInteractively(transaction: transaction, { settings in currentSettings = settings var settings = settings - if let index = settings.servers.index(of: proxyServerSettings) { + if let index = settings.servers.firstIndex(of: proxyServerSettings) { settings.servers[index] = proxyServerSettings settings.activeServer = proxyServerSettings } else { diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift index 9e654a1fd8..6b2c64fb8f 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift @@ -343,7 +343,7 @@ func proxyServerSettingsController(theme: PresentationTheme, strings: Presentati let _ = (updateProxySettingsInteractively(accountManager: accountManager, { settings in var settings = settings if let currentSettings = currentSettings { - if let index = settings.servers.index(of: currentSettings) { + if let index = settings.servers.firstIndex(of: currentSettings) { settings.servers[index] = proxyServerSettings if settings.activeServer == currentSettings { settings.activeServer = proxyServerSettings @@ -375,7 +375,6 @@ func proxyServerSettingsController(theme: PresentationTheme, strings: Presentati dismissImpl = { [weak controller] in let _ = controller?.dismiss() } - shareImpl = { [weak controller] in let state = stateValue.with { $0 } guard let server = proxyServerSettings(with: state), let strongController = controller else { @@ -383,6 +382,7 @@ func proxyServerSettingsController(theme: PresentationTheme, strings: Presentati } let link = shareLink(for: server) + controller?.view.endEditing(true) if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { let controller = ShareProxyServerActionSheetController(theme: theme, strings: strings, updatedPresentationData: updatedPresentationData, link: link) presentImpl?(controller, nil) diff --git a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift index 88223e33df..3698fc572e 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift @@ -344,7 +344,7 @@ private func recentSessionsControllerEntries(presentationData: PresentationData, if !sessionsState.sessions.isEmpty { var existingSessionIds = Set() entries.append(.currentSessionHeader(presentationData.theme, presentationData.strings.AuthSessions_CurrentSession)) - if let index = sessionsState.sessions.index(where: { $0.hash == 0 }) { + if let index = sessionsState.sessions.firstIndex(where: { $0.hash == 0 }) { existingSessionIds.insert(sessionsState.sessions[index].hash) entries.append(.currentSession(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, sessionsState.sessions[index])) } diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift index 5e6f5e0ec5..4ae912a779 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift @@ -112,6 +112,7 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { self.textFieldNode.textField.delegate = self self.textFieldNode.textField.addTarget(self, action: #selector(self.textFieldTextChanged(_:)), for: .editingChanged) self.textFieldNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) + self.textFieldNode.textField.tintColor = self.theme.list.itemAccentColor } func updateTheme(_ theme: PresentationTheme) { @@ -123,6 +124,7 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { self.textFieldNode.textField.textColor = self.theme.chat.inputPanel.inputTextColor self.textFieldNode.textField.keyboardAppearance = self.theme.chat.inputPanel.keyboardColor.keyboardAppearance + self.textFieldNode.textField.tintColor = self.theme.list.itemAccentColor } private func setColor(_ color: UIColor, updatePicker: Bool = true, ended: Bool = true) { diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift index 0e37ac7eda..4b3e508522 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift @@ -179,7 +179,7 @@ public class WallpaperGalleryController: ViewController { switch source { case let .list(wallpapers, central, type): entries = wallpapers.map { .wallpaper($0, nil) } - centralEntryIndex = wallpapers.index(of: central)! + centralEntryIndex = wallpapers.firstIndex(of: central)! if case let .wallpapers(wallpaperOptions) = type, let options = wallpaperOptions { self.initialOptions = options diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift index 4ee75d07a7..ff9ce3907d 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift @@ -267,7 +267,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { } } return - } else if let offset = self.validOffset, self.arguments.colorPreview && fabs(offset) > 0.0 { + } else if let offset = self.validOffset, self.arguments.colorPreview && abs(offset) > 0.0 { return } else { @@ -314,7 +314,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { let convertedRepresentations: [ImageRepresentationWithReference] = representations.map({ ImageRepresentationWithReference(representation: $0, reference: .wallpaper(resource: $0.resource)) }) signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false) - if let largestIndex = convertedRepresentations.index(where: { $0.representation == largestSize }) { + if let largestIndex = convertedRepresentations.firstIndex(where: { $0.representation == largestSize }) { fetchSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: convertedRepresentations[largestIndex].reference) } else { fetchSignal = .complete() diff --git a/submodules/ShareController/Sources/ShareInputFieldNode.swift b/submodules/ShareController/Sources/ShareInputFieldNode.swift index 9fe17aea07..0bda739e24 100644 --- a/submodules/ShareController/Sources/ShareInputFieldNode.swift +++ b/submodules/ShareController/Sources/ShareInputFieldNode.swift @@ -13,13 +13,15 @@ final class ShareInputFieldNodeTheme: Equatable { let textColor: UIColor let placeholderColor: UIColor let clearButtonColor: UIColor + let accentColor: UIColor let keyboard: PresentationThemeKeyboardColor - public init(backgroundColor: UIColor, textColor: UIColor, placeholderColor: UIColor, clearButtonColor: UIColor, keyboard: PresentationThemeKeyboardColor) { + public init(backgroundColor: UIColor, textColor: UIColor, placeholderColor: UIColor, clearButtonColor: UIColor, accentColor: UIColor, keyboard: PresentationThemeKeyboardColor) { self.backgroundColor = backgroundColor self.textColor = textColor self.placeholderColor = placeholderColor self.clearButtonColor = clearButtonColor + self.accentColor = accentColor self.keyboard = keyboard } @@ -36,6 +38,9 @@ final class ShareInputFieldNodeTheme: Equatable { if lhs.clearButtonColor != rhs.clearButtonColor { return false } + if lhs.accentColor != rhs.accentColor { + return false + } if lhs.keyboard != rhs.keyboard { return false } @@ -45,7 +50,7 @@ final class ShareInputFieldNodeTheme: Equatable { extension ShareInputFieldNodeTheme { convenience init(presentationTheme theme: PresentationTheme) { - self.init(backgroundColor: theme.actionSheet.inputBackgroundColor, textColor: theme.actionSheet.inputTextColor, placeholderColor: theme.actionSheet.inputPlaceholderColor, clearButtonColor: theme.actionSheet.inputClearButtonColor, keyboard: theme.chatList.searchBarKeyboardColor) + self.init(backgroundColor: theme.actionSheet.inputBackgroundColor, textColor: theme.actionSheet.inputTextColor, placeholderColor: theme.actionSheet.inputPlaceholderColor, clearButtonColor: theme.actionSheet.inputClearButtonColor, accentColor: theme.actionSheet.controlAccentColor, keyboard: theme.chatList.searchBarKeyboardColor) } } @@ -95,6 +100,7 @@ final class ShareInputFieldNode: ASDisplayNode, ASEditableTextNodeDelegate { self.textInputNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) self.textInputNode.textContainerInset = UIEdgeInsets(top: self.inputInsets.top, left: 0.0, bottom: self.inputInsets.bottom, right: 0.0) self.textInputNode.keyboardAppearance = theme.keyboard.keyboardAppearance + self.textInputNode.tintColor = theme.accentColor self.placeholderNode = ASTextNode() self.placeholderNode.isUserInteractionEnabled = false diff --git a/submodules/ShareController/Sources/SharePeersContainerNode.swift b/submodules/ShareController/Sources/SharePeersContainerNode.swift index 14bc1bff93..5b933e3116 100644 --- a/submodules/ShareController/Sources/SharePeersContainerNode.swift +++ b/submodules/ShareController/Sources/SharePeersContainerNode.swift @@ -287,7 +287,7 @@ final class SharePeersContainerNode: ASDisplayNode, ShareContentContainerNode { var scrollToItem: GridNodeScrollToItem? if let ensurePeerVisibleOnLayout = self.ensurePeerVisibleOnLayout { self.ensurePeerVisibleOnLayout = nil - if let index = self.entries.index(where: { $0.peer.peerId == ensurePeerVisibleOnLayout }) { + if let index = self.entries.firstIndex(where: { $0.peer.peerId == ensurePeerVisibleOnLayout }) { scrollToItem = GridNodeScrollToItem(index: index, position: .visible, transition: transition, directionHint: .up, adjustForSection: false) } } diff --git a/submodules/ShareController/Sources/ShareSearchBarNode.swift b/submodules/ShareController/Sources/ShareSearchBarNode.swift index 0101c5b2c1..37b9294387 100644 --- a/submodules/ShareController/Sources/ShareSearchBarNode.swift +++ b/submodules/ShareController/Sources/ShareSearchBarNode.swift @@ -42,13 +42,14 @@ final class ShareSearchBarNode: ASDisplayNode, UITextFieldDelegate { self.textInputNode.fixOffset = false let textColor: UIColor = theme.actionSheet.inputTextColor let keyboardAppearance: UIKeyboardAppearance = UIKeyboardAppearance.default - textInputNode.textField.font = Font.regular(16.0) - textInputNode.textField.textColor = textColor - textInputNode.textField.typingAttributes = [NSAttributedString.Key.font: Font.regular(16.0), NSAttributedString.Key.foregroundColor: textColor] - textInputNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) - textInputNode.textField.keyboardAppearance = keyboardAppearance - textInputNode.textField.attributedPlaceholder = NSAttributedString(string: placeholder, font: Font.regular(16.0), textColor: theme.actionSheet.inputPlaceholderColor) - textInputNode.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textInputNode.textField.font = Font.regular(16.0) + self.textInputNode.textField.textColor = textColor + self.textInputNode.textField.typingAttributes = [NSAttributedString.Key.font: Font.regular(16.0), NSAttributedString.Key.foregroundColor: textColor] + self.textInputNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) + self.textInputNode.textField.keyboardAppearance = keyboardAppearance + self.textInputNode.textField.attributedPlaceholder = NSAttributedString(string: placeholder, font: Font.regular(16.0), textColor: theme.actionSheet.inputPlaceholderColor) + self.textInputNode.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textInputNode.textField.tintColor = theme.actionSheet.controlAccentColor super.init() diff --git a/submodules/ShareController/Sources/ShareSearchContainerNode.swift b/submodules/ShareController/Sources/ShareSearchContainerNode.swift index 4346e68ea5..2b9935253a 100644 --- a/submodules/ShareController/Sources/ShareSearchContainerNode.swift +++ b/submodules/ShareController/Sources/ShareSearchContainerNode.swift @@ -71,7 +71,7 @@ private enum ShareSearchRecentEntry: Comparable, Identifiable { return false } case let .peer(lhsIndex, lhsTheme, lhsPeer, lhsAssociatedPeer, lhsPresence, lhsStrings): - if case let .peer(rhsIndex, rhsTheme, rhsPeer, rhsAssociatedPeer, rhsPresence, rhsStrings) = rhs, lhsPeer.isEqual(rhsPeer) && arePeersEqual(lhsAssociatedPeer, rhsAssociatedPeer) && lhsIndex == rhsIndex && lhsStrings === rhsStrings && lhsTheme === rhsTheme { + if case let .peer(rhsIndex, rhsTheme, rhsPeer, rhsAssociatedPeer, rhsPresence, rhsStrings) = rhs, lhsPeer.isEqual(rhsPeer) && arePeersEqual(lhsAssociatedPeer, rhsAssociatedPeer) && lhsIndex == rhsIndex && lhsStrings === rhsStrings && lhsTheme === rhsTheme && arePeerPresencesEqual(lhsPresence, rhsPresence) { return true } else { return false @@ -436,7 +436,7 @@ final class ShareSearchContainerNode: ASDisplayNode, ShareContentContainerNode { var scrollToItem: GridNodeScrollToItem? if !self.contentGridNode.isHidden, let ensurePeerVisibleOnLayout = self.ensurePeerVisibleOnLayout { self.ensurePeerVisibleOnLayout = nil - if let index = self.entries.index(where: { $0.peer.peerId == ensurePeerVisibleOnLayout }) { + if let index = self.entries.firstIndex(where: { $0.peer.peerId == ensurePeerVisibleOnLayout }) { scrollToItem = GridNodeScrollToItem(index: index, position: .visible, transition: transition, directionHint: .up, adjustForSection: false) } } @@ -444,7 +444,7 @@ final class ShareSearchContainerNode: ASDisplayNode, ShareContentContainerNode { var scrollToRecentItem: GridNodeScrollToItem? if !self.recentGridNode.isHidden, let ensurePeerVisibleOnLayout = self.ensurePeerVisibleOnLayout { self.ensurePeerVisibleOnLayout = nil - if let index = self.recentEntries.index(where: { + if let index = self.recentEntries.firstIndex(where: { switch $0 { case .topPeers: return false diff --git a/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift b/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift index fc6f852281..e6781913dd 100644 --- a/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift +++ b/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift @@ -71,9 +71,12 @@ public final class SolidRoundedButtonNode: ASDisplayNode { } public func updateTheme(_ theme: PresentationTheme) { + guard theme !== self.theme else { + return + } self.theme = theme - self.buttonBackgroundNode.image = generateStretchableFilledCircleImage(radius: cornerRadius, color: theme.list.itemCheckColors.fillColor) + self.buttonBackgroundNode.image = generateStretchableFilledCircleImage(radius: self.buttonCornerRadius, color: theme.list.itemCheckColors.fillColor) self.buttonGlossNode.color = theme.list.itemCheckColors.foregroundColor self.labelNode.attributedText = NSAttributedString(string: self.title ?? "", font: Font.medium(17.0), textColor: theme.list.itemCheckColors.foregroundColor) } diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift index cab64f5a93..7aabf8e95b 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift @@ -81,7 +81,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode { } deinit { - stickerFetchedDisposable.dispose() + self.stickerFetchedDisposable.dispose() } override func didLoad() { diff --git a/submodules/TelegramCore/TelegramCore/DeleteMessages.swift b/submodules/TelegramCore/TelegramCore/DeleteMessages.swift index 07fcdbdd46..c7baa9356e 100644 --- a/submodules/TelegramCore/TelegramCore/DeleteMessages.swift +++ b/submodules/TelegramCore/TelegramCore/DeleteMessages.swift @@ -29,12 +29,12 @@ public func deleteMessages(transaction: Transaction, mediaBox: MediaBox, ids: [M transaction.deleteMessages(ids) } -public func clearHistory(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId) { +public func clearHistory(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, namespaces: MessageIdNamespaces) { if peerId.namespace == Namespaces.Peer.SecretChat { transaction.withAllMessages(peerId: peerId, { message in removeMessageMedia(message: message, mediaBox: mediaBox) return true }) } - transaction.clearHistory(peerId) + transaction.clearHistory(peerId, namespaces: namespaces) } diff --git a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift index 6ddc2999b4..57c7e4d65f 100644 --- a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift +++ b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift @@ -90,16 +90,18 @@ public func clearHistoryInteractively(postbox: Postbox, peerId: PeerId, type: In return postbox.transaction { transaction -> Void in if peerId.namespace == Namespaces.Peer.CloudUser || peerId.namespace == Namespaces.Peer.CloudGroup || peerId.namespace == Namespaces.Peer.CloudChannel { cloudChatAddClearHistoryOperation(transaction: transaction, peerId: peerId, explicitTopMessageId: nil, type: CloudChatClearHistoryType(type)) - if type != .scheduledMessages { + if type == .scheduledMessages { + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peerId, namespaces: .just(Namespaces.Message.allScheduled)) + } else { var topIndex: MessageIndex? if let topMessageId = transaction.getTopPeerMessageId(peerId: peerId, namespace: Namespaces.Message.Cloud), let topMessage = transaction.getMessage(topMessageId) { topIndex = topMessage.index } - clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peerId) + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peerId, namespaces: .not(Namespaces.Message.allScheduled)) if let cachedData = transaction.getPeerCachedData(peerId: peerId) as? CachedChannelData, let migrationReference = cachedData.migrationReference { cloudChatAddClearHistoryOperation(transaction: transaction, peerId: migrationReference.maxMessageId.peerId, explicitTopMessageId: MessageId(peerId: migrationReference.maxMessageId.peerId, namespace: migrationReference.maxMessageId.namespace, id: migrationReference.maxMessageId.id + 1), type: CloudChatClearHistoryType(type)) - clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: migrationReference.maxMessageId.peerId) + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: migrationReference.maxMessageId.peerId, namespaces: .all) } if let topIndex = topIndex { if peerId.namespace == Namespaces.Peer.CloudUser { @@ -110,7 +112,7 @@ public func clearHistoryInteractively(postbox: Postbox, peerId: PeerId, type: In } } } else if peerId.namespace == Namespaces.Peer.SecretChat { - clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peerId) + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peerId, namespaces: .all) if let state = transaction.getPeerChatState(peerId) as? SecretChatState { var layer: SecretChatLayer? diff --git a/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift index 65e252cfb9..a3a49414c3 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift @@ -309,7 +309,7 @@ private func removeChat(transaction: Transaction, postbox: Postbox, network: Net |> then(deleteUser) |> then(reportSignal) |> then(postbox.transaction { transaction -> Void in - clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peer.id) + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peer.id, namespaces: .all) }) } else if peer.id.namespace == Namespaces.Peer.CloudUser { if let inputPeer = apiInputPeer(peer) { @@ -328,7 +328,7 @@ private func removeChat(transaction: Transaction, postbox: Postbox, network: Net return requestClearHistory(postbox: postbox, network: network, stateManager: stateManager, inputPeer: inputPeer, maxId: operation.topMessageId?.id ?? Int32.max - 1, justClear: false, type: operation.deleteGloballyIfPossible ? .forEveryone : .forLocalPeer) |> then(reportSignal) |> then(postbox.transaction { transaction -> Void in - clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peer.id) + clearHistory(transaction: transaction, mediaBox: postbox.mediaBox, peerId: peer.id, namespaces: .not(Namespaces.Message.allScheduled)) }) } else { return .complete() diff --git a/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift b/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift index ebbc7936db..7f8d13e396 100644 --- a/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift @@ -282,7 +282,7 @@ func processSecretChatIncomingDecryptedOperations(mediaBox: MediaBox, transactio deleteMessages(transaction: transaction, mediaBox: mediaBox, ids: filteredMessageIds) } case .clearHistory: - clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId) + clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId, namespaces: .all) case let .markMessagesContentAsConsumed(globallyUniqueIds): var messageIds: [MessageId] = [] for id in globallyUniqueIds { diff --git a/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift b/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift index fcfd0c524c..d0425ea25a 100644 --- a/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift +++ b/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift @@ -49,17 +49,17 @@ public func removePeerChat(account: Account, transaction: Transaction, mediaBox: } } } - clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId) + clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId, namespaces: .all) transaction.updatePeerChatListInclusion(peerId, inclusion: .notIncluded) transaction.removeOrderedItemListItem(collectionId: Namespaces.OrderedItemList.RecentlySearchedPeerIds, itemId: RecentPeerItemId(peerId).rawValue) } else { cloudChatAddRemoveChatOperation(transaction: transaction, peerId: peerId, reportChatSpam: reportChatSpam, deleteGloballyIfPossible: deleteGloballyIfPossible) if peerId.namespace == Namespaces.Peer.CloudUser { transaction.updatePeerChatListInclusion(peerId, inclusion: .notIncluded) - clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId) + clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId, namespaces: .all) } else if peerId.namespace == Namespaces.Peer.CloudGroup { transaction.updatePeerChatListInclusion(peerId, inclusion: .notIncluded) - clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId) + clearHistory(transaction: transaction, mediaBox: mediaBox, peerId: peerId, namespaces: .all) } else { transaction.updatePeerChatListInclusion(peerId, inclusion: .notIncluded) } diff --git a/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift b/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift index 5061a35ea5..e929d7f5ae 100644 --- a/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift +++ b/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift @@ -106,7 +106,11 @@ private func requestEditMessageInternal(account: Account, messageId: MessageId, case _ as TelegramMediaImage, _ as TelegramMediaFile: break default: - return (nil, nil, SimpleDictionary()) + if let _ = scheduleTime { + break + } else { + return (nil, nil, SimpleDictionary()) + } } } } diff --git a/submodules/TelegramCore/TelegramCore/SearchStickers.swift b/submodules/TelegramCore/TelegramCore/SearchStickers.swift index 42406113dd..d6a19fa05f 100644 --- a/submodules/TelegramCore/TelegramCore/SearchStickers.swift +++ b/submodules/TelegramCore/TelegramCore/SearchStickers.swift @@ -132,7 +132,7 @@ public func searchStickers(account: Account, query: String, scope: SearchSticker var searchQuery: ItemCollectionSearchQuery = .exact(ValueBoxKey(query)) if query == "\u{2764}" { - searchQuery = .matching([ValueBoxKey("\u{2764}"), ValueBoxKey("\u{2764}\u{fe0f}")]) + searchQuery = .any([ValueBoxKey("\u{2764}"), ValueBoxKey("\u{2764}\u{FE0F}")]) } var installedItems: [FoundStickerItem] = [] diff --git a/submodules/TelegramPresentationData/Sources/ComponentsThemes.swift b/submodules/TelegramPresentationData/Sources/ComponentsThemes.swift index f4e050c63c..3aeaff3705 100644 --- a/submodules/TelegramPresentationData/Sources/ComponentsThemes.swift +++ b/submodules/TelegramPresentationData/Sources/ComponentsThemes.swift @@ -3,50 +3,50 @@ import UIKit import Display public extension TabBarControllerTheme { - convenience public init(rootControllerTheme: PresentationTheme) { + convenience init(rootControllerTheme: PresentationTheme) { let theme = rootControllerTheme.rootController.tabBar self.init(backgroundColor: rootControllerTheme.list.plainBackgroundColor, tabBarBackgroundColor: theme.backgroundColor, tabBarSeparatorColor: theme.separatorColor, tabBarTextColor: theme.textColor, tabBarSelectedTextColor: theme.selectedIconColor, tabBarBadgeBackgroundColor: theme.badgeBackgroundColor, tabBarBadgeStrokeColor: theme.badgeStrokeColor, tabBarBadgeTextColor: theme.badgeTextColor) } } public extension NavigationBarTheme { - convenience public init(rootControllerTheme: PresentationTheme) { + convenience init(rootControllerTheme: PresentationTheme) { let theme = rootControllerTheme.rootController.navigationBar self.init(buttonColor: theme.buttonColor, disabledButtonColor: theme.disabledButtonColor, primaryTextColor: theme.primaryTextColor, backgroundColor: theme.backgroundColor, separatorColor: theme.separatorColor, badgeBackgroundColor: theme.badgeBackgroundColor, badgeStrokeColor: theme.badgeStrokeColor, badgeTextColor: theme.badgeTextColor) } } public extension NavigationBarStrings { - convenience public init(presentationStrings: PresentationStrings) { + convenience init(presentationStrings: PresentationStrings) { self.init(back: presentationStrings.Common_Back, close: presentationStrings.Common_Close) } } public extension NavigationBarPresentationData { - convenience public init(presentationData: PresentationData) { + convenience init(presentationData: PresentationData) { self.init(theme: NavigationBarTheme(rootControllerTheme: presentationData.theme), strings: NavigationBarStrings(presentationStrings: presentationData.strings)) } - convenience public init(presentationTheme: PresentationTheme, presentationStrings: PresentationStrings) { + convenience init(presentationTheme: PresentationTheme, presentationStrings: PresentationStrings) { self.init(theme: NavigationBarTheme(rootControllerTheme: presentationTheme), strings: NavigationBarStrings(presentationStrings: presentationStrings)) } } public extension ActionSheetControllerTheme { - convenience public init(presentationTheme: PresentationTheme) { + convenience init(presentationTheme: PresentationTheme) { let actionSheet = presentationTheme.actionSheet self.init(dimColor: actionSheet.dimColor, backgroundType: actionSheet.backgroundType == .light ? .light : .dark, itemBackgroundColor: actionSheet.itemBackgroundColor, itemHighlightedBackgroundColor: actionSheet.itemHighlightedBackgroundColor, standardActionTextColor: actionSheet.standardActionTextColor, destructiveActionTextColor: actionSheet.destructiveActionTextColor, disabledActionTextColor: actionSheet.disabledActionTextColor, primaryTextColor: actionSheet.primaryTextColor, secondaryTextColor: actionSheet.secondaryTextColor, controlAccentColor: actionSheet.controlAccentColor, controlColor: presentationTheme.list.disclosureArrowColor, switchFrameColor: presentationTheme.list.itemSwitchColors.frameColor, switchContentColor: presentationTheme.list.itemSwitchColors.contentColor, switchHandleColor: presentationTheme.list.itemSwitchColors.handleColor) } } public extension ActionSheetController { - convenience public init(presentationTheme: PresentationTheme) { + convenience init(presentationTheme: PresentationTheme) { self.init(theme: ActionSheetControllerTheme(presentationTheme: presentationTheme)) } } public extension AlertControllerTheme { - convenience public init(presentationTheme: PresentationTheme) { + convenience init(presentationTheme: PresentationTheme) { let actionSheet = presentationTheme.actionSheet self.init(backgroundType: actionSheet.backgroundType == .light ? .light : .dark, backgroundColor: actionSheet.itemBackgroundColor, separatorColor: actionSheet.itemHighlightedBackgroundColor, highlightedItemColor: actionSheet.itemHighlightedBackgroundColor, primaryColor: actionSheet.primaryTextColor, secondaryColor: actionSheet.secondaryTextColor, accentColor: actionSheet.controlAccentColor, destructiveColor: actionSheet.destructiveActionTextColor, disabledColor: actionSheet.disabledActionTextColor) } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 9085ebd739..db5367eb7f 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -25,7 +25,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr outgoingBubbleFillColor = accentColor let hsv = accentColor.hsv - accentColor = UIColor(hue: hsv.0, saturation: hsv.1 * 1.1, brightness: min(hsv.2, 0.77), alpha: 1.0) + accentColor = UIColor(hue: hsv.0, saturation: hsv.1 * 1.1, brightness: min(hsv.2, 0.7), alpha: 1.0) } else { outgoingPrimaryTextColor = .white outgoingSecondaryTextColor = UIColor(rgb: 0xffffff, alpha: 0.65) diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index d9d5fb6da7..34a16f9c57 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -4025,662 +4025,663 @@ public final class PresentationStrings { return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_1, _2, _3]) } public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3553]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3554]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3555]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3557]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3558]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3554]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3555]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3556]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3558]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3559]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3559]!, self._r[3559]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3561]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3562]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3563]!, self._r[3563]!, [_0]) + return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_0]) } - public var DialogList_Unread: String { return self._s[3564]! } + public var DialogList_Unread: String { return self._s[3565]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3565]!, self._r[3565]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3566]!, self._r[3566]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3566]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3567]! } + public var User_DeletedAccount: String { return self._s[3567]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3568]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_0]) + return formatWithArgumentRanges(self._s[3569]!, self._r[3569]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3569]! } - public var SharedMedia_CategoryMedia: String { return self._s[3570]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3571]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3572]! } - public var Watch_ChatList_Compose: String { return self._s[3573]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3574]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3575]! } - public var Watch_Microphone_Access: String { return self._s[3576]! } - public var Group_Setup_HistoryHeader: String { return self._s[3577]! } - public var Map_SetThisLocation: String { return self._s[3578]! } - public var Activity_UploadingPhoto: String { return self._s[3579]! } - public var Conversation_Edit: String { return self._s[3581]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3582]! } - public var Login_TermsOfServiceDecline: String { return self._s[3583]! } - public var Message_PinnedContactMessage: String { return self._s[3584]! } + public var UserInfo_NotificationsDefault: String { return self._s[3570]! } + public var SharedMedia_CategoryMedia: String { return self._s[3571]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3572]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3573]! } + public var Watch_ChatList_Compose: String { return self._s[3574]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3575]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3576]! } + public var Watch_Microphone_Access: String { return self._s[3577]! } + public var Group_Setup_HistoryHeader: String { return self._s[3578]! } + public var Map_SetThisLocation: String { return self._s[3579]! } + public var Activity_UploadingPhoto: String { return self._s[3580]! } + public var Conversation_Edit: String { return self._s[3582]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3583]! } + public var Login_TermsOfServiceDecline: String { return self._s[3584]! } + public var Message_PinnedContactMessage: String { return self._s[3585]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3585]!, self._r[3585]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3587]!, self._r[3587]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3587]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3589]! } + public var Appearance_LargeEmoji: String { return self._s[3588]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3590]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3591]!, self._r[3591]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3591]! } - public var Message_PinnedPhotoMessage: String { return self._s[3592]! } - public var Passport_FieldPhone: String { return self._s[3593]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3594]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3595]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3597]! } - public var Conversation_Call: String { return self._s[3598]! } - public var Common_TakePhoto: String { return self._s[3600]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3601]! } - public var Channel_NotificationLoading: String { return self._s[3602]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3592]! } + public var Message_PinnedPhotoMessage: String { return self._s[3593]! } + public var Passport_FieldPhone: String { return self._s[3594]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3595]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3596]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3598]! } + public var Conversation_Call: String { return self._s[3599]! } + public var Common_TakePhoto: String { return self._s[3601]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3602]! } + public var Channel_NotificationLoading: String { return self._s[3603]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0]) } + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_0]) + } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_1]) + return formatWithArgumentRanges(self._s[3606]!, self._r[3606]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3606]! } + public var Permissions_SiriTitle_v0: String { return self._s[3607]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3609]! } - public var Common_edit: String { return self._s[3610]! } - public var PrivacySettings_AuthSessions: String { return self._s[3611]! } - public var Month_ShortJune: String { return self._s[3612]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3613]! } - public var Call_ReportSend: String { return self._s[3614]! } - public var Watch_LastSeen_JustNow: String { return self._s[3615]! } - public var Notifications_MessageNotifications: String { return self._s[3616]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3617]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3619]! } - public var Group_Status: String { return self._s[3620]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3609]!, self._r[3609]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[3610]! } + public var Common_edit: String { return self._s[3611]! } + public var PrivacySettings_AuthSessions: String { return self._s[3612]! } + public var Month_ShortJune: String { return self._s[3613]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3614]! } + public var Call_ReportSend: String { return self._s[3615]! } + public var Watch_LastSeen_JustNow: String { return self._s[3616]! } + public var Notifications_MessageNotifications: String { return self._s[3617]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3618]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3620]! } + public var Group_Status: String { return self._s[3621]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3622]! } - public var ShareMenu_ShareTo: String { return self._s[3623]! } - public var Conversation_Moderate_Ban: String { return self._s[3624]! } + public var TextFormat_AddLinkTitle: String { return self._s[3623]! } + public var ShareMenu_ShareTo: String { return self._s[3624]! } + public var Conversation_Moderate_Ban: String { return self._s[3625]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_0]) + return formatWithArgumentRanges(self._s[3626]!, self._r[3626]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3626]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3627]! } + public var SharedMedia_ViewInChat: String { return self._s[3627]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3628]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_1]) + return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0]) + return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3632]! } - public var Appearance_ReduceMotion: String { return self._s[3633]! } + public var Map_OpenInHereMaps: String { return self._s[3633]! } + public var Appearance_ReduceMotion: String { return self._s[3634]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3635]!, self._r[3635]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3635]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3636]! } - public var PhotoEditor_Skip: String { return self._s[3637]! } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[3636]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3637]! } + public var PhotoEditor_Skip: String { return self._s[3638]! } + public func Call_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _1, _2) } public func ChatList_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _1, _2) + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } public func MuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _1, _2) } - public func StickerPack_StickerCount(_ value: Int32) -> String { + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(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[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _1, _2) } public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_Months(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) } public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, _1, _2) + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _1, _2) + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + public func ForwardedPolls(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChatList.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChatList.swift index e21dfcda23..acd39be630 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChatList.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChatList.swift @@ -1,7 +1,6 @@ import Foundation import UIKit import Display -import TelegramPresentationData private func generateStatusCheckImage(theme: PresentationTheme, single: Bool) -> UIImage? { return generateImage(CGSize(width: single ? 13.0 : 18.0, height: 13.0), rotatedContext: { size, context in diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift index 30417c5c09..10be928c5c 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift @@ -1,7 +1,6 @@ import Foundation import UIKit import Display -import TelegramPresentationData private func generateArrowImage(_ theme: PresentationTheme) -> UIImage? { return generateImage(CGSize(width: 7.0, height: 13.0), rotatedContext: { size, context in diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift index 8b8fc7b2cc..2ef6886592 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift @@ -1,7 +1,6 @@ import Foundation import UIKit import Display -import TelegramPresentationData private func generateShareButtonImage(theme: PresentationTheme) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.rootController.navigationBar.accentTextColor) diff --git a/submodules/TelegramPresentationData/Sources/StringPluralization.swift b/submodules/TelegramPresentationData/Sources/StringPluralization.swift index 6eccf01d42..8b4c8ad126 100644 --- a/submodules/TelegramPresentationData/Sources/StringPluralization.swift +++ b/submodules/TelegramPresentationData/Sources/StringPluralization.swift @@ -40,5 +40,7 @@ func presentationStringsPluralizationForm(_ lc: UInt32, _ value: Int32) -> Plura return .many case .other: return .other + @unknown default: + fatalError() } } diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift index 6ecb2c7cfd..e8b4efef12 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift @@ -107,6 +107,8 @@ private final class PhoneAndCountryNode: ASDisplayNode { self.phoneInputNode.numberField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance self.phoneInputNode.countryCodeField.textField.textColor = theme.list.itemPrimaryTextColor self.phoneInputNode.numberField.textField.textColor = theme.list.itemPrimaryTextColor + self.phoneInputNode.countryCodeField.textField.tintColor = theme.list.itemAccentColor + self.phoneInputNode.numberField.textField.tintColor = theme.list.itemAccentColor self.phoneInputNode.countryCodeField.textField.tintColor = theme.list.itemAccentColor self.phoneInputNode.numberField.textField.tintColor = theme.list.itemAccentColor diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift index 8c16e1952c..4b30dbbc48 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift @@ -108,6 +108,8 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.firstNameField.textField.textContentType = .givenName } + self.firstNameField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.firstNameField.textField.tintColor = theme.list.itemAccentColor self.lastNameField = TextFieldNode() self.lastNameField.textField.font = Font.regular(20.0) @@ -120,6 +122,8 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.lastNameField.textField.textContentType = .familyName } + self.lastNameField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.lastNameField.textField.tintColor = theme.list.itemAccentColor self.currentPhotoNode = ASImageNode() self.currentPhotoNode.isUserInteractionEnabled = false diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index fbc1ac2e5f..6fc99639b2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -543,6 +543,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G reactionItems.append(ReactionContextItem(value: value, text: text, path: path)) } } + if Namespaces.Message.allScheduled.contains(message.id.namespace) { + reactionItems = [] + } let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: reactionItems, recognizer: recognizer) strongSelf.currentContextController = controller controller.reactionSelected = { [weak controller] value in @@ -1395,6 +1398,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction else { return } + guard !strongSelf.presentationInterfaceState.isScheduledMessages else { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ScheduledMessages_PollUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + return + } if controllerInteraction.pollActionState.pollMessageIdsInProgress[id] == nil { controllerInteraction.pollActionState.pollMessageIdsInProgress[id] = opaqueIdentifier strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(id) @@ -2804,7 +2811,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } else { text = "\(count) messages selected" } - UIAccessibility.post(notification: UIAccessibility.Notification.announcement, argument: text) + UIAccessibility.post(notification: UIAccessibility.Notification.announcement, argument: text) } } }, deleteSelectedMessages: { [weak self] in @@ -4547,6 +4554,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.chatDisplayNode.updateChatPresentationInterfaceState(updatedChatPresentationInterfaceState, transition: transition, interactive: interactive) } + if let selectionState = self.presentationInterfaceState.interfaceState.selectionState, !selectionState.selectedIds.isEmpty { + self.chatTitleView?.titleContent = .custom(self.presentationData.strings.Conversation_SelectedMessages(Int32(selectionState.selectedIds.count))) + } else { + + } + if let button = leftNavigationButtonForChatInterfaceState(updatedChatPresentationInterfaceState, strings: updatedChatPresentationInterfaceState.strings, currentButton: self.leftNavigationButton, target: self, selector: #selector(self.leftNavigationButtonAction)) { if self.leftNavigationButton != button { var animated = transition.isAnimated @@ -4586,7 +4599,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G switch updatedChatPresentationInterfaceState.mode { case .standard: self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style - self.deferScreenEdgeGestures = [] + self.deferScreenEdgeGestures = [] case .overlay: self.statusBar.statusBarStyle = .Hide self.deferScreenEdgeGestures = [.top] @@ -7383,9 +7396,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let peer = peer as? TelegramUser { let recipientHandle = INPersonHandle(value: "tg\(peerId.id)", type: .unknown) let recipient = INPerson(personHandle: recipientHandle, nameComponents: nil, displayName: peer.displayTitle, image: nil, contactIdentifier: nil, customIdentifier: "tg\(peerId.id)") - let intent = INSendMessageIntent(recipients: [recipient], content: nil, groupName: nil, serviceName: nil, sender: nil) - let interaction = INInteraction(intent: intent, response: nil) interaction.direction = .outgoing interaction.donate { error in diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceInputContexts.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceInputContexts.swift index 4b14c69a62..a7345909f0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceInputContexts.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceInputContexts.swift @@ -258,7 +258,8 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte accessoryItems.append(.messageAutoremoveTimeout(peer.messageAutoremoveTimeout)) } } - if chatPresentationInterfaceState.interfaceState.composeInputState.inputText.length == 0 { + + if chatPresentationInterfaceState.interfaceState.composeInputState.inputText.length == 0 && chatPresentationInterfaceState.interfaceState.forwardMessageIds == nil { if chatPresentationInterfaceState.hasScheduledMessages { accessoryItems.append(.scheduledMessages) } diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift index 55fc4d6616..d3fdf95efa 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift @@ -169,13 +169,15 @@ func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState } var displayBotStartPanel = false - if let _ = chatPresentationInterfaceState.botStartPayload { - if let user = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramUser, user.botInfo != nil { - displayBotStartPanel = true - } - } else if let chatHistoryState = chatPresentationInterfaceState.chatHistoryState, case .loaded(true) = chatHistoryState { - if let user = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramUser, user.botInfo != nil { - displayBotStartPanel = true + if !chatPresentationInterfaceState.isScheduledMessages { + if let _ = chatPresentationInterfaceState.botStartPayload { + if let user = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramUser, user.botInfo != nil { + displayBotStartPanel = true + } + } else if let chatHistoryState = chatPresentationInterfaceState.chatHistoryState, case .loaded(true) = chatHistoryState { + if let user = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramUser, user.botInfo != nil { + displayBotStartPanel = true + } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 6e01bc0ca1..ec7696a61a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -400,7 +400,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil) self.reactionRecognizer = reactionRecognizer reactionRecognizer.availableReactions = { [weak self] in - guard let strongSelf = self, let item = strongSelf.item else { + guard let strongSelf = self, let item = strongSelf.item, !Namespaces.Message.allScheduled.contains(item.message.id.namespace) else { return [] } if strongSelf.selectionNode != nil { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift index 76b54dc82b..aed1d76ab6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessagePollBubbleContentNode.swift @@ -773,6 +773,9 @@ class ChatMessagePollBubbleContentNode: ChatMessageBubbleContentNode { canVote = true } } + if Namespaces.Message.allScheduled.contains(item.message.id.namespace) { + canVote = true + } return (boundingSize.width, { boundingWidth in var resultSize = CGSize(width: max(boundingSize.width, boundingWidth), height: boundingSize.height) diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift index dbe27e03d3..06bff51447 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift @@ -24,6 +24,8 @@ final class ChatScheduleTimeController: ViewController { private let currentTime: Int32? private let completion: (Int32) -> Void + private var presentationDataDisposable: Disposable? + init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32? = nil, completion: @escaping (Int32) -> Void) { self.context = context self.mode = mode @@ -32,6 +34,13 @@ final class ChatScheduleTimeController: ViewController { super.init(navigationBarPresentationData: nil) + self.presentationDataDisposable = (context.sharedContext.presentationData + |> deliverOnMainQueue).start(next: { [weak self] presentationData in + if let strongSelf = self { + strongSelf.controllerNode.updatePresentationData(presentationData) + } + }) + self.statusBar.statusBarStyle = .Ignore } @@ -39,6 +48,10 @@ final class ChatScheduleTimeController: ViewController { fatalError("init(coder:) has not been implemented") } + deinit { + self.presentationDataDisposable?.dispose() + } + override public func loadDisplayNode() { self.displayNode = ChatScheduleTimeControllerNode(context: self.context, mode: self.mode, currentTime: self.currentTime) self.controllerNode.completion = { [weak self] time in diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift index 37a54dc28b..2f1edf11ca 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift @@ -20,7 +20,6 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel private let contentContainerNode: ASDisplayNode private let contentBackgroundNode: ASImageNode private let titleNode: ASTextNode - private let separatorNode: ASDisplayNode private let cancelButton: HighlightableButtonNode private let doneButton: SolidRoundedButtonNode @@ -46,8 +45,6 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.dimNode = ASDisplayNode() self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5) - let roundedBackground = generateStretchableFilledCircleImage(radius: 16.0, color: self.presentationData.theme.actionSheet.opaqueItemBackgroundColor) - self.contentContainerNode = ASDisplayNode() self.contentContainerNode.isOpaque = false self.contentContainerNode.clipsToBounds = true @@ -55,7 +52,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.contentBackgroundNode = ASImageNode() self.contentBackgroundNode.displaysAsynchronously = false self.contentBackgroundNode.displayWithoutProcessing = true - self.contentBackgroundNode.image = roundedBackground + self.contentBackgroundNode.image = generateStretchableFilledCircleImage(radius: 16.0, color: self.presentationData.theme.actionSheet.opaqueItemBackgroundColor) let title: String switch mode { @@ -68,9 +65,6 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.titleNode = ASTextNode() self.titleNode.attributedText = NSAttributedString(string: title, font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor) - self.separatorNode = ASDisplayNode() - //self.separatorNode.backgroundColor = self.theme.controlColor - self.cancelButton = HighlightableButtonNode() self.cancelButton.setTitle(self.presentationData.strings.Common_Cancel, with: Font.regular(17.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal) @@ -107,7 +101,6 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.pickerView.timeZone = TimeZone.current self.pickerView.minuteInterval = 1 self.pickerView.setValue(self.presentationData.theme.actionSheet.primaryTextColor, forKey: "textColor") - self.contentContainerNode.view.addSubview(self.pickerView) self.pickerView.addTarget(self, action: #selector(self.datePickerUpdated), for: .valueChanged) @@ -116,6 +109,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel if let strongSelf = self { if strongSelf.pickerView.date < Date() { strongSelf.updateMinimumDate() + strongSelf.updateButtonTitle() strongSelf.pickerView.layer.addShakeAnimation() } else { strongSelf.doneButton.isUserInteractionEnabled = false @@ -128,6 +122,17 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.updateButtonTitle() } + func updatePresentationData(_ presentationData: PresentationData) { + self.presentationData = presentationData + + self.contentBackgroundNode.image = generateStretchableFilledCircleImage(radius: 16.0, color: self.presentationData.theme.actionSheet.opaqueItemBackgroundColor) + self.titleNode.attributedText = NSAttributedString(string: self.titleNode.attributedText?.string ?? "", font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor) + self.pickerView.setValue(self.presentationData.theme.actionSheet.primaryTextColor, forKey: "textColor") + + self.cancelButton.setTitle(self.presentationData.strings.Common_Cancel, with: Font.regular(17.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal) + self.doneButton.updateTheme(self.presentationData.theme) + } + private func updateMinimumDate(currentTime: Int32? = nil) { let timeZone = TimeZone(secondsFromGMT: 0)! var calendar = Calendar(identifier: .gregorian) @@ -137,16 +142,19 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel components.second = 0 let minute = (components.minute ?? 0) % 5 + let next1MinDate = calendar.date(byAdding: .minute, value: 1, to: calendar.date(from: components)!) + let next5MinDate = calendar.date(byAdding: .minute, value: 5 - minute, to: calendar.date(from: components)!) + if let date = calendar.date(byAdding: .day, value: 365, to: currentDate) { self.pickerView.maximumDate = date } - if let date = calendar.date(byAdding: .minute, value: 5 - minute, to: calendar.date(from: components)!) { - self.pickerView.minimumDate = date - if let currentTime = currentTime { + if let next1MinDate = next1MinDate, let next5MinDate = next5MinDate { + self.pickerView.minimumDate = next1MinDate + if let currentTime = currentTime, Double(currentTime) > currentDate.timeIntervalSince1970 { self.pickerView.date = Date(timeIntervalSince1970: Double(currentTime)) } else { - self.pickerView.date = date + self.pickerView.date = next5MinDate } } } @@ -300,6 +308,5 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.pickerView.frame = CGRect(origin: CGPoint(x: 0.0, y: 54.0), size: CGSize(width: contentFrame.width, height: pickerHeight)) transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame) - transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: titleHeight), size: CGSize(width: contentContainerFrame.size.width, height: UIScreenPixel))) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift b/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift index dd29ba6193..bfa4f44305 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift @@ -57,6 +57,7 @@ private final class ChatTextLinkEditInputFieldNode: ASDisplayNode, ASEditableTex self.textInputNode.autocapitalizationType = .none self.textInputNode.returnKeyType = .done self.textInputNode.autocorrectionType = .no + self.textInputNode.tintColor = theme.actionSheet.controlAccentColor self.placeholderNode = ASTextNode() self.placeholderNode.isUserInteractionEnabled = false @@ -75,9 +76,10 @@ private final class ChatTextLinkEditInputFieldNode: ASDisplayNode, ASEditableTex func updateTheme(_ theme: PresentationTheme) { self.theme = theme - self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 33.0, color: theme.actionSheet.inputHollowBackgroundColor, strokeColor: theme.actionSheet.inputBorderColor, strokeWidth: 1.0) - self.textInputNode.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 33.0, color: self.theme.actionSheet.inputHollowBackgroundColor, strokeColor: self.theme.actionSheet.inputBorderColor, strokeWidth: 1.0) + self.textInputNode.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance self.placeholderNode.attributedText = NSAttributedString(string: self.placeholderNode.attributedText?.string ?? "", font: Font.regular(17.0), textColor: self.theme.actionSheet.inputPlaceholderColor) + self.textInputNode.tintColor = self.theme.actionSheet.controlAccentColor } func updateLayout(width: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat { diff --git a/submodules/TelegramUI/TelegramUI/ChatTitleView.swift b/submodules/TelegramUI/TelegramUI/ChatTitleView.swift index cd1ab18e93..90f968a5e1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTitleView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTitleView.swift @@ -16,6 +16,7 @@ import ChatTitleActivityNode enum ChatTitleContent { case peer(peerView: PeerView, onlineMemberCount: Int32?, isScheduledMessages: Bool) case group([Peer]) + case custom(String) } private final class ChatTitleNetworkStatusNode: ASDisplayNode { @@ -182,7 +183,7 @@ final class ChatTitleView: UIView, NavigationBarTitleView { switch titleContent { case let .peer(peerView, _, isScheduledMessages): if isScheduledMessages { - if let peer = peerViewMainPeer(peerView), peerView.peerId == self.account.peerId { + if peerView.peerId == self.account.peerId { string = NSAttributedString(string: self.strings.ScheduledMessages_RemindersTitle, font: Font.medium(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor) } else { string = NSAttributedString(string: self.strings.ScheduledMessages_Title, font: Font.medium(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor) @@ -212,6 +213,8 @@ final class ChatTitleView: UIView, NavigationBarTitleView { } case .group: string = NSAttributedString(string: "Feed", font: Font.medium(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor) + case let .custom(text): + string = NSAttributedString(string: text, font: Font.medium(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor) } if let string = string, self.titleNode.attributedText == nil || !self.titleNode.attributedText!.isEqual(to: string) { @@ -263,7 +266,7 @@ final class ChatTitleView: UIView, NavigationBarTitleView { } } default: - break + inputActivitiesAllowed = false } } @@ -429,7 +432,7 @@ final class ChatTitleView: UIView, NavigationBarTitleView { } } } - case .group: + default: break } diff --git a/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift index 2440b470ec..5fdbbca17e 100644 --- a/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift @@ -67,7 +67,7 @@ final class ContactMultiselectionControllerNode: ASDisplayNode { } self.contactListNode = ContactListNode(context: context, presentation: .single(.natural(options: options, includeChatList: includeChatList)), filters: filters, selectionState: ContactListNodeGroupSelectionState()) - self.tokenListNode = EditableTokenListNode(theme: EditableTokenListNodeTheme(backgroundColor: self.presentationData.theme.rootController.navigationBar.backgroundColor, separatorColor: self.presentationData.theme.rootController.navigationBar.separatorColor, placeholderTextColor: self.presentationData.theme.list.itemPlaceholderTextColor, primaryTextColor: self.presentationData.theme.list.itemPrimaryTextColor, selectedTextColor: self.presentationData.theme.list.itemAccentColor, keyboardColor: self.presentationData.theme.chatList.searchBarKeyboardColor), placeholder: placeholder) + self.tokenListNode = EditableTokenListNode(theme: EditableTokenListNodeTheme(backgroundColor: self.presentationData.theme.rootController.navigationBar.backgroundColor, separatorColor: self.presentationData.theme.rootController.navigationBar.separatorColor, placeholderTextColor: self.presentationData.theme.list.itemPlaceholderTextColor, primaryTextColor: self.presentationData.theme.list.itemPrimaryTextColor, selectedTextColor: self.presentationData.theme.list.itemAccentColor, accentColor: self.presentationData.theme.list.itemAccentColor, keyboardColor: self.presentationData.theme.chatList.searchBarKeyboardColor), placeholder: placeholder) super.init() diff --git a/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift b/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift index 7fbd691ab8..f87bd36ea9 100644 --- a/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift +++ b/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift @@ -32,14 +32,16 @@ final class EditableTokenListNodeTheme { let placeholderTextColor: UIColor let primaryTextColor: UIColor let selectedTextColor: UIColor + let accentColor: UIColor let keyboardColor: PresentationThemeKeyboardColor - init(backgroundColor: UIColor, separatorColor: UIColor, placeholderTextColor: UIColor, primaryTextColor: UIColor, selectedTextColor: UIColor, keyboardColor: PresentationThemeKeyboardColor) { + init(backgroundColor: UIColor, separatorColor: UIColor, placeholderTextColor: UIColor, primaryTextColor: UIColor, selectedTextColor: UIColor, accentColor: UIColor, keyboardColor: PresentationThemeKeyboardColor) { self.backgroundColor = backgroundColor self.separatorColor = separatorColor self.placeholderTextColor = placeholderTextColor self.primaryTextColor = primaryTextColor self.selectedTextColor = selectedTextColor + self.accentColor = accentColor self.keyboardColor = keyboardColor } } @@ -123,12 +125,8 @@ final class EditableTokenListNode: ASDisplayNode, UITextFieldDelegate { self.textFieldNode.textField.textColor = theme.primaryTextColor self.textFieldNode.textField.autocorrectionType = .no self.textFieldNode.textField.returnKeyType = .done - switch theme.keyboardColor { - case .light: - self.textFieldNode.textField.keyboardAppearance = .default - case .dark: - self.textFieldNode.textField.keyboardAppearance = .dark - } + self.textFieldNode.textField.keyboardAppearance = theme.keyboardColor.keyboardAppearance + self.textFieldNode.textField.tintColor = theme.accentColor self.caretIndicatorNode = CaretIndicatorNode() self.caretIndicatorNode.isLayerBacked = true diff --git a/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift b/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift index bd33c25ea0..24942576cf 100644 --- a/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift +++ b/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift @@ -263,13 +263,8 @@ class PaneSearchBarNode: ASDisplayNode, UITextFieldDelegate { self.iconNode.image = generateLoupeIcon(color: theme.chat.inputMediaPanel.stickersSearchControlColor) self.clearButton.setImage(generateClearIcon(color: theme.chat.inputMediaPanel.stickersSearchControlColor), for: []) self.cancelButton.setAttributedTitle(NSAttributedString(string: strings.Common_Cancel, font: Font.regular(17.0), textColor: theme.chat.inputPanel.panelControlAccentColor), for: []) - - switch theme.chatList.searchBarKeyboardColor { - case .light: - self.textField.keyboardAppearance = .default - case .dark: - self.textField.keyboardAppearance = .dark - } + self.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textField.tintColor = theme.list.itemAccentColor if let (boundingSize, leftInset, rightInset) = self.validLayout { self.updateLayout(boundingSize: boundingSize, leftInset: leftInset, rightInset: rightInset, transition: .immediate) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 48966ed8aa8a59e95ddfcbf5e32580defb14d108..15581c43547a9ecd589f3acd25f4d61ad96340c7 100644 GIT binary patch delta 2681 zcmZuzYiwI*8TRYt#JSkc&DYpTZ0DXeZo8(i4oI6N&ZWdj+T-*BWA3T_r7^LOBOj*} z*iie69}}h1k$8W=)`>p|iNPv1P5S}sKte**a%(atZ7yw{X4Aw*!(~tyEAMygWY6U(7%)+`~W3K)bNT-PI$nR$=KZl&vkbCE{%2S2Zb zf8$Gk05^seFu{F1F$X^Q4}O0R8sNY9!W?DtA->LqA7R&@!J=M$x_6<_NyZ6kd$Df3QNiKAL#an%sO4QdigagUYiFa6yVZ4c%TsP z&qJ%%KuQZ4jf{%@;qLyfP`D>B7zhQzCx=J5a}jo5hcQYiStM|6tc>Ow53Pw6QRd2fmuU>oJv86H>wx3_|f%1PRtOeB)BKO{{s?N)ACsRamLv*V8zpctwU7ig9i{QUy72v$rvl-vaUG9&ZW7&8h^V8O%4|+ zO6i!toke45I_ccFwFu3g8q${0F_@Io<9>0RDn2}wE47wX`&9U;3lnxI$4oVpx$E-g z-BLX6KgxK6L?%ahKo4Gg3%uaPm)?SQz0ZtW4sez9r5KaBx&aF^& zHe(_~cxb^(8E``@zL84pO@Dg_pr)>SysulIZr6s7aN6X~q4^;D9gT&@$BH!4MRZD$P&Ox@Zue)xAO5C>EU$-LS6mIsgz>G@+>vlglj9* zXfw~j;tR&)sWemgzA~l#UT7gDi2HrId0!zXnz(?=MGekkBF#Dx?(CvaLkV zU2q)W{NN@U3N*~*19RGGxWW016 z1bw|uePeeOzITHrvFkPzK?7c0r?EGZU9&15tj2qrP~P2?zhGyXh!IIvnn_A~Qx~LJ zP{FxeT1dd>veN-=MJTP9$aH9gR@=p^1->fTOj0TuKkdl(b)DaTZClC>JRE zc#C{O2RBmZ4qFPt9Pj(_-W{mpj97ze__EeUzOD-4QGD(O4euc<#9T5bRCz{k#YZ^q|m}*a<1oHXOi8d;!xg+nn#J!gA=RJs1N9H_Gv;A zjni1Kfu=X_@wrfaq{va&tCi7DXHJG4!#qjo)&VSE0h@4`v^EV@{XNomm9NwBGpy4B z4U$~j(I2yMAk7j%67N)-k3EE|x2SW&d=gH)bQcPR5i+y#rDQJ@kI;MDHav}(*aU;; zD9Jv@*<%AefniZ3l@rge(^Bf(pfQF}UWP_tl*End`9gO^ersr(=@?0U8beEop<*mC z8E40Je3jG3aUTdqaq6@ZNyYe@If3C@^rb(ES8fw&zCoULZTAVhu5aR%4f@gZ1n0IB z-(032GT*}KHK^A=sZ-%t6}I1m@&jRV`qbdWG=Yd>pCSdXCpU1uI0xjhq@R;bBC&(Y zcezjJjkMJk&8@jUCbLv562TwSy+!<+#>1er2~~QgQ>9If?^a=qq;6cj0o8?Ck!Q4K z8?V!Z delta 2597 zcmZuzdrVvB758zufO!}QU~FS-^N1ajU`lA#Chgj|yb~PQ>_8t|;l};~cbI!!-|H;x zmZ|+?nx?fW%0HVnRnwBSQZ-E@B)k*e4ovGKY1X~kD9g@wDp_MMG*EUt)**`-LHqSsl6ypOk&~(U35HEe3B2(I`s7Z<(Y!ed+e#ue- zOAT;*oXk;ijBV#rhHuP}4tC)OGvI@A{CEcT2oRF z3V%9FTCtOlSHJp{#}Z|yHO{F6*Ji&fLj}Kp;hdS`%@8`iK>>+1|?iC!CM@1t@z=|QB^hZB~GJ&Vi zh=BzVwU+n|@7UF&QMOrc-$j7IPZ&l)nMX+^wJcT~$$7lG7SfLnCw~4u1&tef`~i(Y}b8wmbOYOjX4Z7L~@Sql~&nSWJ=Q z>OBN{aXkao#T}}ylIw_@?8f+JzQ48_XCS_2B6PpmQQ?D2Y zQFDG@Owm31l|(|dnsgW_#~W8j?QN^^5dH5h=z>lHTbI~>TNfAFOvd2cy);s=*3qk zmAYE;yo1}U5O)7REK9i$ zhgQJm@{~Y;Holk4TsGO1rhxqwnsPzQMtLCf?XICtE=%ilk4dv6RH~K7hj;Py^q< zPnM~_?#G`jgQxxh3d8S`J>6hsK%oc8(APmi%8}+$r8#m4Co-@P9>k_AMAAd}-U>M2 zo3E{dzv^LfW9A@v{|T%LX{mr%PKuXgA~k;Emy#n z%lS|r!&58Z79JZrNR@mcHq0MV9V>16OzoH#NTXzSNIOu8~EV!;4hXS zU-&MqtBk4V;`)7xmOCbfAwhKr4{y?78^+m1sB0FtgJps=C8?hkg+j!geIKp@a=g%N?v?GMKmck#!~%aY>eJD z<9|bs5@G!CUQyK|^cdbAY4j|7j~BH{;2&f*KAm!hItSY$33O$k1;%k?ojxRFT)s?i XtHRI2=awN?NRqoBy&3T3a7FwN*30fe diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index d796c3a9fd..1ba9d78e9b 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -11,7 +11,7 @@ import PhotoResources import LocalMediaResources private func wallpaperDatas(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(Data?, Data?, Bool), NoError> { - if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.index(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.index(where: { $0.representation == largestRepresentation }) { + if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) { let maybeFullSize: Signal if thumbnail, let file = fileReference?.media { @@ -284,7 +284,7 @@ public enum PatternWallpaperDrawMode { } private func patternWallpaperDatas(account: Account, accountManager: AccountManager, representations: [ImageRepresentationWithReference], mode: PatternWallpaperDrawMode, autoFetchFullSize: Bool = false) -> Signal<(Data?, Data?, Bool), NoError> { - if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.index(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.index(where: { $0.representation == largestRepresentation }) { + if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) { let size: CGSize? switch mode { diff --git a/submodules/WatchBridge/Sources/WatchRequestHandlers.swift b/submodules/WatchBridge/Sources/WatchRequestHandlers.swift index 3ff1d5fe49..5cf315186e 100644 --- a/submodules/WatchBridge/Sources/WatchRequestHandlers.swift +++ b/submodules/WatchBridge/Sources/WatchRequestHandlers.swift @@ -379,6 +379,8 @@ final class WatchMediaHandler: WatchRequestHandler { round = true case .large: targetSize = CGSize(width: 150, height: 150); + @unknown default: + fatalError() } return SSignal { subscriber in diff --git a/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift b/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift index 2b01d9e13c..c10344cfd0 100644 --- a/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift +++ b/submodules/WebSearchUI/Sources/WebSearchControllerNode.swift @@ -618,20 +618,15 @@ class WebSearchControllerNode: ASDisplayNode { } private func dequeueTransition() { - if let (transition, firstTime) = self.enqueuedTransitions.first { + if let (transition, _) = self.enqueuedTransitions.first { self.enqueuedTransitions.remove(at: 0) - let completion: (GridNodeDisplayedItemRange) -> Void = { [weak self] visibleRange in - if let strongSelf = self { - } - } - if let state = self.webSearchInterfaceState.state { self.recentQueriesNode.isHidden = !state.query.isEmpty } self.hasMore = transition.hasMore - self.gridNode.transaction(GridNodeTransaction(deleteItems: transition.deleteItems, insertItems: transition.insertItems, updateItems: transition.updateItems, scrollToItem: nil, updateLayout: nil, itemTransition: .immediate, stationaryItems: .none, updateFirstIndexInSectionOffset: nil, synchronousLoads: true), completion: completion) + self.gridNode.transaction(GridNodeTransaction(deleteItems: transition.deleteItems, insertItems: transition.insertItems, updateItems: transition.updateItems, scrollToItem: nil, updateLayout: nil, itemTransition: .immediate, stationaryItems: .none, updateFirstIndexInSectionOffset: nil, synchronousLoads: true), completion: { _ in }) } } From 5d86aaa057156531176897dca5b8d1d065d9059f Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 23 Aug 2019 08:46:16 +0300 Subject: [PATCH 26/86] Updated icons --- .../AvatarNode/Sources/AvatarNode.swift | 2 +- .../CallListUI/Sources/CallListCallItem.swift | 12 ++--- .../Sources/ChatListTitleProxyNode.swift | 38 +++++++------- .../Sources/ChatListTitleView.swift | 2 +- .../Sources/ContactListActionItem.swift | 2 +- submodules/Display/Display/TabBarNode.swift | 8 +-- .../ChatItemGalleryFooterContentNode.swift | 47 ++---------------- ...reIdDocumentGalleryFooterContentNode.swift | 2 +- .../AvatarGalleryItemFooterContentNode.swift | 2 +- .../Themes/ThemeGridSelectionPanelNode.swift | 16 +++--- .../Sources/DefaultDayPresentationTheme.swift | 26 +++++----- .../PresentationThemeEssentialGraphics.swift | 4 +- .../Resources/PresentationResourcesChat.swift | 4 +- .../SavedMessagesIcon.imageset/Contents.json | 12 +---- .../SavedMessagesIcon@2x.png | Bin 370 -> 0 bytes .../SavedMessagesIcon@3x.png | Bin 505 -> 0 bytes .../ic_av_savedmessages (2).pdf} | Bin 4079 -> 4021 bytes .../InfoButton.imageset/CallInfoIcon@2x.png | Bin 598 -> 0 bytes .../InfoButton.imageset/CallInfoIcon@3x.png | Bin 932 -> 0 bytes .../InfoButton.imageset/Contents.json | 12 +---- .../InfoButton.imageset/ic_info.pdf} | Bin 5817 -> 4225 bytes .../OutgoingIcon.imageset/CallOutgoing@2x.png | Bin 369 -> 0 bytes .../OutgoingIcon.imageset/CallOutgoing@3x.png | Bin 556 -> 0 bytes .../OutgoingIcon.imageset/Contents.json | 12 +---- .../OutgoingIcon.imageset/ic_outgoingcall.pdf | Bin 0 -> 4463 bytes .../Chat List/AddIcon.imageset/Contents.json | 11 +--- .../ModernNavigationAddButtonIcon@2x.png | Bin 112 -> 0 bytes .../Chat List/AddIcon.imageset/ic_add.pdf | Bin 0 -> 4043 bytes .../ComposeIcon.imageset/Contents.json | 12 +---- .../ComposeIcon.imageset/ic_create.pdf | Bin 0 -> 4392 bytes .../ComposeIcon.imageset/newchat@2x.png | Bin 950 -> 0 bytes .../ComposeIcon.imageset/newchat@3x.png | Bin 1400 -> 0 bytes .../ActionsWhiteIcon@2x.png | Bin 210 -> 0 bytes .../ActionsWhiteIcon@3x.png | Bin 628 -> 0 bytes .../NavigationShare.imageset/Contents.json | 12 +---- .../ic_share.pdf} | Bin 4372 -> 4321 bytes .../ProxyCheckIcon.imageset/Contents.json | 12 +++++ .../ic_proxyenabled.pdf | Bin 0 -> 4026 bytes .../ProxyOnIcon.imageset/Contents.json | 12 +++++ .../ProxyOnIcon.imageset/ic_proxydisabled.pdf | Bin 0 -> 4188 bytes .../ProxyShieldIcon.imageset/Contents.json | 12 +++++ .../ProxyShieldIcon.imageset/ic_proxymain.pdf | Bin 0 -> 4460 bytes .../SearchIcon.imageset/Contents.json | 12 +---- .../PanelSearchIcon@2x.png | Bin 654 -> 0 bytes .../PanelSearchIcon@3x.png | Bin 909 -> 0 bytes .../SearchIcon.imageset/ic_search (2).pdf | Bin 0 -> 4085 bytes .../Tabs/IconCalls.imageset/Contents.json | 2 +- .../ic_tb_calls.pdf} | Bin 4341 -> 4315 bytes .../Tabs/IconChats.imageset/Contents.json | 2 +- .../Tabs/IconChats.imageset/ic_tb_chats.pdf | Bin 0 -> 4304 bytes .../Tabs/IconContacts.imageset/Contents.json | 2 +- .../IconContacts.imageset/ic_tb_contacts.pdf | Bin 0 -> 4259 bytes .../Tabs/IconSettings.imageset/Contents.json | 2 +- .../IconSettings.imageset/ic_tb_settings.pdf | Bin 0 -> 6245 bytes .../Chat List/Tabs/NY/Contents.json | 9 ---- .../Tabs/NY/IconCalls.imageset/Calls@2x.png | Bin 1887 -> 0 bytes .../Tabs/NY/IconCalls.imageset/Calls@3x.png | Bin 2875 -> 0 bytes .../Tabs/NY/IconCalls.imageset/Contents.json | 22 -------- .../Tabs/NY/IconChats.imageset/Contents.json | 22 -------- .../NY/IconChats.imageset/Messages@2x.png | Bin 2661 -> 0 bytes .../NY/IconChats.imageset/Messages@3x.png | Bin 4107 -> 0 bytes .../NY/IconContacts.imageset/Contacts@2x.png | Bin 2073 -> 0 bytes .../NY/IconContacts.imageset/Contacts@3x.png | Bin 3350 -> 0 bytes .../NY/IconContacts.imageset/Contents.json | 22 -------- .../NY/IconSettings.imageset/Contents.json | 22 -------- .../NY/IconSettings.imageset/Settings@2x.png | Bin 2231 -> 0 bytes .../NY/IconSettings.imageset/Settings@3x.png | Bin 3452 -> 0 bytes .../Info/CallButton.imageset/Contents.json | 12 +---- .../CallButton.imageset/TabIconCalls@2x.png | Bin 1006 -> 0 bytes .../CallButton.imageset/TabIconCalls@3x.png | Bin 1551 -> 0 bytes .../Info/CallButton.imageset/ic_phone.pdf | Bin 0 -> 4735 bytes .../CloseButton.imageset/Contents.json | 21 -------- .../ReplyPanelClose@2x.png | Bin 170 -> 0 bytes .../ActionsWhiteIcon@2x.png | Bin 210 -> 0 bytes .../ActionsWhiteIcon@3x.png | Bin 628 -> 0 bytes .../Contents.json | 12 +---- .../ic_share.pdf | Bin 0 -> 4321 bytes .../Contents.json | 11 +--- .../ModernConversationActionForward@2x.png | Bin 749 -> 0 bytes .../ic_forward.pdf | Bin 0 -> 4293 bytes .../ic_report.pdf | Bin 4731 -> 4125 bytes .../Contents.json | 21 -------- .../ModernConversationActionDelete@2x.png | Bin 747 -> 0 bytes .../Contents.json | 12 +++++ .../ic_delete.pdf | Bin 0 -> 4692 bytes .../Search/Calendar.imageset/Contents.json | 12 +---- .../ConversationSearchCalendar@2x.png | Bin 582 -> 0 bytes .../ConversationSearchCalendar@3x.png | Bin 799 -> 0 bytes .../Search/Calendar.imageset/ic_calendar.pdf | Bin 0 -> 4422 bytes .../Search/DownButton.imageset/Contents.json | 12 +---- .../InlineSearchDown@2x.png | Bin 251 -> 0 bytes .../InlineSearchDown@3x.png | Bin 320 -> 0 bytes .../DownButton.imageset/ic_downarrow.pdf | Bin 0 -> 3971 bytes .../Search/Members.imageset/Contents.json | 12 +---- .../ConversationSearchUser@2x.png | Bin 1169 -> 0 bytes .../ConversationSearchUser@3x.png | Bin 1757 -> 0 bytes .../Search/Members.imageset/ic_member.pdf | Bin 0 -> 4302 bytes .../Search/UpButton.imageset/Contents.json | 12 +---- .../UpButton.imageset/InlineSearchUp@2x.png | Bin 230 -> 0 bytes .../UpButton.imageset/InlineSearchUp@3x.png | Bin 319 -> 0 bytes .../Search/UpButton.imageset/ic_uparrow.pdf | Bin 0 -> 3976 bytes .../Contents.json | 12 +++++ .../ic_ch_file.pdf | Bin 0 -> 4154 bytes .../Contents.json | 22 -------- .../ModernMessageDocumentIconIncoming@2x.png | Bin 202 -> 0 bytes .../ModernMessageDocumentIconIncoming@3x.png | Bin 238 -> 0 bytes .../Contents.json | 22 -------- .../ModernMessageDocumentIconOutgoing@2x.png | Bin 209 -> 0 bytes .../ModernMessageDocumentIconOutgoing@3x.png | Bin 238 -> 0 bytes .../InfoIcon.imageset/Contents.json | 12 +---- .../InfoIcon.imageset/PanelInfoIcon@2x.png | Bin 706 -> 0 bytes .../InfoIcon.imageset/PanelInfoIcon@3x.png | Bin 1116 -> 0 bytes .../InfoIcon.imageset/ic_info.pdf | Bin 0 -> 4225 bytes .../MuteIcon.imageset/Contents.json | 12 +++++ .../MuteIcon.imageset/ic_mute.pdf | Bin 0 -> 4898 bytes .../ReportIcon.imageset/Contents.json | 12 +---- .../PanelReportIcon@2x.png | Bin 845 -> 0 bytes .../PanelReportIcon@3x.png | Bin 1242 -> 0 bytes .../ReportIcon.imageset/ic_report.pdf | Bin 0 -> 4125 bytes .../SearchIcon.imageset/Contents.json | 12 +---- .../PanelSearchIcon@2x.png | Bin 654 -> 0 bytes .../PanelSearchIcon@3x.png | Bin 909 -> 0 bytes .../SearchIcon.imageset/ic_search (2).pdf | Bin 0 -> 4085 bytes .../UnarchiveIcon.imageset/Contents.json | 12 +---- .../UnarchiveIcon.imageset/ic_unarchive.pdf | Bin 0 -> 4399 bytes .../UnarchiveIcon.imageset/unarchive@2x.png | Bin 840 -> 0 bytes .../UnarchiveIcon.imageset/unarchive@3x.png | Bin 924 -> 0 bytes .../UnmuteIcon.imageset/Contents.json | 12 +++++ .../UnmuteIcon.imageset/ic_unmute.pdf | Bin 0 -> 4653 bytes .../AddMemberIcon.imageset/Contents.json | 12 +---- .../ModernContactListAddMemberIcon@2x.png | Bin 1294 -> 0 bytes .../ModernContactListAddMemberIcon@3x.png | Bin 1840 -> 0 bytes .../AddMemberIcon.imageset/ic_addmember.pdf | Bin 0 -> 4497 bytes .../Contents.json | 12 +---- .../ModernContactListBroadcastIcon@2x.png | Bin 981 -> 0 bytes .../ModernContactListBroadcastIcon@3x.png | Bin 1344 -> 0 bytes .../ic_channel.pdf | Bin 0 -> 4877 bytes .../Contents.json | 12 +---- .../ModernContactListCreateGroupIcon@2x.png | Bin 1630 -> 0 bytes .../ModernContactListCreateGroupIcon@3x.png | Bin 2243 -> 0 bytes .../ic_group.pdf | Bin 0 -> 4735 bytes .../Contents.json | 12 +---- ...dernContactListCreateSecretChatIcon@2x.png | Bin 1557 -> 0 bytes ...dernContactListCreateSecretChatIcon@3x.png | Bin 2008 -> 0 bytes .../ic_secretchat.pdf | Bin 0 -> 4126 bytes .../InviteActionIcon.imageset/Contents.json | 12 +---- .../ModernContactListInviteIcon@2x.png | Bin 1460 -> 0 bytes .../ModernContactListInviteIcon@3x.png | Bin 2024 -> 0 bytes .../InviteActionIcon.imageset/ic_heart.pdf | Bin 0 -> 4236 bytes .../LinkActionIcon.imageset/Contents.json | 12 +---- .../ModernContactListInviteFriendsIcon@2x.png | Bin 860 -> 0 bytes .../ModernContactListInviteFriendsIcon@3x.png | Bin 1209 -> 0 bytes .../LinkActionIcon.imageset/ic_link.pdf | Bin 0 -> 4545 bytes .../PeopleNearbyIcon.imageset/Contents.json | 12 +---- .../PeopleNearbyIcon.imageset/ic_location.pdf | Bin 0 -> 4276 bytes .../locationcontacts@2x.png | Bin 619 -> 0 bytes .../locationcontacts@3x.png | Bin 736 -> 0 bytes .../SearchIcon.imageset/Contents.json | 22 -------- .../SearchIcon.imageset/ic_search@2x.png | Bin 945 -> 0 bytes .../SearchIcon.imageset/ic_search@3x.png | Bin 645 -> 0 bytes .../CreateGroupIcon.imageset/Contents.json | 12 +---- .../createlocalgroup@2x.png | Bin 2316 -> 0 bytes .../createlocalgroup@3x.png | Bin 3683 -> 0 bytes .../CreateGroupIcon.imageset/ic_addgroup.pdf | Bin 0 -> 4995 bytes .../BackwardButton.imageset/Contents.json | 12 +---- .../VideoPlayerBackwardIcon@2x.png | Bin 903 -> 0 bytes .../VideoPlayerBackwardIcon@3x.png | Bin 1264 -> 0 bytes .../BackwardButton.imageset/ic_goback15.pdf | Bin 0 -> 4890 bytes .../ForwardButton.imageset/Contents.json | 12 +---- .../VideoPlayerForwardIcon@2x.png | Bin 945 -> 0 bytes .../VideoPlayerForwardIcon@3x.png | Bin 1298 -> 0 bytes .../ForwardButton.imageset/ic_go15.pdf | Bin 0 -> 4883 bytes .../PauseButton.imageset/Contents.json | 12 +++++ .../PauseButton.imageset/ic_pause.pdf | Bin 0 -> 3977 bytes .../Contents.json | 11 +--- .../EmbedVideoPIPIcon@2x.png | Bin 1198 -> 0 bytes .../ic_pictureinpicture.pdf | Bin 0 -> 4515 bytes .../PlayButton.imageset/Contents.json | 12 +++++ .../PlayButton.imageset/ic_play.pdf | Bin 0 -> 4041 bytes .../Share/SearchIcon.imageset/Contents.json | 12 +---- .../ShareSearchIcon@2x.png | Bin 511 -> 0 bytes .../ShareSearchIcon@3x.png | Bin 758 -> 0 bytes .../SearchIcon.imageset/ic_search (2).pdf | Bin 0 -> 4085 bytes .../Share/ShareIcon.imageset/Contents.json | 12 +---- .../ShareExternalIcon@2x.png | Bin 240 -> 0 bytes .../ShareExternalIcon@3x.png | Bin 240 -> 0 bytes .../Share/ShareIcon.imageset/ic_share.pdf | Bin 0 -> 4321 bytes .../ChatMessageSelectionInputPanelNode.swift | 12 ++--- .../ChatRecordingPreviewInputPanelNode.swift | 2 +- .../LegacyInstantVideoController.swift | 2 +- 190 files changed, 213 insertions(+), 658 deletions(-) delete mode 100644 submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/SavedMessagesIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/SavedMessagesIcon@3x.png rename submodules/TelegramUI/Images.xcassets/{Chat List/Tabs/IconCalls.imageset/ic_calls.pdf => Avatar/SavedMessagesIcon.imageset/ic_av_savedmessages (2).pdf} (78%) delete mode 100644 submodules/TelegramUI/Images.xcassets/Call List/InfoButton.imageset/CallInfoIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Call List/InfoButton.imageset/CallInfoIcon@3x.png rename submodules/TelegramUI/Images.xcassets/{Chat List/Tabs/IconSettings.imageset/ic_settings.pdf => Call List/InfoButton.imageset/ic_info.pdf} (55%) delete mode 100644 submodules/TelegramUI/Images.xcassets/Call List/OutgoingIcon.imageset/CallOutgoing@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Call List/OutgoingIcon.imageset/CallOutgoing@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Call List/OutgoingIcon.imageset/ic_outgoingcall.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/ModernNavigationAddButtonIcon@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/ic_add.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/ic_create.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/newchat@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/newchat@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/NavigationShare.imageset/ActionsWhiteIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/NavigationShare.imageset/ActionsWhiteIcon@3x.png rename submodules/TelegramUI/Images.xcassets/Chat List/{Tabs/IconContacts.imageset/ic_contacts.pdf => NavigationShare.imageset/ic_share.pdf} (73%) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ProxyCheckIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ProxyCheckIcon.imageset/ic_proxyenabled.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ProxyOnIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ProxyOnIcon.imageset/ic_proxydisabled.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ProxyShieldIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/ProxyShieldIcon.imageset/ic_proxymain.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/PanelSearchIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/PanelSearchIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/ic_search (2).pdf rename submodules/TelegramUI/Images.xcassets/Chat List/Tabs/{IconChats.imageset/ic_chats.pdf => IconCalls.imageset/ic_tb_calls.pdf} (74%) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/ic_tb_chats.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconContacts.imageset/ic_tb_contacts.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconSettings.imageset/ic_tb_settings.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Calls@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Calls@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Messages@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Messages@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contacts@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contacts@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Settings@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Settings@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/TabIconCalls@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/TabIconCalls@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/ic_phone.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/CloseButton.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/CloseButton.imageset/ReplyPanelClose@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionAction.imageset/ActionsWhiteIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionAction.imageset/ActionsWhiteIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionAction.imageset/ic_share.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionForward.imageset/ModernConversationActionForward@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionForward.imageset/ic_forward.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionThrash.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionThrash.imageset/ModernConversationActionDelete@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionTrash.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionTrash.imageset/ic_delete.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ConversationSearchCalendar@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ConversationSearchCalendar@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ic_calendar.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/DownButton.imageset/InlineSearchDown@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/DownButton.imageset/InlineSearchDown@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/DownButton.imageset/ic_downarrow.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ConversationSearchUser@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ConversationSearchUser@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ic_member.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/UpButton.imageset/InlineSearchUp@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/UpButton.imageset/InlineSearchUp@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Input/Search/UpButton.imageset/ic_uparrow.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocument.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocument.imageset/ic_ch_file.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/ModernMessageDocumentIconIncoming@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/ModernMessageDocumentIconIncoming@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/ModernMessageDocumentIconOutgoing@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/ModernMessageDocumentIconOutgoing@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/InfoIcon.imageset/PanelInfoIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/InfoIcon.imageset/PanelInfoIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/InfoIcon.imageset/ic_info.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/MuteIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/MuteIcon.imageset/ic_mute.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/PanelReportIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/PanelReportIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/ic_report.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/PanelSearchIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/PanelSearchIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/ic_search (2).pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/ic_unarchive.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/unarchive@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/unarchive@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnmuteIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnmuteIcon.imageset/ic_unmute.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/AddMemberIcon.imageset/ModernContactListAddMemberIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/AddMemberIcon.imageset/ModernContactListAddMemberIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/AddMemberIcon.imageset/ic_addmember.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateChannelActionIcon.imageset/ModernContactListBroadcastIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateChannelActionIcon.imageset/ModernContactListBroadcastIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateChannelActionIcon.imageset/ic_channel.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/ModernContactListCreateGroupIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/ModernContactListCreateGroupIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/ic_group.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateSecretChatActionIcon.imageset/ModernContactListCreateSecretChatIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateSecretChatActionIcon.imageset/ModernContactListCreateSecretChatIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/CreateSecretChatActionIcon.imageset/ic_secretchat.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/ModernContactListInviteIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/ModernContactListInviteIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/ic_heart.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ModernContactListInviteFriendsIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ModernContactListInviteFriendsIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ic_link.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/ic_location.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/locationcontacts@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/locationcontacts@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/ic_search@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/ic_search@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/ic_addgroup.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/VideoPlayerBackwardIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/VideoPlayerBackwardIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/ic_goback15.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/VideoPlayerForwardIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/VideoPlayerForwardIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/ic_go15.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/PauseButton.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/PauseButton.imageset/ic_pause.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/EmbedVideoPIPIcon@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/ic_pictureinpicture.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/PlayButton.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/PlayButton.imageset/ic_play.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/ShareSearchIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/ShareSearchIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/ic_search (2).pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ShareExternalIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ShareExternalIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ic_share.pdf diff --git a/submodules/AvatarNode/Sources/AvatarNode.swift b/submodules/AvatarNode/Sources/AvatarNode.swift index ce9632d16f..a3f234237b 100644 --- a/submodules/AvatarNode/Sources/AvatarNode.swift +++ b/submodules/AvatarNode/Sources/AvatarNode.swift @@ -9,7 +9,7 @@ import TelegramPresentationData import AnimationUI private let deletedIcon = UIImage(bundleImageName: "Avatar/DeletedIcon")?.precomposed() -private let savedMessagesIcon = UIImage(bundleImageName: "Avatar/SavedMessagesIcon")?.precomposed() +private let savedMessagesIcon = generateTintedImage(image: UIImage(bundleImageName: "Avatar/SavedMessagesIcon"), color: .white) private let archivedChatsIcon = UIImage(bundleImageName: "Avatar/ArchiveAvatarIcon")?.precomposed() public enum AvatarNodeClipStyle { diff --git a/submodules/CallListUI/Sources/CallListCallItem.swift b/submodules/CallListUI/Sources/CallListCallItem.swift index af0bf0d125..c21381da8e 100644 --- a/submodules/CallListUI/Sources/CallListCallItem.swift +++ b/submodules/CallListUI/Sources/CallListCallItem.swift @@ -317,7 +317,7 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { var leftInset: CGFloat = 86.0 + params.leftInset let rightInset: CGFloat = 13.0 + params.rightInset - var infoIconRightInset: CGFloat = rightInset + var infoIconRightInset: CGFloat = rightInset - 1.0 let insets: UIEdgeInsets let separatorHeight = UIScreenPixel @@ -335,7 +335,7 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { insets = itemListNeighborsGroupedInsets(neighbors) } - var dateRightInset: CGFloat = 43.0 + params.rightInset + var dateRightInset: CGFloat = 46.0 + params.rightInset if item.editing { leftInset += editingOffset dateRightInset += 5.0 @@ -558,7 +558,7 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { if strongSelf.typeIconNode.image !== outgoingIcon { strongSelf.typeIconNode.image = outgoingIcon } - transition.updateFrameAdditive(node: strongSelf.typeIconNode, frame: CGRect(origin: CGPoint(x: revealOffset + leftInset - 76.0, y: floor((nodeLayout.contentSize.height - outgoingIcon.size.height) / 2.0)), size: outgoingIcon.size)) + transition.updateFrameAdditive(node: strongSelf.typeIconNode, frame: CGRect(origin: CGPoint(x: revealOffset + leftInset - 81.0, y: floor((nodeLayout.contentSize.height - outgoingIcon.size.height) / 2.0)), size: outgoingIcon.size)) } strongSelf.typeIconNode.isHidden = !hasOutgoing @@ -653,9 +653,9 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { let leftInset: CGFloat = 86.0 + params.leftInset + editingOffset let rightInset: CGFloat = 13.0 + params.rightInset - var infoIconRightInset: CGFloat = rightInset + var infoIconRightInset: CGFloat = rightInset - 1.0 - var dateRightInset: CGFloat = 43.0 + params.rightInset + var dateRightInset: CGFloat = 46.0 + params.rightInset if item.editing { dateRightInset += 5.0 infoIconRightInset -= 36.0 @@ -669,7 +669,7 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode { transition.updateFrameAdditive(node: self.dateNode, frame: CGRect(origin: CGPoint(x: editingOffset + revealOffset + self.bounds.size.width - dateRightInset - self.dateNode.bounds.size.width, y: self.dateNode.frame.minY), size: self.dateNode.bounds.size)) - transition.updateFrameAdditive(node: self.typeIconNode, frame: CGRect(origin: CGPoint(x: revealOffset + leftInset - 76.0, y: self.typeIconNode.frame.minY), size: self.typeIconNode.bounds.size)) + transition.updateFrameAdditive(node: self.typeIconNode, frame: CGRect(origin: CGPoint(x: revealOffset + leftInset - 81.0, y: self.typeIconNode.frame.minY), size: self.typeIconNode.bounds.size)) transition.updateFrameAdditive(node: self.infoButtonNode, frame: CGRect(origin: CGPoint(x: revealOffset + self.bounds.size.width - infoIconRightInset - self.infoButtonNode.bounds.width, y: self.infoButtonNode.frame.minY), size: self.infoButtonNode.bounds.size)) } diff --git a/submodules/ChatListUI/Sources/ChatListTitleProxyNode.swift b/submodules/ChatListUI/Sources/ChatListTitleProxyNode.swift index 88c0342d2c..645e5dd761 100644 --- a/submodules/ChatListUI/Sources/ChatListTitleProxyNode.swift +++ b/submodules/ChatListUI/Sources/ChatListTitleProxyNode.swift @@ -12,24 +12,24 @@ enum ChatTitleProxyStatus { } private func generateIcon(color: UIColor, connected: Bool, off: Bool) -> UIImage? { - return generateImage(CGSize(width: 18.0, height: 22.0), rotatedContext: { size, context in + return generateImage(CGSize(width: 30.0, height: 30.0), rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) - context.setStrokeColor(color.cgColor) - context.setFillColor(color.cgColor) - context.scaleBy(x: 0.3333, y: 0.3333) - context.setLineWidth(3.0) - - let _ = try? drawSvgPath(context, path: "M27,1.6414763 L1.5,12.9748096 L1.5,30 C1.5,45.9171686 12.4507463,60.7063193 27,64.4535514 C41.5492537,60.7063193 52.5,45.9171686 52.5,30 L52.5,12.9748096 L27,1.6414763 S") + context.translateBy(x: size.width / 2.0, y: size.height / 2.0) + context.scaleBy(x: 1.0, y: -1.0) + context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) + if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat List/ProxyShieldIcon"), color: color) { + context.draw(image.cgImage!, in: CGRect(origin: CGPoint(), size: image.size)) + } if connected { - let _ = try? drawSvgPath(context, path: "M15.5769231,34.1735387 L23.5896918,42.2164446 C23.6840928,42.3112006 23.8352513,42.30478 23.9262955,42.2032393 L40.5,23.71875 S") + if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat List/ProxyCheckIcon"), color: color) { + context.draw(image.cgImage!, in: CGRect(origin: CGPoint(), size: image.size)) + } } else if off { - let _ = try? drawSvgPath(context, path: "M27.5,15 C28.3284271,15 29,15.6715729 29,16.5 L29,28.5 C29,29.3284271 28.3284271,30 27.5,30 C26.6715729,30 26,29.3284271 26,28.5 L26,16.5 C26,15.6715729 26.6715729,15 27.5,15 Z") - context.translateBy(x: 27.0, y: 33.0) - context.rotate(by: 2.35619) - context.translateBy(x: -27.0, y: -33.0) - let _ = try? drawSvgPath(context, path: "M27,47 C34.7319865,47 41,40.7319865 41,33 C41,25.2680135 34.7319865,19 27,19 C19.2680135,19 13,25.2680135 13,33 S") + if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat List/ProxyOnIcon"), color: color) { + context.draw(image.cgImage!, in: CGRect(origin: CGPoint(), size: image.size)) + } } }) } @@ -49,7 +49,7 @@ final class ChatTitleProxyNode: ASDisplayNode { case .available: self.iconNode.image = generateIcon(color: theme.rootController.navigationBar.accentTextColor, connected: false, off: true) } - self.activityIndicator.type = .custom(theme.rootController.navigationBar.accentTextColor, 10.0, 1.0, true) + self.activityIndicator.type = .custom(theme.rootController.navigationBar.accentTextColor, 10.0, 1.3333, true) } } } @@ -57,7 +57,7 @@ final class ChatTitleProxyNode: ASDisplayNode { var status: ChatTitleProxyStatus = .connected { didSet { if self.status != oldValue { - switch status { + switch self.status { case .connecting: self.activityIndicator.isHidden = false self.iconNode.image = generateIcon(color: theme.rootController.navigationBar.accentTextColor, connected: false, off: false) @@ -81,17 +81,17 @@ final class ChatTitleProxyNode: ASDisplayNode { self.iconNode.displaysAsynchronously = false self.iconNode.image = generateIcon(color: theme.rootController.navigationBar.accentTextColor, connected: false, off: true) - self.activityIndicator = ActivityIndicator(type: .custom(theme.rootController.navigationBar.accentTextColor, 10.0, 1.0, true), speed: .slow) + self.activityIndicator = ActivityIndicator(type: .custom(theme.rootController.navigationBar.accentTextColor, 10.0, 1.3333, true), speed: .slow) super.init() self.addSubnode(self.iconNode) self.addSubnode(self.activityIndicator) - let iconFrame = CGRect(origin: CGPoint(), size: CGSize(width: 18.0, height: 22.0)) + let iconFrame = CGRect(origin: CGPoint(), size: CGSize(width: 30.0, height: 30.0)) self.iconNode.frame = iconFrame - self.activityIndicator.frame = CGRect(origin: CGPoint(x: floor(iconFrame.midX - 5.0), y: 6.0), size: CGSize(width: 10.0, height: 10.0)) + self.activityIndicator.frame = CGRect(origin: CGPoint(x: floor(iconFrame.midX - 5.0), y: 10.0), size: CGSize(width: 10.0, height: 10.0)) - self.frame = CGRect(origin: CGPoint(), size: CGSize(width: 18.0, height: 22.0)) + self.frame = CGRect(origin: CGPoint(), size: CGSize(width: 30.0, height: 30.0)) } } diff --git a/submodules/ChatListUI/Sources/ChatListTitleView.swift b/submodules/ChatListUI/Sources/ChatListTitleView.swift index 6db694c3a4..3624b1201e 100644 --- a/submodules/ChatListUI/Sources/ChatListTitleView.swift +++ b/submodules/ChatListUI/Sources/ChatListTitleView.swift @@ -195,7 +195,7 @@ final class ChatListTitleView: UIView, NavigationBarTitleView, NavigationBarTitl let titleFrame = titleContentRect self.titleNode.frame = titleFrame - let proxyFrame = CGRect(origin: CGPoint(x: clearBounds.maxX - 16.0 - self.proxyNode.bounds.width, y: 1.0 + floor((size.height - proxyNode.bounds.height) / 2.0)), size: proxyNode.bounds.size) + let proxyFrame = CGRect(origin: CGPoint(x: clearBounds.maxX - 9.0 - self.proxyNode.bounds.width, y: floor((size.height - proxyNode.bounds.height) / 2.0)), size: proxyNode.bounds.size) self.proxyNode.frame = proxyFrame self.proxyButton.frame = proxyFrame.insetBy(dx: -2.0, dy: -2.0) diff --git a/submodules/ContactListUI/Sources/ContactListActionItem.swift b/submodules/ContactListUI/Sources/ContactListActionItem.swift index e2a1897f71..9e808abbc2 100644 --- a/submodules/ContactListUI/Sources/ContactListActionItem.swift +++ b/submodules/ContactListUI/Sources/ContactListActionItem.swift @@ -225,7 +225,7 @@ class ContactListActionItemNode: ListViewItemNode { titleOffset = iconFrame.maxX - totalWidth } default: - iconFrame = CGRect(origin: CGPoint(x: params.leftInset + floor((leftInset - params.leftInset - image.size.width) / 2.0), y: floor((contentSize.height - image.size.height) / 2.0)), size: image.size) + iconFrame = CGRect(origin: CGPoint(x: params.leftInset + floor((leftInset - params.leftInset - image.size.width) / 2.0) + 3.0, y: floor((contentSize.height - image.size.height) / 2.0)), size: image.size) } strongSelf.iconNode.frame = iconFrame } diff --git a/submodules/Display/Display/TabBarNode.swift b/submodules/Display/Display/TabBarNode.swift index 9e2f37fda4..deca7413c1 100644 --- a/submodules/Display/Display/TabBarNode.swift +++ b/submodules/Display/Display/TabBarNode.swift @@ -57,7 +57,7 @@ private func tabBarItemImage(_ image: UIImage?, title: String, backgroundColor: } context.restoreGState() } else { - let imageRect = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - imageSize.width) / 2.0), y: 1.0), size: imageSize) + let imageRect = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - imageSize.width) / 2.0), y: 0.0), size: imageSize) context.saveGState() context.translateBy(x: imageRect.midX, y: imageRect.midY) context.scaleBy(x: 1.0, y: -1.0) @@ -76,9 +76,9 @@ private func tabBarItemImage(_ image: UIImage?, title: String, backgroundColor: if !imageMode { if horizontal { - (title as NSString).draw(at: CGPoint(x: imageSize.width + horizontalSpacing, y: floor((size.height - titleSize.height) / 2.0) - 2.0), withAttributes: [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: tintColor]) + (title as NSString).draw(at: CGPoint(x: imageSize.width + horizontalSpacing, y: floor((size.height - titleSize.height) / 2.0)), withAttributes: [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: tintColor]) } else { - (title as NSString).draw(at: CGPoint(x: floorToScreenPixels((size.width - titleSize.width) / 2.0), y: size.height - titleSize.height - 2.0), withAttributes: [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: tintColor]) + (title as NSString).draw(at: CGPoint(x: floorToScreenPixels((size.width - titleSize.width) / 2.0), y: size.height - titleSize.height - 1.0), withAttributes: [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: tintColor]) } } @@ -413,7 +413,7 @@ class TabBarNode: ASDisplayNode { let nodeSize = node.textImageNode.image?.size ?? CGSize() let originX = floor(leftNodeOriginX + CGFloat(i) * distanceBetweenNodes - nodeSize.width / 2.0) - let nodeFrame = CGRect(origin: CGPoint(x: originX, y: 4.0), size: nodeSize) + let nodeFrame = CGRect(origin: CGPoint(x: originX, y: 3.0), size: nodeSize) transition.updateFrame(node: node, frame: nodeFrame) node.imageNode.frame = CGRect(origin: CGPoint(), size: nodeFrame.size) node.textImageNode.frame = CGRect(origin: CGPoint(), size: nodeFrame.size) diff --git a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift index 0fa498e7f7..febabad5f4 100644 --- a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift +++ b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift @@ -14,54 +14,13 @@ import RadialStatusNode import ShareController import OpenInExternalAppUI -private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white) +private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white) private let backwardImage = UIImage(bundleImageName: "Media Gallery/BackwardButton") private let forwardImage = UIImage(bundleImageName: "Media Gallery/ForwardButton") - -private let pauseImage = generateImage(CGSize(width: 18.0, height: 18.0), rotatedContext: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - - let color = UIColor.white - let diameter: CGFloat = 16.0 - - context.setFillColor(color.cgColor) - - context.translateBy(x: (diameter - size.width) / 2.0 + 3.0 - UIScreenPixel, y: (diameter - size.height) / 2.0 + 2.0) - let _ = try? drawSvgPath(context, path: "M0,1.00087166 C0,0.448105505 0.443716645,0 0.999807492,0 L4.00019251,0 C4.55237094,0 5,0.444630861 5,1.00087166 L5,14.9991283 C5,15.5518945 4.55628335,16 4.00019251,16 L0.999807492,16 C0.447629061,16 0,15.5553691 0,14.9991283 L0,1.00087166 Z M10,1.00087166 C10,0.448105505 10.4437166,0 10.9998075,0 L14.0001925,0 C14.5523709,0 15,0.444630861 15,1.00087166 L15,14.9991283 C15,15.5518945 14.5562834,16 14.0001925,16 L10.9998075,16 C10.4476291,16 10,15.5553691 10,14.9991283 L10,1.00087166 ") - context.fillPath() - if (diameter < 40.0) { - context.translateBy(x: size.width / 2.0, y: size.height / 2.0) - context.scaleBy(x: 1.25, y: 1.25) - context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) - } - context.translateBy(x: -(diameter - size.width) / 2.0, y: -(diameter - size.height) / 2.0) -}) - -private let playImage = generateImage(CGSize(width: 18.0, height: 18.0), rotatedContext: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - - let color = UIColor.white - let diameter: CGFloat = 16.0 - - context.setFillColor(color.cgColor) - - context.translateBy(x: (diameter - size.width) / 2.0 + 2.5, y: (diameter - size.height) / 2.0 + 1.0) - if (diameter < 40.0) { - context.translateBy(x: size.width / 2.0, y: size.height / 2.0) - context.scaleBy(x: 0.8, y: 0.8) - context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) - } - let _ = try? drawSvgPath(context, path: "M1.71891969,0.209353049 C0.769586558,-0.350676705 0,0.0908839327 0,1.18800046 L0,16.8564753 C0,17.9569971 0.750549162,18.357187 1.67393713,17.7519379 L14.1073836,9.60224049 C15.0318735,8.99626906 15.0094718,8.04970371 14.062401,7.49100858 L1.71891969,0.209353049 ") - context.fillPath() - if (diameter < 40.0) { - context.translateBy(x: size.width / 2.0, y: size.height / 2.0) - context.scaleBy(x: 1.0 / 0.8, y: 1.0 / 0.8) - context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) - } - context.translateBy(x: -(diameter - size.width) / 2.0 - 1.5, y: -(diameter - size.height) / 2.0) -}) +private let pauseImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/PauseButton"), color: .white) +private let playImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/PlayButton"), color: .white) private let cloudFetchIcon = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/FileCloudFetch"), color: UIColor.white) diff --git a/submodules/PassportUI/Sources/SecureIdDocumentGalleryFooterContentNode.swift b/submodules/PassportUI/Sources/SecureIdDocumentGalleryFooterContentNode.swift index 8c2f34bdc1..ea3162d838 100644 --- a/submodules/PassportUI/Sources/SecureIdDocumentGalleryFooterContentNode.swift +++ b/submodules/PassportUI/Sources/SecureIdDocumentGalleryFooterContentNode.swift @@ -10,7 +10,7 @@ import TelegramPresentationData import AccountContext import GalleryUI -private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white) +private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: .white) private let textFont = Font.regular(16.0) private let titleFont = Font.medium(15.0) diff --git a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryItemFooterContentNode.swift b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryItemFooterContentNode.swift index cd7a370711..d587bcf58e 100644 --- a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryItemFooterContentNode.swift +++ b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryItemFooterContentNode.swift @@ -12,7 +12,7 @@ import TelegramStringFormatting import AccountContext import GalleryUI -private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white) +private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white) private let nameFont = Font.medium(15.0) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeGridSelectionPanelNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridSelectionPanelNode.swift index 2c31e3fbd1..84fec14728 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeGridSelectionPanelNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeGridSelectionPanelNode.swift @@ -34,10 +34,10 @@ final class ThemeGridSelectionPanelNode: ASDisplayNode { self.shareButton = UIButton() self.shareButton.isEnabled = false - self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) - self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) - self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) - self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) + self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) + self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) + self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) + self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) super.init() @@ -52,10 +52,10 @@ final class ThemeGridSelectionPanelNode: ASDisplayNode { if self.theme !== theme { self.theme = theme - self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) - self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) - self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) - self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) + self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) + self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) + self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) + self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) } } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index db5367eb7f..92adff2cb6 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -38,9 +38,9 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let rootTabBar = PresentationThemeRootTabBar( backgroundColor: UIColor(rgb: 0xf7f7f7), separatorColor: UIColor(rgb: 0xa3a3a3), - iconColor: UIColor(rgb: 0xa1a1a1), + iconColor: UIColor(rgb: 0x959595), selectedIconColor: accentColor, - textColor: UIColor(rgb: 0xa1a1a1), + textColor: UIColor(rgb: 0x959595), selectedTextColor: accentColor, badgeBackgroundColor: UIColor(rgb: 0xff3b30), badgeStrokeColor: UIColor(rgb: 0xff3b30), @@ -54,8 +54,8 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr secondaryTextColor: UIColor(rgb: 0x787878), controlColor: UIColor(rgb: 0x7e8791), accentTextColor: accentColor, - backgroundColor: UIColor(red: 0.968626451, green: 0.968626451, blue: 0.968626451, alpha: 1.0), - separatorColor: UIColor(red: 0.6953125, green: 0.6953125, blue: 0.6953125, alpha: 1.0), + backgroundColor: UIColor(rgb: 0xf7f7f7), + separatorColor: UIColor(rgb: 0xb1b1b1), badgeBackgroundColor: UIColor(rgb: 0xff3b30), badgeStrokeColor: UIColor(rgb: 0xff3b30), badgeTextColor: .white @@ -69,7 +69,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr inputPlaceholderTextColor: UIColor(rgb: 0x8e8e93), inputIconColor: UIColor(rgb: 0x8e8e93), inputClearButtonColor: UIColor(rgb: 0x7b7b81), - separatorColor: UIColor(red: 0.6953125, green: 0.6953125, blue: 0.6953125, alpha: 1.0) + separatorColor: UIColor(rgb: 0xb1b1b1) ) let intro = PresentationThemeIntro( @@ -201,8 +201,8 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr ) let messageDay = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2)), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2))), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2)), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor.withMultipliedBrightnessBy(1.2))), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xDADADE), stroke: UIColor(rgb: 0xE5E5EA)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xE5E5EA))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), @@ -327,12 +327,12 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr ) let contextMenu = PresentationThemeContextMenu( - dimColor: UIColor(rgb: 0x000A26, alpha: 0.2), - backgroundColor: UIColor(rgb: 0xF9F9F9, alpha: 0.78), - itemSeparatorColor: UIColor(rgb: 0x3C3C43, alpha: 0.2), - sectionSeparatorColor: UIColor(rgb: 0x8A8A8A, alpha: 0.2), + dimColor: UIColor(rgb: 0x000a26, alpha: 0.2), + backgroundColor: UIColor(rgb: 0xf9f9f9, alpha: 0.78), + itemSeparatorColor: UIColor(rgb: 0x3c3c43, alpha: 0.2), + sectionSeparatorColor: UIColor(rgb: 0x8a8a8a, alpha: 0.2), itemBackgroundColor: UIColor(rgb: 0x000000, alpha: 0.0), - itemHighlightedBackgroundColor: UIColor(rgb: 0x3C3C43, alpha: 0.2), + itemHighlightedBackgroundColor: UIColor(rgb: 0x3c3c43, alpha: 0.2), primaryColor: UIColor(rgb: 0x000000, alpha: 1.0), secondaryColor: UIColor(rgb: 0x000000, alpha: 0.8), destructiveColor: destructiveColor @@ -347,7 +347,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr backgroundColor: .white, primaryTextColor: .black, controlColor: UIColor(rgb: 0x7e8791), - separatorColor: UIColor(red: 0.6953125, green: 0.6953125, blue: 0.6953125, alpha: 1.0) + separatorColor: UIColor(rgb: 0xb1b1b1) ) ) ) diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift index bac9bd0cb7..a04952e884 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift @@ -360,8 +360,8 @@ public final class PrincipalThemeEssentialGraphics { context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) - self.radialIndicatorFileIconIncoming = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocumentIncoming"), color: incoming.fill)! - self.radialIndicatorFileIconOutgoing = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocumentIncoming"), color: outgoing.fill)! + self.radialIndicatorFileIconIncoming = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocument"), color: incoming.fill)! + self.radialIndicatorFileIconOutgoing = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocument"), color: outgoing.fill)! } } } diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift index 065cd1fadd..c4a492ad73 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift @@ -715,13 +715,13 @@ public struct PresentationResourcesChat { public static func chatTitlePanelMuteImage(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatTitlePanelMuteImage.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat List/RevealActionMuteIcon"), color: theme.chat.inputPanel.panelControlAccentColor) + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Title Panels/MuteIcon"), color: theme.chat.inputPanel.panelControlAccentColor) }) } public static func chatTitlePanelUnmuteImage(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatTitlePanelUnmuteImage.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat List/RevealActionUnmuteIcon"), color: theme.chat.inputPanel.panelControlAccentColor) + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Title Panels/UnmuteIcon"), color: theme.chat.inputPanel.panelControlAccentColor) }) } diff --git a/submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/Contents.json index 97518aad3a..b232cafe7e 100644 --- a/submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "SavedMessagesIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "SavedMessagesIcon@3x.png", - "scale" : "3x" + "filename" : "ic_av_savedmessages (2).pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/SavedMessagesIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/SavedMessagesIcon@2x.png deleted file mode 100644 index 59ea1ee4b407afc8aba432488e96d3e44e4e2baa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^IzVj3!3HGvoUH!Cz`$tf>Eakt!T9znqlUBT=!LJe3>wjCc z{}(=ZKE_VdY^Kk)7hUgODlUGP;orsjZOT5)=UZ0@?$^0d^(NpW&#O)9M`y1+y{oG| zcKTNyvl|J`yinr7n)D3^*`#xzMDDHyh3_5+&eb?}fA^L1qIVX{{*77?{?gL?gYsGp z!++-f=9Ue|OFWCUA`X0i`FQ^U<}9tPCRNS%RT;f+xsS|uiu`S4dgFdVb_&~<$ZMKAK1bxt|Iu+-eSudII|BnF zi>HfYNCo5DOGg_II|#5|)K5z@yZuvr$C+DVXJU3URV+W0-L>i^Q|79s?>v`<&Y9d} zxjpGbovDwvmT-X1NfC=pEnL3SE-W}LWF_olaF9jV=Yk=SGy)Opw7o0#z4sJ!?3jMY zVNOTV9#Qv2E|VTDHW5_XwC6y$>%6z>r?~d7Iw?ZXm#nqw|Ndq ikLwOEZU{O0SdxEF0~g=svk|~RWbkzLb6Mw<&;$Sy@EA(~ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/ic_calls.pdf b/submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/ic_av_savedmessages (2).pdf similarity index 78% rename from submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/ic_calls.pdf rename to submodules/TelegramUI/Images.xcassets/Avatar/SavedMessagesIcon.imageset/ic_av_savedmessages (2).pdf index ce2dca89811de188f55ccb2b72f55487eeff52aa..6199cc1152aa1f74e9c271d089296d34e6c81f2b 100644 GIT binary patch delta 655 zcmaDazg2!hKz(Z9=`0pQp55oeU&KV1*BvQ5_qWORD>Kv5*3874|J$u@o|_Vsc3{&a zkBvo#Ma@}MK5$NqEbo{&<(!%I$3OjM8xwW5tfhvFC+o~F@%6h|pRMwIp_yu~;?Kit z{@$+4J5V3O|5bKs)#i-0PYkyvX$4ub|6cm${@S7`Qm)S{67TF)`m7|l^&Phzlaz4u zJ&V&5lh0lDw#c9PzN_wm?0WwnUe3qa=f%J4DRhs#U;E%tz*+W7q2D9*y)GVlUi|dc z#oTJGy$^r!3b@9GbEW2`6qkqO@jAJw>@8i|twluIX zGBPwbF)=Zn{F%2=%g9o}00b2B6u7_)0|R3-plzsP#zq!~ljrfN)*G9cq01QnjY1bQ zHo~IL)X*4Hoe_q4#>Qqw80t(6!D0f)4mCEhFrOU6Zx^3tkZhikY-VO^WM-O_Xla~g zU}$7)lwxdYoN8!kW|(NlWkXPjLac(F9anKlVo^y&QED2Ov6+Dhm#V6(zZ(|->d4&H delta 714 zcmdlg|6YDVKz;5cTR&Dqo|fOXN3VFa{7~kc2-aWTnnX39!4ZS$*Phjf<&>xFolZZ_nuS2|mKtjpT?+DyAP z{i!LvcUsK*W9GU%&1y{C?y=|PlzlF?8En5(D}4MrCVEkhMEHa0V!oWiGCZ(?AEE@xnB zgkgrUv5^I)I!i3(8eph1HZd_l*K2HI2^JGTcBrwbiRokse!F;}UlNTijFXH~Ow5za z%#Bmblah>+EDg=g6OGJ`3{C8~YzQh*h*hw&<0>vmEGnreN=@T3HZwEgQdM>JcjE#8 D9@X|Q diff --git a/submodules/TelegramUI/Images.xcassets/Call List/InfoButton.imageset/CallInfoIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Call List/InfoButton.imageset/CallInfoIcon@2x.png deleted file mode 100644 index 2ee78f74833515103a654404061cc6242ce096a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv81Sx&WULS0K&s|35>+3x@h^j!xx> zvWn$*ylTyQvG`+jMceds|+_U*~>0#e(Qx8Y(dHkuxI_LBc>GF%4 z4#!$;vp3a@eD|oft}t%i_rmEqA5Ut}t(A@Q*w-=3;>ySQ0c;N^l%y!|*l$k0`gmgM z7g1Y={F>wHN@HkJC_?z$M{+-uh!{t=9JT%n{!IteD)&aAmP3h-Ht+siY7eR945H#W%onz zLrFiLMtLUg47>2sXM5|>L#Kidk$ma%b6>DK7yf5KmV>mvv4FO#nB@4>SM( diff --git a/submodules/TelegramUI/Images.xcassets/Call List/InfoButton.imageset/CallInfoIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Call List/InfoButton.imageset/CallInfoIcon@3x.png deleted file mode 100644 index 9c3391484f8740044b3c18b21c66fb0530058296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 932 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdr&IkB}xB_X0hPMn2FBs~dGBiA8 zsDB1RbwCD?`=6ol1w#Xv3lwPqDtitVe+3oSt0Vvz{38bq5tN>&VSWOd{ zgqj0X4^;UdWXmL=O0bO}DX=X-6M&44cTkIfmIAp=FBxY32U!7h5)gqzUV*eXyacg< zdV%alsN+wzGRy$_$h9QMFPK3lqH)F9`)__SInTKDU$*11%A8+ccece_C$`^U<+AuqR?+CV*M+<1@Xb{h;A#D- zD#OKAvdY7xEl@}5qUNJc75$)>KHpybdiL$xvtL@XJ(pKZ^f^*`=I&qS1CK9%UR$@L zw(b<8&7J!%7t}B=h|oH{AZ8VV$fr%KuQ9yhjWm75uyvJ=lH7uummJrsJ?K2KLYCPo zR`%jshK<{Js%jtDEm+L--C=+FjfMQpYy2k3I_zH?uVg6ESF-4$K+?qc$chAmODEl! zKZJaZz5otNt^itb@)m`9cBHPfEp|NeOFjiPMGO& zjFx7PufsbArE)u!0wZVk#imAc{#$Ns@oeoPm yMOG*5{jB*>HkPfy}#1KZS`L5pywxK!v%QO zP6+m_-crWG_WjzC_e-`NtI}D!I73lFXX*`(4CmnQPj}pQlz%4qK>k$X5yLe9Q$pqL z)(QdhwtC3ik!wDE`OLMBweA%s}uEOT!PmaXjDL5;h=kTv!bN1=d zKijkfOs0kx#OBXTo)#a#XBC_|Mf8Bhfr>ybwsP0p-VZ&hXVdzfUsoJiw|~B*yGIMl zw4{lPK8A`%+?})Jv5|OV?DiQAZ9$XV|9IN7_xmk@36pRffONu0_T(8Ao<(m2V;(8SQv(lpH^(bCvB s(bP2AG}$cKj?0Fi5`|a=J3Fr8lEk8tilWpsE@KM=3ocbvSARDy0FKu&-~a#s delta 2469 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 diff --git a/submodules/TelegramUI/Images.xcassets/Call List/OutgoingIcon.imageset/CallOutgoing@2x.png b/submodules/TelegramUI/Images.xcassets/Call List/OutgoingIcon.imageset/CallOutgoing@2x.png deleted file mode 100644 index 1556c45ae88269b8797ed23de69977ad0132f17a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 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 C2ec#r literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/Contents.json index b796aac945..2774291293 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/Contents.json @@ -2,16 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ModernNavigationAddButtonIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "ic_add.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/ModernNavigationAddButtonIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/ModernNavigationAddButtonIcon@2x.png deleted file mode 100644 index 4554c428c93eb6f50fb99bb108e9aa381788270d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^${@_h3?x;=6{Ua_TYyi9E0AWWdwOK|ZwDZQu_VYZ zn8D%MjWi%f!qdeuq=GRyA)$id$QI@Q%mo}gQu&X%Q~lo FCII=e9033T diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/ic_add.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/AddIcon.imageset/ic_add.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c14161d49d376f485fd95fd49cbce35a38ef42ae GIT binary patch literal 4043 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/Contents.json index 5683b3b5e8..c52813013e 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "newchat@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "newchat@3x.png", - "scale" : "3x" + "filename" : "ic_create.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/ic_create.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/ic_create.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca0a3da950075090ab7e0e8610f06fc1eb28320b GIT binary patch literal 4392 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/newchat@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/ComposeIcon.imageset/newchat@2x.png deleted file mode 100644 index cca39a95f65f2e42849c1bbd23744a1c08ab21c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmV;n14;aeP)J!lj`6vzK_oBx*( zcpw2mEbLPU#3HR4ENoH;=FrNR>nqPQBVe881MF`>8xP-65F5A3PFY==yr* z%|&xgjt`)Q1Lg?iBLRI<9{YvY;5@ zKh+0hxD;TP^zPvd!8OEp1&~Mv-BF(8g!Cq}tn#uScfb{S8Ao_X_2$XodDBQ?ae-}` zPq#Yux}F<^<3bapp5<}n}0#& z^RU&P<@_wb3izjJX*lO zaH9n*0d91FK5$LB4L%%$%X84tlw&a;IBr7XhGR>rSh;`b>M+nD&VTWiUYqW;)lG@?bFCLbIo;z+% zvO>=gc8DJ09_hP8$7d@X&&grmd!AsrdRRb-JF1}??hed3_FP~%ZaeG{1uiPUI(;zf zFgPcNeu?YizUQ!j5|c_`BKDEUNm_$mpgH-B(q@LvNne^F^}_<{1{+e+>X#Yb(VV>9 zGi=S=0^{WXvS5LI`h8F5Et(il3GS#s4y&oKfGv@~sAZK_Oh(wdXfYbStVBSs?yErM z=)np&!AnB)pjY=*pmOwJ1)Sg|A>V@n=~h`ohS~HyiF~a=YjUWY4+!jLc9tCMg)X8s zXid58<-d#8ut8hbH_6f(8oXCr!Ukx+?9_8h^rF5-Sx2-~w$We2cJ1~u%v;!OT$Z#7 zXIIN#AS<+w-?A0yPj>_4T4nqRp2AA+HzJ@V2PY)srG=Pys8Rh`j3FPVNNBO_q!GZu+%Ca1 zxJzF7FX2Bxmqpwdy6qB+&-I*?;xMn%7!+7^kSbx2cP~ zM&S!nbu9PR;6JMHGPX>AreX=qB6Im0k-^VZi+aw|+(QTU00F#1*P){BL}CX25YYXl z)<|K-^=}i*k7hhMsHmBTGR!f4rE*>k%1R^ZJoH+rF>yHYZq6B{`axxK59MzD6!!wp z9Fd=YhaPTGXMaTB9JtG+BT_h0{V7Z39?D~8(alE$@?DzkcBaZr<5mhssvogZzOZ)_ zkSmHkQ(=~{%7OB1?uEN~iX!ziss0?BgL8 zps{lHK27RrQvI41t_Dyk9I1Xyn5@=)pi($eeF4nw1C_#&>I-3Z8>keHRKEet?gEv< zk?J>u*-fBQICb^=b_;#`H(gr`@a)*6R2PmXBGbP}zfrtQSugtRO~UTX@-jH`pWrO^ zWdMEHgeK*Y|Ju~BqJ^?KnC1N)-kpqXTX02E_zN|zoH>0D?GQ{xn>NrmOgZR z(;7qj_5{H^pWE9pnB4BPfP&7i7qVS>LL)vbRIf{mGM{@a9iU&>L*$)rOf3EjF9ip; zLJV=3)k~=`?-Jta0PW#OZm+>F=$j|`y^mDGj4!2pz9oj~03Bxs&AjQeyQv+3$&F73 zXfHUmXXvm`C|mY*^zl>e*+0y?>-Rbg+Sh>W!3bbX|3RHo%OrYiB)I$|$%LH03 zPCZnCwoIVq;?zSGXv+jzE>1mEfwoMb<>J&s6978O+c325Ol6+X(MZ{j!oCLP$UW51 z?~`6ev^}v3650{k*T6P8P~d)E&zSzzdljT?M`2$B+vGrdxS7{u@fmHV9nbH(7~%G_ z9bQ8Fe3~F!{Wm(qVDOm9-JCts!E`U4F?c}xtVigr6ysR7I%#sCTx!bi9I0bNt4KnW-TC7=XSCh!dG_>(dy^iU800000(um+I?m*tqiR8CS`PE{A5)vcxcrL4`-d{q z5?*}l{dg}}Z$cK=?j)YG3h%sRCvXM#Ec|2M{%xw)m)S3?yO8bg K=d#Wzp$P!X>s8|b diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/NavigationShare.imageset/ActionsWhiteIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Chat List/NavigationShare.imageset/ActionsWhiteIcon@3x.png deleted file mode 100644 index 98dc6d8d62a499dc3b536934ef58dc36e42a63c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^mO$*!!3HD)lXD}16k~CayA#8@b22X(7?|`tT^vIy z7~e*C2OT!x$<6S;VA`H|wn_Vk(wiF_Tcr(ZuIWS+GwB@&lu+BV2=CcL|yY_5IW9D{qw7uGd@C@Fv0X;M(OvdUxOR-L>ju z+R^-1S;FJt)pbYft=vilSrgc;y*BixRLm2ub(5*ReOlt6;-pXkT}2DGAk&LMO{yx* z=arL|z1`w1?y)Xm@BIXJt6a@bUn=jl$NPP;`z|QWd`9Y<)PeHf56UzuKYZS)e&!D~oiKc1n4^`gFzU{*)_=SVY@3J=ZRn_H)@1G1V0o zKAu^uThExQZq;x+n&=gzy&`p==1NyiExzDMQI5KweLZ!(0t#nLy26z;bH52dr-`knLY;Xnv;@D zBbR*fegDN*M@9Afy%*dT*X>er_;Yv_-o3lMEckp@Px!k~H{WtSo2^O;Qo$vcZhcrZ zbLnGdL8)_wpI0otwC$2)!6ng*il~%w@8~E0)j8SsFw8ye+|*W|A?C|3%jp71TC5LWe<x?VeU>Y7f>td;U| zCzIDPuP%MgSrwK1f}!Ma$z;{juUKze7Rv^?1)ZOemwARMt>bFg`+1=~40h>Gp}fim z9Qtg+kAIrMyKh!>)wUhwdl_GJ2Tr{=&GPyIy{$3Vu1GVSSG=JYvV6O$e-5_{n9dzbvBFyDs!VB8!C3=?ICSlc!BukGs{|8Q#5oRWIh*b6tx$BBzy>E|TSV zvE_x>)q-!i?g?&9r!SN4+nfQ|Q=pZo69npy1~uX6d_%-g@5 zcJ!uSNKg5H`_~fws{hO`8#xoXQu9)ZONvqxb3v^9q%1B|1p@^zZE7(27?a;-EoN74 zR$~JNV}r>he2HqgiOK%K3Sp^5#hLke3Wf%Hh9-KZ3Nac^rI|S?3WgSLMh3<)nv);% zX>nT`SQr@@nj0FJnoO49Z`3lfR4@Pmg**i=FvGyW%nWE9s+h5eXpFAc*whHaJYzF6BMf!sh7hsIAp(+<8wE__jVu!_6OBxalPps$jm?sc zQ_~F1laiAyQp{70jg3tV?YL|RDp814u(RVTE=epZsVGWK<1)51FyT^Fb@g}S0sxD> BZv6lN delta 988 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 Q2to!b4;B;C(A5P04=~HpDF6Tf literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/ProxyOnIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/ProxyOnIcon.imageset/Contents.json new file mode 100644 index 0000000000..0c7f761c13 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat List/ProxyOnIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_proxydisabled.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/ProxyOnIcon.imageset/ic_proxydisabled.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/ProxyOnIcon.imageset/ic_proxydisabled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..07999bfe1ee625ddc337b8d8c6027ecef8b2cf68 GIT binary patch literal 4188 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/ProxyShieldIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/ProxyShieldIcon.imageset/Contents.json new file mode 100644 index 0000000000..84daffbc2e --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat List/ProxyShieldIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_proxymain.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/ProxyShieldIcon.imageset/ic_proxymain.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/ProxyShieldIcon.imageset/ic_proxymain.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c1635cf929342f0308115d2b6a5680d5ae36872 GIT binary patch literal 4460 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/Contents.json index 5e19672ebc..3c915fe3da 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "PanelSearchIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "PanelSearchIcon@3x.png", - "scale" : "3x" + "filename" : "ic_search (2).pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/PanelSearchIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/SearchIcon.imageset/PanelSearchIcon@2x.png deleted file mode 100644 index d0560d61dbccd7c1932057bbd83484c1ce08d264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|^t)d4;su0Wch^)*A?Glqs|4D~?t z6huz?58?s^LFg$%!+#hXtOg|VoT1@0L&GbmE}%#w(1iaCO|EeNbysZ!UUjeElYy@f*B;!m+Zg! znLY2szyD0J55BBTc2MJyJAE#Y!}?`3W5myG{5>ZFmVWwr|J1THl`H2{UuPcje3Hc} zzpFY=cLoCkW2C2xV@L(#+o{ag-WrIs1}9&CSD!ok^ZXl|Pug7*t7V&tL_Gm5h z^4r>dUw83Y<@>tSH#}TnWh0ezA>SgoVPoj;1BPr{pC6I!iEKXh;>w=mUItrc31oLH zvC2FwxzVjx=7uP@)r(DHr4Og%u2O!xRdKIKRc1z$W_Bps;wPQUW^Y&CnJrcu(sJD5 zlY-bU;~zFhj<2~eUGT#MhN6Y*6`m+6PH~ENJ>smiqV?Y&(G^TwXXuqHd!_{5saQ z=t+IsewwxS=e8v$K75`3)AUU98Jl9al#C

uZLFXABL`8S0-g z)FGi}px`sG;8TYG|3Pe^Y{LtXNc~d~Y5<}a3{9^XI$txa`VSTX8uApXY!Xn*ONKh2 zO0YStU^dW%=2r|e!KMMln_hy{z_ox3gh_#Py#g5pvhF$9d0?YJZg|bm_yTMT*kquB zwog!%-C%K$8jv}9mmIr+9`q^+@(X5=jOti_<=Lk{nr+wrGX|aTyZU`^LxdqObECrM zRX*%4?|x4c&t0R+I_sgO)$Su=^Vn)me&%_#ztih@>pwN;OCF0}3dbJgK6HR7E!DiD znt_2y#M8wwq=IqInb1W_fdb7BAAEakwRVT~oBG_(7DcOP7ypo3J?TV<#KsCK~-Sm0`H>{-nDA6VD=x zi}xp4NHMfD&RJTVurcQ4@~cIRXM!!Gt~Z_y+xC`i#rmg7+u8ZtQ>|qi{+>&G#S^pc zRPkPh=jW5FAC!gf`^|gfb+hS*3+em`YhyBH^NI?at5(Szl+i2Sxg$P7P9vJ5ef6Cf zegUmuev4CAIbUcx@8*}@dD~&XZZx}C^v>IQ3zTmQPy4j7Wt|VN#F{6`rVVX6z8z20 zo0jS5c05&Yo5sT`q4H@m&w_+I-3C+ED~j|MbGm&pZJJc5cQ|6-u>iAkqBBlhXVE&g zlZ*AImcvzx{SS2G^D88uTb+55&DMSY?F?q2!vPX4_ZhRK!#i^C{dd^9bM8Bf|2us5 zReX$iZo1}b$fLhm!t)oq)$C7O^Sv%+^~)pgFFtsAr0T?F{mCm#t3kGIg=Pf!jX&gB*LATNGcFinb1v80&%0S#>lC*-H+Pxz z;otU`SsE5L&yQqXo$w=M!=4|~W&bX`4dP&X(~@++PlNAG%c29Hf-XG!!m{1WI98(Z SrX>d`UwOLvxvXr}xQD_=Hk#k<=zeJVn}ajOX@M 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/Contents.json index 9afc9c4e5d..49b1c21103 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "ic_calls.pdf" + "filename" : "ic_tb_calls.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/ic_chats.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/ic_tb_calls.pdf similarity index 74% rename from submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/ic_chats.pdf rename to submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconCalls.imageset/ic_tb_calls.pdf index 7023f0492d564e71c22578de6d57b8dcec0c1a25..b8c8c2da7aeaf8e2347d78a64a0126d24ac4c2e4 100644 GIT binary patch delta 894 zcmeyWcw2EoKz(SicUFue&z=3jFPH+O{$I0F|DeS#!NJ+XeC&Jslv~35X$f)Vo@@PA zesR+!v_HMe?`+&?lQNGhB zTFqX;!rJZ4J|Q9hZj<@J-QQ$PBUNoDh?ctCVpVDFI(&4~F~;ll(z#)0#p)SmZ_gL8 z3Ev!=;c(kW-E-|+x9#37cegVH+vrUxQV*QAbq^=6$IKfFr%x4T+?!SGkiR?DbHdS8 z-%Fi;oO+=(sb#wI$6AZaCai%g1n)9;bbWX%VsJ#94O4LaT7YtI~X=&8TDMO~EX$c|q#rtH1u}-pX&bc#(q_-w_r3LV_Y43Cpaf{`vFUxah zFkRKERMao@-d!bE_d1Ws!cB{nTrV$PeSzVq@|I?Y=XD}I5&sQWY&Ly*LQv{R#I&u) zzbd|zV9{=Fox!9~GgoW_m*u2+Muzto)6TFy$l)*f+v%`&bNuc{ooD~)ezuj4e62WT z{q3s7_rFa3cj?g*`!9cwTc4=eFLw6*U$^^8DbtRh`~UjqJU;t|-@+36uNqJO{rIeU z(cOuU#P|MT_F%qvb8;7xG?R(R$=H24<#~=wimE=93rmtEZV5pvxGT8)H$8MV*C#Il5kBQzH!XjLl5VCd&w@ zF)z#mP3jmh@SR?=d delta 921 zcmcbu_*HR2Kz(emXP=0p!0zkXk9u5$eiuDsEq=tPDWLNAyYp0P4;`16SSf!yy}z&E zSiDE_3YW`o8#U#NU+=r(x2a^(tBsl$ZnVDE`_p0dV}V}(wBGmiX)ao3?I{<`f0xR- zds!UFE&o#Rs%XVyO;Z!~Bi`H6ch3%<`zT|6c+kPgOlM9zXZve5f1c`IRW{3cc9Ck& z&BYs23yXB7{Mle=JnK2*R-;YA(^l^7a9P+W%PqP0bN6M-oin10ZEkdnC9g}IGv(e< ziS0!Sxrf$&eh_?gbopcHza+(+l2q ztvT5B@{Q9zmez?5H3xQodz5#O(M2F~2aAfaqShBzhp3ZDuP{wF)jag+<57c$ z+?-347VfDKU*fXiozY|YwF|sYw22iuPpg}M%&z@w`Rv-@B`$vgKRi3Jf8IgYUtjv_ z1YTS+|MlUc>$=tA4T04!`3tIgd%2$=qmi zH3zHe$uW};Jmg+jD}f`NjOB@o4OZNACm%FPPqOjhPgb#KORI@_oKWO%qE60}xQiQ{VzK3=GUH%+bY+&5R~@@~a1#S)j`p zm|I|&U~Fm$bQGGY7N(e{nwlF-786htGc`k3Zfs#-KG{ydF5cA0)XY37$;==%EiKtR z*~r8w(bB-c&>#g!CMBgB+Hu(sRH6{8U}wiwT#{H+Qc;we#${}2WWuGY>gw;t1pvC; Ba1{Um diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/Contents.json index cb092b491e..102b698aa6 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "ic_chats.pdf" + "filename" : "ic_tb_chats.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/ic_tb_chats.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconChats.imageset/ic_tb_chats.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d57b870242f9d825834d072452a5ca43b6766d21 GIT binary patch literal 4304 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconSettings.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconSettings.imageset/Contents.json index 261d9ff3a9..c457392e9f 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconSettings.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconSettings.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "ic_settings.pdf" + "filename" : "ic_tb_settings.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconSettings.imageset/ic_tb_settings.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/IconSettings.imageset/ic_tb_settings.pdf new file mode 100644 index 0000000000000000000000000000000000000000..565bd2960af3ebc3aef9428d1fb892356a5a17a0 GIT binary patch literal 6245 zcmai&bzD?i*T+feE-4vF31MbnhDLfokdTnh89IjsNeL-wK@gDcP*9QX5T#pE7&-)z zj(70h`#$$R_mAg%&gblXetYe8*4cag@m-rkLtgPdh+mM9qZ4(2+A8|_W~j59PzV47 zI9u2eN=N_%R1r?r?lu4jT6zo+P_%V$M;v%_UUN&8$a1% zyQp~y#*!M{l$8Z2f30CD`!I1yFH|AWUytbT7pplIvo`xGK~wttbtcWPpNH#@P15W? zM)SO?dunBpd|YH*@cC(MY3lV8d9@hbu`H$CDHE&qn3FzCLG${fOl~f(WYu@b)yaXn z5}rxvBObvf3)|9%aq=do83wh_C$m&)i3K1@Aa>*X`8k_!JWUHL^_h!IhJKaiXz4Tz z@Xculmp*Wd&^hR06kqUYu)hf8X|!28%_Lu)sCM3IPL6EY^s(A0J4-ZMfo)5KEay^a)WUe~vIU-OyxY4x9ukT?^(thVDq zJPF3k)f!hdZoDN85j5wqtCWXUj^dl7V~4bIoO(=(*ZXcku*!<&Q;bSrLAFnf@t#@a z7OLAOI*eCYWTIZ+_NB51&7MKt=^X3GIE9j~Gx6edID2&ukB;1VBOLbWtb zWw)qwwR5x1=Zx?t8~%M=X&nwBDIXUN?YrD(aYnCJ4P7em$YxnE-b73<;NngVzQf=0 z!x&juz=TGBJhejtwlNpsiZ4x%>Re3pHEau{hylxF^H2dYc zC~K`r;hIK5cgzpH2weQ0yb>I(^?`_A%{Bw~M7YZjyLFAy=!A4%>|Ra;rI{C=axKG{ zlUQ&Yi6V2w7H{^}uQ^;Jfp4^RJ5&0=8WfI2|5N&xH-fe=Kyw*;4aeeodGzt5{gA)DVG zXxbA`yz%EDr-apLdtdM9XukcisDyRq-U^h&4bpS@X?Y4Pu2{-E#8OExh>6?*Wgc$@bU_g5FD_S|gzFKHh>8u~2jEA#tl#B^ z76PW_!>j29#82K6#G5bWD!9Ctj9?a$|FAK}spn@PQdb}OO8} z3H3X5r1yI6%*-wU*gom=S1{SmYwcu?q}L-(W5KOH%ee*7r+O7`;K($GBpTsy6Ekn< z#pAB;J?Z4+z>P=qZ_je!isc1%PsF>cTr&hB2WNmzgU~`P9PRVFKetzQhzUaFIM5?v7pg9Sf#8`#KHBL(?srXzJ2Y!D zvR2N)6T)w07Fe-qsM*Ib37@8xcgHLjsvcu#mc8LXKC0C}<1jbfTj}ykafXW35H{mF z#G@((mu_<*VL|!N@a-#)-%^qG)y)U_zl+PkmE+iVt2?5wut_Y%jNQXM(eKd$4p3s{ z5v+$En8l9Ha>;jqN!uONVM7h1ZTT2h(38}aMEG-rV!Lsa2(@46`ybh>;Z?zR)V%4} zG%bcYJ)gLZr!19o~{vtXLMXFxDudQRWJ4S-@Qo zXY|_-YW=g6GdP`8#?~zRZB;La*Lzgl+1>;{&)`?rleqM?Dcvb3p=4c_mBv!!!h+tj zo$_A}K50uA`S|h~)eOuB)V3r84~R$T@~MiYgmBs4>frh?qQ6MKyg~p4Eew<=bf4n1 zp9c|5^+4!@HJ^mGcSW!NYR8XsGl0i{*dFFp;>VZY&VL?rn}hlyX6w@|rJjsy-4u3t zyt|W=duMig4d_|7RW;_wipXjjf%o$eYm%N5&T%z+3O4~_H=!e(B?CD&Eo?SS@B-i` zRM3v_tu~L&`@U`|{Nk_5KtOprh>3V!4l5B6Mg2~RnL-iH9$OJ5=pV1~9O{6~o^7JL4eC()bjx zT0yLsSLge` zu4o>4;v$Pq$13;M_I-kQDzZ(*rK;9oaiv#-=lv}nckSO1BAnoVG8?*ggL*f7chiD} zgavO#fA{}}f!aPU2!Mcwx%KZS65-?y5c~rPA0ynHJ&=|NHvsexLC)F99X;*_xWUNB zH+cA`znk&Duu=o*Y^jBC2NFs45)F=Kq;il3R(L34#A1@*fLx=yO;cV0H5X$~ zuvY>3IiG&nqrWh{_HlCBde48d9z)|I1gG6y4>L$8M~`}UtIdd#s=xCX>oz$isUBwQ zl9d$>>_i@G?4n8X)vIEq?wX@r{vde6H@+4PPPd8czywxdIrdu^gbL$Oi2zPI6jriU zO&2}*8t3z23O6_$1g6a)$Sr4G?yPb+Dq7`j=u1oGT*+b3AE0j(%8F^wm`~?e%8S9t zF-qfDw9b2qhiKAPPRBqU-y0o0d98{8q<&@kWsNh(Arh=WO}`s?fQ5md+$q|KB#k~5 zwaLQpF0@{W!iiM2D5RK7vqi1r-Er`M}K0~=Coyc;ZA_orDU(~xz0Z4_F$GwOqTwF!*;nq6D`IOyFmtXO>>G4 zMy=y5Y1C4=`W^t|02iZn{`Jp0;SMH=o!^PMh@!W*9o#Up?fH4vh0n7?oIkgOiypt~ z-#ynAFQj`A%%)5uh)_Tk78R<o*zya8aTcbcpJ)vM<0-BPi^C2is2t7s!^wm*Xt~aA;*Tz?)1PH%YVy| z97NdL+-OsgP~{c}_Pts=V<9q%a#~WAVbxkaB94P2Idb{v^A2a&*3n9ler%^(V*G)@7iQX?gfHETk3FoYhtIe#FB`ANj!ALXK7lnKt3)9^ zo;08FQ>;>g>k9U*h#d2@+qB*E%Mto9OBTB36BZAF<7t*@x~g=mP%Co5;M0%-i}AOG zdR*lXJPDu_8L{^}bh7%J-SAepMT+t!&3?%qhv)bT_F_3=Tuy z)|WO>uVl{#m~xOMKF~riS$PG2uHzP2HDX9pOL!SN3~)zh#4R= zOgR61G-;#jkY&B;kO0AfFht!$F`*bxHJ=~fY6qH~2tKASh)IfRh>80twEAgqdGH&w z%GTt%kvrv-$BE}@3Tuj03T8@Nsj80iIQ4jDsbi`77|@Q>&fIR=?tGlTEOxMH&?{>& z(^TksD^d83m zWw7?%1eo$__lvd_M@_V7PDSNT(fwhm{JAp83d`aeJ?lKRngJ@~M1DhInU6*vwY+52 zRRr_|Osh2aa-=k~E3)%jU@eA$pIe6jGiK2;8EwTmQ8_K}05mTaX7Wy3sq26^J$ zB9Z0X+#-N1g# zG9H&7*V|F$qJ>QT0qy~kfjlB&x*v37_irPIU6<;ZkO};7{uonlmz*)3Zz;O-W8))}8Z`sgNbWqI;5ylGYdoiAnPDdMNTSEwo zz=$ck(HJe3?1h|Xm;?cY*qG+b?KVH3P&wzePo0i;fVUUUeG3J7xy}ZqxZaUoSad9{ z3ayu7AFNAZ9QH`TPa#!7B~_14zh*@-#vlezC`rr0NaM%ui7YuDnNx{a-u_Owyvr|W z^s;7q2KgRU(mz-kZ`!8s%5#U2g?WMeI+Cir1f^PeX!^+ug)^Dd5OJQk*3G*XyKj7g zxJbZB4Sg3nET7tG9BHXssZ681jHNE~e$nHd=|S*HNpgI09=Bl0aLHHO(AtyQQCSZ2 zsA^tgK}oJAfexWOpj`cD+wol;s$A*e1l4MZR=@PCc`MEl z;HWhHqhGN<7QwjS6g5Al`9`z4+03S9Z?#+YldR@a)BOQMQim=F8i$=ZtC|YCZ>g*% z!@n&0zejyn=a^00TG01@ays|rD0HW(;Hco-Yta+mYj$p<{-@q63w@L6p~^+$3e=Z_ z+=Gt|Pqv$N%?(}6$ZX@_akb#$cTEqg>|o3)I0lYl z#$tEjN!_7lY7Fc>*08UTaqKdmT`KPw+{)doZ?O(E4V2$e+D{mSg~1AX+T%RN#m6Rv zi-nV+?Xij7ZJi(E?+KJylBStUpq5C7nnb)_eZ_B&Sb=nzIC?C-|Tm7GAp^^KYuxl zS3+j;;ES)wrOl<~_Hr&4p*l}i>4S>P@smlblBUD$Hz#F66~e0^oq%XY7@C~Cf}`N2`}WzM|An;$nd&93c8X9ty<>X||-4JlV4ZuDI82@E*1JQpm@qZZG4IuCc z0k<`mb@m1r0?{UdH}`Ky_CS+22q2(h3wJ}qGx!g0e*HJ2+eaf$wgA za{GU<90dAv#yv-KOLZ-PE&}Oh>+A#o0r^2f{1AZAJy{Q12RHyEq6h{G8gTm1 z^6yB{r_6Hb(`0va2=X@||Jx^8eB=!O`}=?5_eLVD2!Q~QAR+MoF8~w*5rhD&0Do!_ zVF-GqZ!Un-Um6%9g5I=$Y7htzT?zeD0|LS5-}TP5aeHW5Qqr6V)`#TsNlaf;hS~)%g!BXZtH+R{yw|cvh_u;AG$1h?Cgxrnw!i( zFQl@Ql`}ep{^-l2lSo1YDk6%o6oSGLRzM3;Ap{gE0s)GG;UHlkL>Md#l_LD#Cg>6l Zy(Mn$=+yYVArKL;2q6cDg1RE%{{alg8}I-C literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/Contents.json deleted file mode 100644 index 38f0c81fc2..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/Contents.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "provides-namespace" : true - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Calls@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Calls@2x.png deleted file mode 100644 index 3d12d7e27b695169eec983a3ab5104d07bfcc012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1887 zcmV-l2cYPx+8A(JzRCodHnr~>8RT#i`x4FAURNFokD^!w(76?hA5P_7i5yc>s{Z-8Tun7E8 z_Cak;Kjfz($q(kB_LoEu3O2A1B5^2+h?y2OqDJ*)t%j^^?%wr#Ztodq@4tJ_d*8b| z>ArCGob&vDp7WeP?|WBLQhbUTC}yCTfno;!zZpp6EA-*v;pD``M13NW*no{E)9LgR zz-q=10v}jdSja%f{uKDX=}&KO_B?}a5HnX!N;|x{taZ5|f*V&kbo;3me{r&6Nz)r!t#YEu>;u&Ql z-P_jICe;!6gs$1%-rl#E@oPxmYr#vvTf}#XAuxIfffc~acQW%Ig$ds)G%DeBD&d5m zzrG0|`0ZqGn3mHq#(G4>!Wf3H(7#ImHqOZLHA#Q6uC8uUoEje=m-|6A-D;9vL%$yS z(~LLKUrXQDPmwiw(2=4wl7w?^{&F`$#uz+CiyS=0J}1x{mxjL zdcIJdvuDpfG(A1NnZ$JB(@P3(1D#loA>&DaC$oKheJ>#3VYD#V-Otg87!QfS1t|o8JPo+W^R3S*5fMhskap=79LUMEGy1=!Ga2loA9^CST2n}Hg_ z3D;Qv`c9tV#^HzEV!7ZP8*({|@_1tNB!DdSMA6K#C)edA&%nUI+9e2Wz+IzG4fVdl zDd?xe&z9m3gMP7j642V(dJ4w#VTycc7iwy1Jc;A%-sZ!bK~V)KC2(od590IF;n=zm zB;$vdm?Sng&65BaWru0ANWv%|C|-7dv0>)c5!icfgK7+|f#80XCVho>L(w6+biCLS zo8U%ud{EzsMPl;oo}P=4Qi9JB0LOd16ZdpT}0u&(9AK_|{lF3s6ELE|!;+&G&mWa0{U8U!@M2qh5MRRh!f25yfX_?^ak>i!B5!mOI5Rgc&dFUs zj>9lV!)W-D!j~>y!;gmX`O!QtLw-yOC%Zg9e#oU|4+a&w;Lw?fBTUR1?g#s9P6?|7 z%+1ZcDZ$4PF;2@(aG&UsejGZ{v4>;$2cUfYF?x)bfE;so@7}$Q)})bUm?+I}DD~Z| zR;`+*ay|gH(@^#^W^zCFs#qGIkf3J`<%De(d-bNrr12)m(X$)n#=(mxJa2Fd8>1xu zAQ3X#=?pgfPg;0IMr1`tIJ<|MbbR#?{1CusD$%eZhnfq7*A38k70QuFX z%*F{oVU4L$#fKxZcE<=rp%gsKi;ccf9pfw)ntFTOiA-j{K!=jCfwiX0HcP-%rwN~$ zd7ak}r_=M&FH{2Z5=<1Og-U>|dH3UobMwSLw%G%$jmtfNHM|Qr1AHF^>K@STta(-T znN3hLkhurQCW!2(&R(LCk-J{kot4jNa0ibg6S=vQOKvz(BijeZ4QPM?aliWw+opqPPT28tOdX5ik) Zz`yZdD#Qg+uzUKSMN{52vEsXC7^;?< z)-pNLqBznxTXveep?W&EaiY4Nx4N1~RNgo}`SXk5ITDm5&2OLx{@~$)?#+TFh#JLzwNnmc z?u-gfFnB%p$*9|`NU$D|@E2odVL87!sS?_G%Ky?qJDfheIP>r+6gs$MpTaX!E!F4r%bL z=t*jQ&9HS;PJhKcZ-W$0JD9?zF`mrCg}Ah|Bu~$!Q<*Mt1n#0#qyHECA_sYZpLuw3)m|Y z#e=qSZEQ`YD3q`t-bC(g;C1c+$j#pN@%U}%v0-4YTA*5!P>HG7Vs-zYXnk}urOi_n z=?k2Vg)8Eu1oyS>`|!niex7IB6eb^&w)D9B3x`#x$Pigbxb3EC0)wr7RjNc}bwr`i zB4WrPGOK2q!W!96G0l_H1ss-oaJMjvXg-8PfRzmm#T0JU&%u8#aD2Q2)-m;K@DSal zn-5liOvGWc?@F%xSVs|&D#SdPN-93V~C1&o<+n(}AU)w-s*$xW+zGo?=g1*6jwE39PiG{vmq zCh8FSH34QH$kI{bPB|0hhm58omLR{+ZFA2=t%SNuqmF7;D}5()KQ`t8e|k!%iicxL zWdREs9hF<=aQGodovHC#s|{&{85RXo8k~@qk=gd0zTHBLH5I7_*_e!Snia+;3U4#+ zx<|Pl>(wQ%bG*92lr}(BoQ595K%-n!<81>~W&YdB{q*Gi=9F%BbF5$YH#1-rU`*6QXd%VnRF=fLx@T10l=Sw>S%TgY3!I!2qK<{+V=nM-kebN4D<)>DQFtgv3WWLIrJnK{l1fnjfY$Td)Xw7X;S5p!t=6J?R*cy*nMm;smwyUW;-y*@-x;vkALQ=IoIjPPwQI?fDS;yZoo zdGE(5clEBt#l^NCWd^t*|2Y7M4m>|hL^n5E3ihwgm!z%LTOGC5tHr+gvQB8@xl+%! zTAYAI>tW7cs14e{NRZWlaFcB6 zw;;)VYQS>;gvH0j7YnWQK_If)2VlllF*vqO*X?qHggR^NXp zp`_spH_7)I7{BozO@NPPWC0Sn_sgr7xddhs*5@|TI$!Y?3z#aEpdMweX{4_M>V=e2 z&%a&>*bDkI$t=W6t0YZptA@1^`wh4VFhQu$`4EUkmnAtVR~fX)H7!UhaZGDCu9M=D zEdLbt@rf;?aN})cd5vmsdt!hN_l_M)<>4^6&@>?{3nD~TC0`Q6ELs9bKWb)0x)yHQ z>Q_^6ZF3YzWK+uguA9WO-ylj)c-zF+^aul0+P%*#^@xVzt@tz1F@MNhw!2f%cSec> zm4lEwhI1_kl107#Sc&~?$fui$lL~(G>qNUnMgZ+g#Hy5gfd1}=ydy9vu%uV=NOIwv zH$fm23+5ufD5PXaCdKZzKR$%F6P0#20Mh4k`M77N!PKD#|9&|5B}_37O7b~zu)7-V z9=w>gO}P9UUH5m>i4t5Kq~D-Z>GEsPTX~uIhc`ilm^PcvoAm#o3cjMewVV=Inqb%c Q_YDKO4`Et08aAQ-0m&MHKmY&$ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Contents.json deleted file mode 100644 index 4019ae2782..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconCalls.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "Calls@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "Calls@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Contents.json deleted file mode 100644 index a78708ecb9..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "Messages@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "Messages@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Messages@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconChats.imageset/Messages@2x.png deleted file mode 100644 index ffa49c3ae1b516b7dccb3fa84cc3d1ebd26001c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 zcmV-r3YztaP)PxSZ@1{1!Zc*wQBSQirY77m~v=Bfw*iuD<2v$N^3~HKG zZPk2eKU7_$MhdEwMP1Y?Ri!qnB6gu-YO#c72AdKLRpLYlLhA~eroln9vW0Ch7_a^P zpXNQinYqt?&og7=)=#>+_uYH$S^oFjbI)6*O`E!=5ST(>3W5J)1VWR+_Jaox=JfaX ze{pDN=;7hv;pw4J=u&QO?ukvCHuWW||2+%9o;`aiF}NCIYcO&(hJPZ?*iOb?+P;1J z%W?gIZtocYFnBhauf@=6>Kf|%d|L8*KzJ4~hJDh4Gj&2U0q#Y%E-v5W~H^t z55{N~;0EKL0E9yUrZ}WoPAkogrlzK>wzjrM5F=x2y1To-K%Is0NlV6Co~P80#S7Bv z0sHptTd38QTT`mAv@mIFJs4p8QoP_jk73X5lzIRL--p3#kyaza2L=YpJSC@iKp?|% zd;vIedAt|wmf@~&OGwvsyHo-KCC0x^NeHNbr#KJ@fDE^=0|yS=kMVC}a5Lpu#wy(7>1rdZcJJQ3^ZfAN zv17*%@yH*0&?*iDx*PzA;GbfDpFo+wOae(X5F>Nd;NakQ3_}TB$|s;V($fFA`uciP zfK1?HcQ^o`!0%x2fITptH7hzy`LiFH1jc;mNEBz}J*OO-^MX7I~JcT*VaR{hJ@5bI)4gl-d zufNTt<{-+ZiME85c>!IXPLlr$y{`}tczJnuy90m-@0D#JU6Q>pIw$(FW*S-MTkuPG zPXNtd;{hAeiPwXzaWMt}Qp|Vpf*bLKll7hzcH)4CcgF$%k={`^ zPF92C^~Rn`y{J_`s~w+W_b*(yur!{P9uVUA zT&}6qm(az@2WbC&*|KH*S@C>%9~bWHOYSrjbNGfaID!&QJeYLbayZ}LCZVad@6%l) ze~x7ET+l-Tb&IC`D$UA#69Cw}dGkLY{1CzlimwZU{{!JkN|<)IuCA`lG!f(TIp2+M zb4>K9=;N8eiD~GT4+85MF03a$GgBAE{t_y$49yk*`4tF zg0YkVfV_XfPde*|iL=z!MINw{2dtmk_o}hOa(}fw0T7B1eqTgBFQKhdAcA)^l2tm< z*F8VFWgdt34vKpyXj{L?G)W$O-o)rD@eBa@NsND;{yg^>`i%}iSy@>#Z))$rT<_sc zR|mr7&Jp%nc*~Y8ADW2t0<*onUD3aWQjG`s*)j>Nkkf}QN~pBTVd7Csd_2-5XhH;H z#iZ|2zM{VPi+%?H&lsRd!~uOKlj6>WB679u9DU8S6ZQf0A>3}UeG)*siasw89loXp z{H17wIt;(lN@h%S=vfMl{x6cQ`f^=rqO<$>)Ly)C5Vu9rt+=<9}o` zQ;l2C;Uuumdg%3KW|n(AK>K41k-?FioSX@m+6AOh0j2!d={t7awYaIrH8&80}V+!uTAPx^#Ysd#RCodHoePXr#Tm!hWtTUixGE^VAApLbbU_gT7g^I_S_LgnL95obi8Zyh zHnoXKYhtRV+C-C@7~Ar;q(TrS>Mm|Ud<3YqiY%ZOE4!{Dl$A#XmWBTQCuffLo_ij1 z_ujjE7tTozb7tn7Z@&3|-+VLkopYBiU6Lz7AVDBOAVDBOAVDBOAVDBOAVJ`GL!jh% z8?YJgf&~jsIC}Kx)!d^g8(LCQ(vx%#_Xf&doHJ+6MnhZ3^te&Lh7B9aH*elN>d28J z*8=u6fO}$D4 z0w! zIadp(JAerc;N*M`qK&*ZXnV=0D z0_+L0aJd%J3&>jwRRF?2!BdOp4-9YQ`U89WCO7}!{Q2{DAm>x2J|r#YoN+aEFND-* zU7QyM;K#e+$FHP!$F1PUD|s%JGz>~fyIlZFmuYLrR^mFhO8^YxCF&}nshKrvR-F;b zmH$U3AC=Nxn}d#3fCjjD@#0}}DG~@jJ`SOJMG0Q$IzT-{ANO)AY_OPnJY@~sxAE*; zfWDLm-Dwxbb1CD{x@2={A zkbQvmSl_;VAI~*jgV8O6*9}qQpuYtuV0ILZZCwVqEJ*$7pbqfwhDk=fE#vm212DOc z2XG@#HxX9~1>({T} z%p7I>3+~tI;DU?J%XZXLKtn@=;_Ij8IDigo4siYV?%mrj7Xdi1t)TsQ?nQBY=x@B< zGsn@z)q4tnVXW_qW7d)N7*98>ay!2HIh}0VDhr#N*NFG%Ko@z@U+*njw&;tBoUSs{ z8sP_;=T4qZAzm|sG0bi2I9LmRW78JQv<|E>w0e0&7-k3uwfFd%;y)O5tUL1*0C5>w zHM}}|TG7@4xFFtX*yG;k(I;+OeFCF*)_0?n7dLI%w3Tp9 z#wNj20M`GGWv4|=#yEb*V!ETPLe88y^K+DN54XMvioEEnEAFbwM-;XdJ_ltiWM(|A z^OkAjDS#Kwbri-1u1v!sPH)H3CIe1jn8ikJ7UDmG$Hg|Z(D=8bHBs%5>kgFWo!C7E z@RsMlG<-X%aVM$Mv|ox6exHlHEaZO64rB+QX$LZPP^*|dk&7v9e#}g8;!U0c#GM5r zQhR|C6ltLbX(Jjy4CH={djX5)qvXQc|x_OhzJzP^DiVk02Gfz_Tteg;4cHgr7e6ZP+LD=KPz z(JpNr07F|tu1-_Hq)C$w!fcIo&qYiK2zLRp_l66reul9bs~%0%w}JfJd<+3TdPC?f z`rW#9dkwxeTiNrxMn({P;m=|AsL6Nc6ea9rEUz<$a_&im91DlAZ}QIB+scFED*B!f z)hF^TPMZNPajgG}Vp>df0H71`_1pyoUt?y5`Q4BWj=M4xz>Dp7;ir{6xw1nbZ6U_G zV-*0+)(izuc$C|A5y?)(W1D)c`%2RpB`4~C@}RR-=*0|uFGB$?b*%P6xgMt#fZ22B z&Yfe-@G)XV6;_#iP};k9?_dR#m6atkAPBMeGXFXdiX#eYnlfcd<{F?r_~>Xm1Y6?! zODKE@q^$$YiYQO=p4x`FAborksy$z)N%m_5MsW7%Z?Z&Xw}Im}llP_C>_jRcN_#$D z1th0^+%7Q9YMpW-hVkYZ&934iJ$MRk9dR5U_0Iy*U`qz%#maYDw(G)9q9-x-v9z5?8||(2$#_QK(3W3&(h(C{>+3J$8&YtwQ-D6B!0)bx z;dMTyLD^;)*Ks>;1*`rbh$yHGa7+2a8YB36K))xeCR98Ix~yXIL44c0jIr++G-#0A zws%n`L-O+OgPj6gVlj+Tz%DF&4!fq8aVyrlCfv%o2mjK#!EkdsKfPa0e2f(FX#Ou$g0YHUovoQRZQ5pDGG7Lb<5u{w!#JLMvM7Z#i!J^PLG_784X^lW8C;`jf%}rB z{nX?;Fg=2SJ;@mFM?UXEE;l5JARxbU0#x3{(J}oQG@K1o($j zJLEZoPgDUwYXEDwokg63SDK)yZJ}KX{|-|C{VPzZpTqtcIX_I5P0xV;F!GJ`mn%i~ECd&c#%uzK33DZqMf&9vVL(@Vk_+mtf^SxXJmwzgNVUaw~Ji$;CnK%i?p?Qdj& zw~*$tp2Ug!KV)6Y{R(~6V&(7h966$S^PTcLK`2B3aI!J$uHoqjLV1Cl!~$FDn^5 zX7LXPF$zUo72>Yt#}jY!tQl%`v9&&*eY|5BG|&O^B&&uIL>Swxc!jyCB-S&)ZKQP| zPyr0?9GAvR5ZbXE{J1j^rt6hdIx!yVJi2^5(7zaJifdP;v%_obs=SCRGc&Rq{c#U| zX|LUt4tdpVtMe4Bj zMFeeHm3|l9*w{Em#(}&7U2&U2%|?YFS_#zkNsSdrpsZ#9R<)k3)~5)X5nyshH;p>o zZZ^LOgZL7Tb?~o6mYQt-t}|^)a4W-!YdN!V`}Xac$>q*-_!|3S$Z!G-!^gZp$ zY6hq!j2`8_jlrCj#wmZ9_hDsD$EyK+pDkX#Zo11z!7Ri7 zizsUaXur&E=vLZ3&mFiWrQG^LFuAl{rBQ#35k>|NE?rq9!QUI4lujY2PhYEMwv@4OO@!9ro z__TM*nsotd)<^z++pGXFa%0|40K&C?#wHI)3c9T$b&mOZ&m8oNaYOGv1b@=>sqPxOOjA*Yf4d z`|?*$#zX9!I^lJ(Rm0*YTE`*v@*okjUIT)dz}NJ z7IGN%iWMongtTChQMcaz}G4EY_^!qp%z$jc zbN>{v6mc1CwL^1K^6l-$c47TPQ9x*r@R(FUn8FkrLJ9h#(eqn8()mrr&mj6pEU+zoq!|DJ002ov JPDHLkV1gD7-!uRK diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contacts@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contacts@2x.png deleted file mode 100644 index 115d8526c5045d8b7c76cc0fe88d318236aa06b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2073 zcmV+!2RP)Px+(@8`@RCodHT5V`nRUF^57uR4IQj5w3$&w;_6-Hv2Sx(TjjACwWIxJZc1Xk9k zz8Lkv?1esMBPsW0PQ$lSN^>}~1f^mn7!?avR?HHj*yi5){VwNR?sIou?!C`>_7FZ7 zF6W&8`~P=d?|Ghrg8Y+5Adf&Efjj~iF9NBlOnuw7ZMUaVsg)BG6AMtzgzu|`|FfX| z3feK0dzzY>zMiVMrUZcY_V!1{$H!kra@R*m3_yHeSXlUCV`Jm4DDs)eWEFtc*49}_ zx)TA;OBmz{fbr;>HEa43>RZ*a1^|*@2=5;PfXl2=7z6;opI|=>5RMwe60@=b0Fy`J zhY(ds;>gk!M*u`kHb8I=0EazdKbdLIr{`Z#AVxy9>*-J!c9dxwiFdkAo-xrTZD$%^ zSl=lCT4F!IP1T+!e5iPdXifp(R%eLfU{O)gHGCm+P$6gIdny(m3bSUCvo(N+ z9Ju;Q=Z=YEU;l-C^kU`M*jRs1*2WLYqCVHvVaeGDz#_FW6lB(#E`1fdiV_Rd0+TKD zcnf;InKG=0Wo`VRyvd~00D5I60yFtr8Xoo`VH@8Ur!T*eVa3@LKpgVJCc}^- zsXO!K5`dyep}P@s=F1rX82*1*avR6cfaHEmH=W)B ze*=!ObFtms2F~epuGczE9=11br_U?+KFQ|G7mQGG1^{~HgvFn?LgFm&ZCP1aHIi71 zcZ+z}l13hFfM#4xA@ZfgS7f&JAcVwHZEbDqVDWLhbI>lwWyO=LSFe7DUclRc)7fU$ zO%IY91b-Dq!G4n*KBiWHzXN{COmgJG<^$3m^xlNddeHs>iz93+Vtm&Irf~!yxvTIV zhT#^xci=6jW0cETipMzgr4V$O&|aJv+i)JZS<+?M+1Ysud6W^dlBF$+i;I7dOz7Ot zI?8gqjJ1WaGY2W7Dz)bT7+}x0qr6w8C~4sTE$gm{#{F_Hip^}Ppi zd?xF`k~uJ!AT3ze0stY-dF4}DTDn6rF#l_0JqP7t=@S6>F-cmW)aGIWU{1h*UxlOd zwY9aslhEDWeF@stK68pI=v{vVpi@*^tBgpQ3z;SWq;j^(NZ8G=MMG$xR2jC>aOi2~{QzIqZSpEUMqiJlqkf~TD@tW9lrsUaRbj{@ z4G#~ml02LVc>9~H$6t)m5q?aHV6?et0T73XBMM{Os{F+V^#W^5p(m}nP0T2u#mv!SVkj=ov zIY9e6K{kB{ZRZRC1QGdnfMCF`>&~XYfddChT?ePL=hBxG0B`_FojZ5#eOGVaP zF6VPkm)vNl2ca%e2F&U zxZawHy^N;-zUOx#kjHQq=e2jN2Ra|{jim%(=byday0i3DR8%aX{=mS%rzrgEEz(R60DlTS|F%gcDlZWL+qZAO_QHh=J#g~*v}w~e z)YsRar9*)58UT1Mg7Y)D)1Tka&~Toz9UUDr@MZS}syEnl0s0~Q7~%nko2hbK&TPaK zT!A>2Ada7H`eA;eDS+$f4jAH9c0GaMdSn zuXtBfNaQ=bHR!R2AUjNXB=s~dGJ-crVKZKvGL#K4U%)TNw}S2gig{mz5w`_Cs{=B! zIw>~E(3MF5P~O8KpoRFrIfYxHRj7M*(PMi60!PfIIIA{g0m7@$dkcwg#t$*xh`^cS z9?biru+Qr`)uW6}B`9erS&3R=p6x>b{0Uq8Ao!D5)avW%>VDD+Ss3t<+PQOQA(Kb1 zUy2_-c>J~f6>lE^d(dJ!jU9E*4l42YeIoz}v>Lm^dytE~w+9`t4iI_9@OmD}zY-yN z>R6{(*iY;!fZ@3njy?$+3bzq(g{!YN*t#=pKipn0fxQpNaa8P zbl0+F%e)0pB@>gz-}glz+9RU!O{bH2F4kl!Ee~##b&lc=BvA-w6_VevL0(k^3P6Yk~8GSLQRI53q00000NkvXXu0mjf DusYCd diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contacts@3x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contacts@3x.png deleted file mode 100644 index aaddd096eb73ef94220a1a89d73bbf3cbc5e4ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3350 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 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contents.json deleted file mode 100644 index 2554b4ce50..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconContacts.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "Contacts@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "Contacts@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Contents.json deleted file mode 100644 index 9a15c71190..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "Settings@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "Settings@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Settings@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Settings@2x.png deleted file mode 100644 index c00ec0876d1bede15588dd5763b5dfd0314870e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2231 zcmV;o2uSydP)Px-aY;l$RCodHn|p{=MI6W7m%Aiwk3R}+CDaUr9++EE8EV=eQMgGYuDdHq8B|nc z5*3wg3PF@be-v0`=<1pgw$kGtOQRynwX_G)L#5h`3QBh|*GId3zLz_fv&S=YX3o8v zMfbq$%>3TJ-@JZv&fO6s%1=20CR}KJDND5dC%pKjIROG2eoJyrH3C z&5Ri{j=5;la9g%)sqX3NX@l+ooS&FN{}{7yX$s8{bWi}+tXXpB4uRN1 zS=!RlvX*+#LY4?dPsQ4`Yg?$>DdQ7~jt35)XL?&(+xy3(k|99>VDxt)=7MBVPH1;^ zb@g5I=g`!pV6?XeR+^ri{*)X2FCLjcCQAcE-os){p?4nb8=r zy=HjxBY(Q-N9xn_I0Gv17(hVnZEHvX&Im9dPWoL0Fg?0>HPn<5T?`>;H0MeBH zC-ETx__YWRqib@jLrxSI<#DhiqP%Sl3BWIjs{DXA7&7hlw0}4KNd0>rXFvrW0|=BPk_U5Qg2(mGeI)6o6wRw%HrC5 z`Z#)kbarHe>USBi=0e-Sg_Gqr&)1OAZOwg*E_$O{nyww%#_Saz|OOlCQKsy6m4BA_p- z9e=C=AaXlci@AF>0=C!I)?Utgw<8h&POqk(qj^?TAaozne-a~x?Ufkvm!SKKs9xGX zq5F26+$1#pK2HovVPK}Nedbq8;=^;`t|E4 z5#@`)9j0vK&5!qVH8Qf)yeS%wb9yOS%k11XZ{ECJMoxEkcg?O{yHI>2|18Z~PBoH=v$i$1S>2F+fk+Xlf({h)U)GV2+HEoKllZrph4!Gi~< zU|Tb`wSupW>y+2iAQuz~_I+W*56qH?Ogbzb~ z5WTOUOL_;8-;WI^rReFCFE$$MG028@fL+xm^OFGuIq-aGQ&ucICR;kwoYzc#Nxs;0 z7Yt7#;JDkI1b4ye>+64W;fuj#kBi=IQVASaMl38WKEK6!XohYuCA_l0u@1rHS@CC!?=b}*9_@JI@SP?Ki<%`uoUMwty(V9V}Ie_7_xwSoAOc2CN{{M_*rRlTb z<%4{&;%x}QabODPx-LcITy!oR25cgOYi(+33i{%!X`dhYVw~Sg`g|kT^zAkqD{Ke@ z=M7Lj0eFtmVqno42j8aLDi|~?Dc3~tYJ=ZLwUkTAs26f0WNv^k)sT3cM@el z5`afb?Yzt==_nb$7=2x1-=#mzz>2Kj!}+TSg1!co^eOoakaaS&uCA_y+O{_JarHsY z>}e`$QxZS8N(S%t=MRVT=p3FIAi;Wg8#{)twaYMG-wW%Q8Tyx+7m|KIpjpG6Lccp$ z1kF_F`)R*{^AGdmjNGkJGRsdn0_6ylBT$Y&IRd4Nz~8SPz8(O6!%+YL002ovPDHLk FV1i%gIR*d# diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Settings@3x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/NY/IconSettings.imageset/Settings@3x.png deleted file mode 100644 index 27cad3a239863c18e13d5399156cab53152e15e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3452 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 eK#oAU5%?dUvSAC4p_6L>0000 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/Contents.json index 14ee7b04c8..24bb65c00d 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "TabIconCalls@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "TabIconCalls@3x.png", - "scale" : "3x" + "filename" : "ic_phone.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/TabIconCalls@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/TabIconCalls@2x.png deleted file mode 100644 index 77e9370cb670b78a5c065651f6a2425e7d19f894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1006 zcmVzC3a@NJNCMwa!dU+N&Y`x}hIJ zOMDbb;w?gG>)yNNjC#zya~sSYk#Oc~&SYloz0cljuRW2-|Mib7YdM;c zU#We`6@I7sVI3u!}G?86QSu?`+ zv;m@)^kCE;2(O1-quU{559FAKHxOrNxLhBW2fN*1knsw?d^GEDaFOQbz^;6494iQMRR3|U$YN^FuB%c-Zg2TF4LKe z)v`*vZ%0OxOW+vep#%ln(0@ zxGa@G)ESDSOhNFJ8)Aj=JnUwdmgm;IVBS`^pI@C(&AT+13)sPZ-+i+uXn77{wbMVS zf=Z>QR3yT3HQ#Q cufJ@41_R|#?FEP)p#T5?07*qoM6N<$f(v@&>Hq)$ diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/TabIconCalls@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Info/CallButton.imageset/TabIconCalls@3x.png deleted file mode 100644 index 84d20ef01b71d0637019243bb2b2d51032ce0fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1551 zcmV+q2JrcbP)x6|!7Je4w^$TPG#Y9sLF~dla3UXUtV%K#teu7@hM+RwQbWOt zEWFGRkBNoB>Eadnm-U2+V3$KX!RyCDCr*Bc9})Opt5XaEi)*llz_#Oxp>NCYgg*&z zg;`)XKtF+P6wj}e0}RoTwg3;aWIk zw9`D(hddnC>0)m^z1$Z)OSgigyH}TO*i6zo=`q4cmBtJn*97;#3>lV}&G+;!_7d2O zIvsI{;5SxUKQ)&QQG~z^ln1{ zmo8whRj7>K(%={Af{iKgiR}cp2Oo5~4)Gh0YRV=Q&Y+P1wYU_Za&dt6-;I=1^;?L) z3D6-mAbgbz)^D0Zh*d1XZ7vq1lmQo-;xcx#Q&_Gh4Ae5<&8C>N1_IQEnace{uIM

(nQzQ>4;`-+=+1E|dtz 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/CloseButton.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/CloseButton.imageset/Contents.json deleted file mode 100644 index 0b160dd6d4..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/CloseButton.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ReplyPanelClose@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/CloseButton.imageset/ReplyPanelClose@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/CloseButton.imageset/ReplyPanelClose@2x.png deleted file mode 100644 index 8cc43a48a7ecbf253ab668a125ff49dacb4f5093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1SD^+kpz+qg`O^sAr*{sFSqhG7>KxD++Q!1 ztW?67BQACD@1pe)Z?9}zv}P{%Ba6@G3vb@7-MX(R^4hifU%$f+`D}L$eiV1(um+I?m*tqiR8CS`PE{A5)vcxcrL4`-d{q z5?*}l{dg}}Z$cK=?j)YG3h%sRCvXM#Ec|2M{%xw)m)S3?yO8bg K=d#Wzp$P!X>s8|b diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionAction.imageset/ActionsWhiteIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionAction.imageset/ActionsWhiteIcon@3x.png deleted file mode 100644 index 98dc6d8d62a499dc3b536934ef58dc36e42a63c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 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 GH!c9*1QmS% delta 1349 zcmbQM@LOd>K8F6J2LHH_Ng+wetz+(vQmS$ zuG9B>cK!N4`Rm>q?fczdZasSuw<|>Q;+C2zVY_?naz$2NjOv(D{c~$*;B_;#jQNIF zIi6&H5iHx1_0Bt-;TKP)?fhF(wQH6>JvM!-&6?=2tUuzt3#OFR=WleJcr0EfsC1iJ zvV3LIlkb5mJ-y66IlS*Y_tAb$b?9jet0>)RuRbob}BrYKupTOMINh)zv}XLYq@h zS?)b`Y3JgQ$Q+tz5wAC-T|(Qhi5Z)a7=~{WXps*plmiH$`r>+vq8_ z$d)Ik^xVTuv9}MuusB}$;*3p7+0x1lcAv!*vd!*uoIJUNB~1FNQQT{h*w;7iYu>F& zzh`tis=Z*fQTV(>gR2+XW!U^LH``bUZJ3o2R3+zT@o&i;?!cPq)9zLFYpjS!vyN## zdE56<(*3RV>_O^D&G-A}9@k20*KI4l6n5#<0{@Rkq>2+%G}xR@8Lj3&vNZMGvz-&u zQuih{tyy|i(v)4*7SQX6C%sUn5FTCt= znsw==Tql{wy5g7AUYjV&CCmOkm%P72PDfZUQsHHz&QGUp7C*bXxRtXw?HDS<7A0>J zKTvt+W&b(8mkH;W&3m^yT5A7<*Hz-zuH1-xc}wolZKX~w+rKBAQva*ZHLLjj&MbVk zwqaO<^`d9%Z~h2g^Emxy-1_dBcjDKE7{% zYW~yP^*6j`?3%oRQHt5p!f5kZ#>w2QMrH~|Mw3%{69s$|lNJ1f6(ST24fG6+^-Lze z;nm`{FfcPRGBh zBwHq%r6w60q#7Eh7^Eax8mF0>^60008ANkl3cd$K4CtCtcS0FPk=4;2k0zW(>v)sc{tJ$ddj@9{4Snyq@y!Q zZZR&`ChB<}X-T)d3P0)#at z`}UuQd{yxV-<`&HJI>Wzxbv-t@BAM64Xx7dp$h#)K#)PTJuv8ZkU>A74ca|4BoF-( zLgufM$acR;`zRQ-HD^$m9O^)eA^Km*w^t6C;GsGNV+oCgsbZ+$At{GsgL+}w08oH- zg&cAY*&Lc6J>t;CPL%xsnk7AQ(7sC!{ggvSQ)r6xNJ3|!${wRa8(}F%T7h91LDQs1 z209F=zyvCG&UgP=H%Jq#W3H4o?Y47LtpmzSB>D}G&jLRWDGv@AYSl3 z?vf1xo#B9!C#!Wz9PtEpP2vv002ovPDHLkV1hIMS8@OV diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionTrash.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionTrash.imageset/Contents.json new file mode 100644 index 0000000000..5337461304 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionTrash.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_delete.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionTrash.imageset/ic_delete.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Input/Accessory Panels/MessageSelectionTrash.imageset/ic_delete.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ece3e64494b63868194e9cfd94b908ad8b48739d GIT binary patch literal 4692 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 X=;29DjUPV*4wDoI^YN+bsDb|jVbvi= literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/Contents.json index 622e8d2050..9712686f35 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ConversationSearchCalendar@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ConversationSearchCalendar@3x.png", - "scale" : "3x" + "filename" : "ic_calendar.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ConversationSearchCalendar@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ConversationSearchCalendar@2x.png deleted file mode 100644 index bb77e0e168c2ae716cc686da37f432825f8f7dd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBx&nMcT!A!0-7|*v4-EhRGc-J7 zXnxJm^qisoDM+y4KbU;ZPzUDL14Ujj07)PhsG#KyL-Pxe0w5bG*aT)byacg<=D@W8 zxj@tiGz4M}SaIiThIXJ)PZ=73fWkAR1mIV0)GyD@|Oi{PL`GKP{VNdF3 zp7pn;N-Mtjd0O{~(&1%K4*mVT)G<5q-A!JV+ac>ttg>!@%D}*A=jq}YQgQ3;boac& z1_G{;Ywqn{ykq;7`v0#}1zGwyS(KZ6S|n<${~c{!AvsCnS%HO2@#ha7Pj)f5)af63 zy6W)^miOPhZ+*Yz-2Bhw=e+7GYv*iBy?O1$%KVsx*M7E}erws_yjnTuqM#Gs%F8!| z=H!X$GN}J)ck*4s9UD030_T4ZjY&o)J}>ZT5ls|nKcJo{V_0S;V#YinEiSMkl8cAe z`b|&ES*fZ2w|>xGBVA@9=*DdJXqSjI&qNc!V=IpM)@mJ5%T;jtvAwfDK!QVfN!Ao4 zLxE{0u4p)CD)2m5IkEkK!;HlNi< zQ1Y4u>(+}m=$|JcrKGT`&0ID*_P}( jQDU14Q~25+|NFsUZWJkf>!jmjP=fGu^>bP0l+XkKR<#93 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ConversationSearchCalendar@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ConversationSearchCalendar@3x.png deleted file mode 100644 index f8cb42ce610225525e0f09ab85ba069e76a9bfed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P3?%t>9eV(z)&=;4xB_X0`e$JDl%eh^L(_98 zx8XlS!&4A@=6{BIuvFu7hK5&Q_A`ctXAI4+7#e_zfl|*vXw`p^cAy%d2wX2vyy+Q3 z>uZLFmmt~B*9eRHfX0F~HhctW2kCms@E>d!&~T8MFTjE?Kz0EUP(kB!i!IMtfDX1Q z3GxeOX#M>2zjpsswkdyE_il3J*<4wrTC(xXGv;LPn@nA+V~r)1-tcaHU(We^jZl7f z17qX5KjG_j@&X=vdVl7)&cML<%+tj&q=ND7t<*9lM-hjI)1S3XtN0-C?%js}t-ZfZ zf-X#*Rs5{Be&X$Qs$QB)rv!P$R*19R_YCL?QMzx)HlyDC@c)V*MsKUb;__Tg?t% zg&OXC5+5JvH70+Rtw>_=c=Cp2j-1)zMBeO(!<-j4{WP2X!!Mvm936 zo%r7Bt=NT}jyq+#ZSi*H)wMrE_kZ8{N6Bb|gdEf2jeqiN7~@>y-n7oQD}S1={NUuH zzW6T-&8O|}t$rZ>w$=N>EAKgV++N=f*=Z6V%$Ywt$Q2rfS2K&6Z```tIglefK^2ySv`^<5}O+ z)xSSa=6^RQrtwFC_VKFTz0ZE#ncKC}sV8&v()UN3>|b{;(5zy1)s52z&-{`M zt(VHg6t8)HtFL9Kf|;fe9$3d%F6$taD0e0ss>-c=!MS diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ic_calendar.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Calendar.imageset/ic_calendar.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8a6c808dc1a86e713ffcbe99f9f40a32ac45ed7b GIT binary patch literal 4422 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 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/DownButton.imageset/InlineSearchDown@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/DownButton.imageset/InlineSearchDown@3x.png deleted file mode 100644 index ab4719206a3a8b8c71958aa6855a65d523d03630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^7CVBymPm7=`1$MXM5{~|L1P1@Sd-|K>th9lPyfE zURG;4&Chn9|NcmdhJWb}%NcW*e=p*z-516G{8U2uwEZ&Ia`!ZN-?M&u&X=j?bq{9{ zOZuItq#rBn!hf*jsmgMBFny0=-l+KVf6wl#jzT-^%qL6B%rc$8a_*O_%EO7bEaWtM z9#1@kgId{zTkhnel8MLG3R}dgG+uVzWRa=T80`KoCas`0kMF;hGyBvRpYIy%W3SyP cXg?#}V&Wv0%^Pg^fFZ-+>FVdQ&MBb@01KFe+5i9m diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/DownButton.imageset/ic_downarrow.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/DownButton.imageset/ic_downarrow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6551c6f0b41fd254e1562ab7e7a5d3f2ce1f213e GIT binary patch literal 3971 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 T%+c6t2m*ydf*}wcoG$o3>72Gv literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/Contents.json index 2fd9e5003a..05df939c0c 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ConversationSearchUser@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ConversationSearchUser@3x.png", - "scale" : "3x" + "filename" : "ic_member.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ConversationSearchUser@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ConversationSearchUser@2x.png deleted file mode 100644 index d0f73084f0c6e67cc83afe45db7be6550655ce9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1169 zcmV;C1aA9@P)*&d8ok$nr&$@JnRUK{EU=C23X|dD$79yKXPl?;zUo&Y+Ha&yJ{V*RXg5~SHIWW+=@icyD zo@vBvOD6ptabo26Wcd`zvgvf@c~kf&8sT=LQe2YFMk9K5p@birWJ%wKe~)$MZAc0K zhnXklRn7>v110H@%-mZkN~B=;Wm^lDSH)5;Xz&T~wJK6Dis2_^CLcr5VEAR+v~N{HvAmx=3m>FtkOJWQyijca;!=@&VrpOh@i%=-HUou% zMjLv*kIZI_r2-Fn1MQFVQz%zwGoc-VUPK1+`_g`_Poa$JTS=BM$M^bX-D!2uIzbG) zgQ7ty=kR!eLP_{F(KYyePpwlsSJogtmO1~ji?#v)*!?EV#red}Z zhVLYkeoTgc#*jbXiEG`~aLe8Lkwc4G}iE|lbG}vC44xI>R*Ly-<%luGyVGS<*69B zh8V;OGAq9mQ$C@QZZj$aVh}4i-*vu;6Z+?pZTY`TzTV*)ViJDEf7XE|n9n?ZrmANf zVv!>=v9p)6?b%CAc#6t_7~8XD{%MHJyqXFFa%3iYtqw#gYx;)V#F6FW)4lSWmx3Y7 zwlpAR)ns{T0ZIl?;ezQ$JqTn`mSrFlk^^GNk&q$=&Dya zIh&Qr+8n|+6W)~nfNxvBnIO+TS-MRia68MSpCV_HXZH2@*;{X5(+J;C#ms9D6UD$5 zj3FA~wg}nMhiUC$V#3e0#6-Wr>W;-t*L0|ayg(BbHL?CChJJ6OCaQq}Cc-!j{CS!v jilQirq9}@@D2nnwFJ%l(I5ww^00000NkvXXu0mjfjR-4A diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ConversationSearchUser@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ConversationSearchUser@3x.png deleted file mode 100644 index d7bc7d4c3a3bdadf13d1500aaf68154d44563aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1757 zcmV<31|s>1P)6^(s+u8l6UZwh`GW(KA&Iw-ss>b(pC;6w(J?fq&!#KOoJj8M!vD`_Kd`z))Q|v}k zOk zay(_+8gx$A9K`v_39#ehb+LPgST-fjPfAUO0m0baUlNrgh~?74J-9qtVEyqoMRH8R zW)omMn4g4V_e4q5zDb;0u!8&a-W0pOWxMQHzN1XC5*ZDK<=XVUG`SL@R}uaHr%ZMg zVs|0M&ZR}hXgk@Dj0O>9cPWXw^QacC%uhiqM^h{V(-EBZ4;N3sP4#9+Bt-E)5@&P`ii`~7F6NIp~|cN6F4qyQK^aAt~RNb$w*knOy! zg2j>){jl6l0WhNE2-P)zMn2)L4O3k;cP~tSF)$5M-SZ&<{5`EizJferT$G)LA{jMa z+;PM*EBU4)yMYooDXf}#!pL;3re5r?CWsl%^Q#v*OM!vUqW{k9d}MeOIF_WL0^_mN z7Xw)b=`PxBM4^B$-9=jlgeO>TR&(G#Lo9T_2YeO%;xQPWIH!BAl5B*Ry$*O_8$R?j z36H_>NJp|+DlL@VksepEj!GT6gYN(svFlJ#^_P!iG1x>hn)1^@fiO5fB}F3YzIZ6r z8Q4?`WfGyZm_KzbY{MKPAKM6_Rbpp1OxVeHaBTe|DG%~i3 z^II#hp$BpBVKnprz(*;OBez=(_IB6e!gdoxuceYAM=4#GBiV_n1#Qq)=RLvpgy_sI zM4X&Rg-QeRF-0PUmB3H* zn4`q*!ZKnFrdS>-q_kvYg~C!M7D@0GKjZiKJFY8j3wy9@R4mk$sB?$4ZaDs9u50Cij6d=H<_;F zE_?N=WRhNf)bm_SaeM;%dY%mbMk=MWpRWDftNWOmreN(@3H(s#@dNyuu!Z8@a%pOV zAd(yorPp;uEL71I_|dCr6D^#qiwZlcOI926T}#*L#s0Wx7t4(SfS;mI_@Ag?nRWb@ z+z;g!@7*i9x_iy2^IoBj$-<8kSSIRd)%RO3iv!wUsPg{sql=NZb+lsfzvpP}PjPY; zWwJ|=FD!zCM=L(wB~JGBHD$4Tum`YB_Mg!j$pG)sYNKecHLv>h&<($bXbpeh&E~=N zfs^ygMk~9kb+m@ZR@L*O=qJ<~_&*ojXpv1|9m(#Zx@I=S?lFkk@*-=2Tj>K!s3>~oH8%-j1{c``)*pSS zBU#T^c42#o9Ld`)DKb(^S&l|G?JYkzn8@KVOk@+e-TxVgiHw48M*E4}&H@|gmLcrF zA1zlW^Pl$MKmY&$007AUwGmWRRaI40RaI30TDoOa@0xcS00000NkvXXu0mjfIw4js diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ic_member.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/Members.imageset/ic_member.pdf new file mode 100644 index 0000000000000000000000000000000000000000..910e8dafbeb4cebf693e124115e89bb77db8f726 GIT binary patch literal 4302 zcmai&2{=^y|HlVY7(x8Lfvse?^2a&Zxwi(9GXzU~uy0+|Dy2ujAT9jpsJrvg@ zgbGaz*&|t-{AarLzun*cJeUP7kI}(6VVyC6x;n(q zABRDCLxSmyE&9D}VXQ4}l2%bd<{yyrmhaP9tN{JU08kf&fj2&MNrUHVH_=x={1tyV zr_{Qai{a_+iWq4;T`D(8sQXnVv0Ave>i#J%z0)dhM&Flj1H7}+UxH`#E0aS=lO0LJf~tvCoJ|o$ERRoCnU9*UJdg~jTz;|8JRRE9g6`Kl_@uUd`Ojlv%4BYVK&7y+ z8E@i-tZw#xQ=O2tG}+q0jx$9};0+0daVK$_De=1eycx?&hxJZqh$v&n7mXs&%$y~5 z%iEN_>X6>Kh(TayRA!=W*kSR{kL;A4-9t7GBip;7plXMnu}H=f;VIHyRfTOg9cz3_ ztN!3yeQ-g_=}H z53mE|w6R`ToP{sS2?Nj!uI&c{lzt@mC5Q4aIezQ`mG3IK3)F(-G-><5hq?&>IUP)( zyA#G7srA3NN8X(vON$BaTSS5q;U%XKAhO99$_%_x)jtk4i!+EcrH_pk4b(ZL$8}WV zlCxzy9rBitlP(v_%^T=3<_!+ho(?k|UGik2C-YjB!sn@6O0V_w#C*fpgzH-PSTo4< z>kV+HzZG4ie4!QB>QaX-=du3oZTb@&bZl01?Iaf$FmgwSe&j1bEhp!Jeox)js%)e) z{;hPIsi@!UgNRfiC2iruAc*d$;@Rt>JY@O|i@ImL@B{FR%}fb+EDX+F$Xrw@G}B$< zwN*AJg@2x%B|2NkXFbTA^20e%=qg$l~$Cj|G;+78zE_I!a2gezpOOK9ayOTfmx$Ldi zS?r==QW;&wq~C*$h@17Sx1l_dHP}14bRyQ?Ic}*dRRSw3*01N>cH1VVPhGd5sP%>J zUtAYmCgy7<=37sDEmz7BxItUOHg`|fwPs!f)q5Y-Ad@Oh)&S7PAyEC)AD>UfdfBIS ze_$13NmyR?@}n#8l$H9Zv|n%o`=TvYWjm*Tb^nrTDbKm6-wci;FuLT@veNT90|TsV zSwv^bHpjtCyNdgt&%31mC}`(dkNJ4f>|+LVbetPL=4_NzimWpvI%1R*aY9jyk@tF@ zCzo4*11LO3#kA3Yu@9>T(*BJ>*ymg*efZK94j81bwZ*L}wZ<hW6$3YNH*f?F_O%GqtNL1)c@P!+SzK3nWm)no{vam)XH6XDa=b>~{QSMAPK5-l` z(tMc0UBaHD^_qj7oiteE)Mb+l5fgz1h7dZr4M(3k7xrm&UpHznz(UY%t)e5(+ZeS*7(cjlIL zA_;v7^%`vm9nE&izGTERr|80gh}ykzA3gf0)Jm-KTp+XJ(Yr}9-IpAb9k0}8Jz^L~ zEvpK!^|teV5b(X;c)}L$qfiZQU>{4wM=o_8A&IUBw@6NLt=(Yn@cV?mCfEvz5QsQ6 zoqW2dO)Q1k2JCr*UGNSd>?Lf;!N)YuM2SAyDQ_0_z{FoDmLsIw7A^7U_PAz?fq>|R zbS{HfVIFf~iJbZc&a*Kg=!6@F%OTSdS)a3Jo>!$;q)pKsTO0Pn_HBL{vDl*jzi!4pzzF0q$MpX zt%1{|Tw|g3mB@WTKCR*VA+H+ijqA_6!MuTT8h87H7KzMVNgv5;nL?Q^nRJ=S4~;Hj zN4ZAx9(q4C8G(9;dZ0WeJoZOrE0Tz1#Grg)o`d|s?AKe1wasy%je8znx)#+I)A@4w zTKRbSF7jo`_bBk@`s6;(CFjn|_tv}Fusi|VkZtCl*h4dORtGFyMCuY$3ahGD%4CMr zOC~GSs+=CwS-BQps2e33=R;+z!$!(iSpH z(xYjDZIAm0isPfhM~^OjBsC7MC(ba6g^4{HHYl6UvmTTfJTh3!!pifB zXGG=%Zs;nhQ2>`J>nxk-5bRqxa`A2EjLp*Cfbm$;d|S%Z4^^^Nv^&u0IxX*J3={-k2(;Y<`>xSuO>7LKBlD4j! z)l0NV1WMJoPxBuS6Ar|cZ@-#6e`{v>17v1Z7GZm*Zut%F3AwzVSe@d~VSQEd6#way z(;NqJ$2!Z&M%9}RO+jSvSUUdJe%gGG)O^yq-45n!DmW|parBT*R<~W8lR>q?af2Cp z6U`^@10FkUM9r3Gq+}FJAj*fz|8$S8->Dzg5<$h+O4%XQ#0YX-^2Jc?<`?dxs~3+I zX$++riThc*;InUkGy0;RD12AsrZr2Q$KxqiB&Ohn*}&1c&Dq>ppZ=52KR@5UuHd2& z6yVw#_$~Hphr+5STUE^KYTLI>7lQ0Mnn_<;my*2!Z~ci+{d)aL82)LW_^A=IduFw* zj&5~pb3Iy3T4p4I%-|I^uV-Gzy;de&>Z&~6W(nC3eL?qsi2qBaA`fg7Z8YF7FSlMoUAgMW?w;(NTn~Tn zm|$4rfgCMcELn`=OU|7mEQU3#E5nUvP^Xy$4!mh%3KcG$6s z1ye+E(+*f!P-Xo?@6PG9eAcrQA@Si47sMz9TTfrw#M>0Ue)l@=X^EnHm{HjDLgaAX z$-$E{=k6X{+f3Zb$*p_gdY+g%c>IsMDg{B;H?(?U))V4*Zk@U8uijig`zo)xwtA{R zDyznRy$M(TmazZzVpfG~wThi;cwRVRC6C@j>GbG_k|~G-h>6;I?A1ys@tuH z!sqww_T{Fwn#0Mr5AygK5)SXJ%C?3b*uPU-2%n-1F_yF2pBo5Ornpg@mS>8@ASROe z56@LmMt8h%_pRY+puZsKIn-nj=Z~|)LGEj%W${xL zt>?C)D24k@o4u(E%O*P}nFUGbg03-t-3S)-cA1;rj{dy=Z+@mx=yzyVgu#CTFO6Sm zF)HL5XlrYs{4mY{4PeayyPpyoME_*szZu&PkTb?OyQ8$Q!N3(LRf3?M-yu1GO5QL) z?!3FR9~GWyh)&J+3n0U2@_%O3M){+>u&#gMyWbCP{~OC;upf7bd!w98EPzWGoS!?^ z2Y^9kVe+yHfUUSzfV-D708`e3LlL$TfLQd>Yu#mO)(S3>*qm zfhxn{FeR8W9AN{6ic!zMmA_O;?FF0zoT&Zl_e!YktTwf6^{1AgLj(EmIjKQotn;t` z|E@n6hjD>G0T==T{r>|{R8T-D04~6f7($u0F0=#i`5A*M%2PX%f5s3BiquE=XABC3 z|2w7#r@q|(&?&+HOTPc6Q=xW7|GXEW0R2}!grYpv9si+IRQY#INs(%*pE`dW%H0ct z`~H!@!abC_e$=+e9E+v8hUN_FLK^tEV5t`RYpg>x(OCr*CpaA8q69-bE5R{PMFkid q0at;#IKxni3i9&G>X82}`OAcU{#0vxe<28EWd(?ch^~nq@@3-MVKxQ91y&M#Z}W}^jtl1m#KImcG)un}Xp zJQkn>HsbRAav2%u^%J=Y1KP^tA7m>|JdB^vKj0tA!)Va!c!pUtbOR$mJd6kNd9Fc3 zzI%`}7*mL^=N`n@Wk3YXEr@`*1`#m#AOf}(sS6MR>jH_~TY%id5;Xuy(|JrQ)xEF_ gqnIKQ6C{`V6=J8l(=hpOQ%nApigX diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/UpButton.imageset/InlineSearchUp@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/UpButton.imageset/InlineSearchUp@3x.png deleted file mode 100644 index 8b9d50e849ed681493143f8525385d80e7fe1481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^7CSE#`uOpetGW)*9>-r&r-11{)zW{eT3(F@FF-_BbEIb~tOw5zYH$Nj_;kab} zQSZb1xQ@-;KX*_2$Grh(cJQ(Mdv^2Vrmg$L{#ZrCS%IFWbC=D?$~7t7?^GHqj> WwnDpJ_&P9P7(8A5T-G@yGywogL5Onz diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/UpButton.imageset/ic_uparrow.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Input/Search/UpButton.imageset/ic_uparrow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5d6cf643778576cb0a51098f6a932f371f120cfe GIT binary patch literal 3976 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 Vy)tbyb{hgmB2i#bQ8kP@_&=6$z_$PZ literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocument.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocument.imageset/Contents.json new file mode 100644 index 0000000000..e83fbe8a07 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocument.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_ch_file.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocument.imageset/ic_ch_file.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocument.imageset/ic_ch_file.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3a53dde91286f5bb173499653cbd06e29e6101c GIT binary patch literal 4154 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/Contents.json deleted file mode 100644 index 9f3aeed1f7..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ModernMessageDocumentIconIncoming@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ModernMessageDocumentIconIncoming@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/ModernMessageDocumentIconIncoming@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentIncoming.imageset/ModernMessageDocumentIconIncoming@2x.png deleted file mode 100644 index c0f33c328bacc0bc6b7642c0bb047309699eadea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8n!3HGFBdc41)I?7g$B+ufw-+1Pnj8g=e0-m| zk7dF2KJUHPm+CppEZe~H+GVS^@t^6;b$6H=a@RDM9!=lA=gIAlvPU;ZrT^H+HEVIj zw+D4xU4b^Xj3SFF-f=DvIQsbni{&bj6M;(|`c|U$l(%BD y;|0OeYaF+t#GkB>)^_Z(QmwteLCSE84WnYjoNC=2(F#DvF?hQAxvX_!jYL);1 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/Contents.json deleted file mode 100644 index fa47c058e0..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ModernMessageDocumentIconOutgoing@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ModernMessageDocumentIconOutgoing@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/ModernMessageDocumentIconOutgoing@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Message/RadialProgressIconDocumentOutgoing.imageset/ModernMessageDocumentIconOutgoing@2x.png deleted file mode 100644 index 4f0cdacba3951a6729f3035ea17c0c630538f133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8n!3HGFBdc41)C^A-$B+ufw-*`Nm;yywA8w!J z$?$Gla!_}MY;Ho3@Pg-Me6A_;4qo0{@K^E4^5H`A}_$ga3ncIKLyNcMLj2?;gbgIbT5o?u|G`5a*pz_NG=&~gS(S3j3^ HP6VRCZNCQw1CR_KMq47CG^DBn7PYezJ85-V$RX&9(Zg>IG4%7uy-~0l^ zXaFLhGNAcjLm(D40~J8b1e1*r?LhTlOK1LPs0T5emwfmHbfIZUkY6wZf8?Z{ci;S! z$=dbn|GdAy_mq083bP4xd|MUm_x9gX#Y!WNlA|BJ?rZK|{QkOset7l~*2#BnUfasX zz`!`y)5S5Qf^qJ&(5B4^0xZ^DrthStm+t+4weI>{mKkfedmL0xp5U`=^UtJAiPJ}G z%;qKtT;3%6uQ@q7ZU2L+CGstSbCzTZxhFoDJg++T)Tbu5$khL};ZxbVZ4SG>YRlc; zlyG%xPF769U85Thlx8=)jjGxG_Ql(RsdJC#{XTf(bAb#0apv#;t!4ewzZBVR{GBgv z!{Kbf{%`aAU0?eop1jymW5aiWCKkG zxf$$okW-&BG=Uuk(N*`H0f>MiK-adu1{%BJ@4Ej$Uk8>1`2{n`2URXOcJtY%KRgk0 z?*3s ziT7GoiutPqzw|Miem>RsWr&gB^O?qCSF5;=3NbwO`dTftHtZC`lrGk_3&YqmOrn3q zYTsm7aea%I^-D&pyK~MI-Q|1Wxh-|&b#}JH6W8>%F)z43x%DH?+qw`wgcuRP;pzL5WVvkK3&TgQqRJZpnKA8@)I*|2ZJ z-nOpT5VMk1aJ`EBl+@h!cKX?=A3Q%fyY61q5PwNHWb0}zmL;|w?ps%9$b8$v&pGpN z?ol2S>5e81t6iRxVv97k>3eQou;QPa=o8hO|NdVOsSvq%C$QY^LBjW$JHLlmFbBvV zj(ebKrSb85OxE7C2-aN@2lV9p&Tc5%(4qQ$Zp3eF-LB*P z=IXZhrrz(W3)?TPDQkaHJ7rCo{L#DTHgVZ>+e}Q|YO}DoFKz3b#h<6AZT+*fIPq!u zsuQhR>+ijL{L}1ul)lpXE}6Bg*qWS3CQ>MyjUorg7?@>$^Y1tLZPVeQ4uzSf^&;#pJC0RlAtyw!~k(SN`UB&-cHK X3==Ba|7%1X0u>XUu6{1-oD!MWKY(ji0rb& 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 Up*4Oi2n;3x2JrAG>!<+!4=E6eTmS$7 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/Contents.json index a3d775f3de..24bbabc041 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "PanelReportIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "PanelReportIcon@3x.png", - "scale" : "3x" + "filename" : "ic_report.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/PanelReportIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/PanelReportIcon@2x.png deleted file mode 100644 index a85d36f2c81a5ab89847f764546baf200592b9a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)3_#+qP}nw(T2SThqC=ZQHhO+vl9ldUNb^dh#TbWY)XgzfIdGnWUNdzHi=l zJKIj@SMHo2??O|hxh9!Tk^7g%wJM8s7stip!g3QWVFCm#sfsJwXhyhFp-+?~lc^_&A(k9+OM$IlQIQ)bhIwS% zV2bPf`kfSzyHP*``Dj90&4}ECe!0A;qJS1Op{*uZx3M=lN*C5IrlNorG@%WR{lX?w zDsn$kOs4KU6%90@4UK5+N1;>v-TYHGB-5y9pb2egL~AN+)BG}Ss9ze}Dj>UuQ3}vT zEwrLJ#SZ8(zbu{>6x1l7k$PzE>*IS1Z*qjJTe$E>(TG-RqPcWx!AnZ!b&& X=s9+M@@wPd00000NkvXXu0mjf6lR7# diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/PanelReportIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/PanelReportIcon@3x.png deleted file mode 100644 index 081f61a1d1b0006cec85842c06ec01ab8ec50b26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 zcmV<01SR{4P)&Nj%eSC>Yr3Rfa9FEZLtgd2c4f!Cb9X>5qBT?4>)hzVuyX; zU&Xq{5$n}PZ*|Vo&e~va38cSBrM&nBRBc3w^jprW_F_o^?X4|-@E5SJzC-IC47z$J zk~GlXec-@fKoEAy`bS#5yEFlI-lOuALEPBfC{`5xVzZqw*kNyd;kVK#vvOTGVtel* zG8nLTyC?BqNlvMaB(Z+i5#l__0Q^{=_$N-~h?3a3!hb2sj4v60AN*P0#Hkb=J<~|6 ze{wz&c9IOipY=@~;#G!N-|Ad=p3Qo=9Dn$=F^E?Q+VonEuzyH=r?)b&O zZBN{m=7icP5}OYlanBUUL0rJUZBJa{w=BwZI>q*j`exib#l=5ytPSy7l8(L^>PBx> z&$a@2iVMVXM~}&)<%rB(&IRU4snz~BEW{-a@vI$rv=k~?-zn~QY44jyEcuEH#3Qb? zC7+hy*q+fO(w{hmogy#{#RcM8Tk;{V(i0~~JFnUvIqJ)?hC*E865raBSE*5EW{J$N zj<{P041u^nd}~i$qa>zNJ9*%wGSt>)A-4Na6x{xgT5P zU3k)8F!B;N{ROwssAS8!Tb&LwOQFRjKlfIV{0oVHldh7Z1d1#!kf;BUQ#j(}RR8g^ z6yo}i=hRUsRNvh79V2F4fij2- zasAGG>dKY$!zk?nWfT|4-yen=GGcSKKLA*2as2^Q>dT9CL)SfP2$Wb{ppH~S|4^7o z7h%#$1C-ghrKbz|)2*mC6Vgv~J3?9!>hdQF=8n=ARAP#zKgE^0bH$%r+?K2&tqk?0 zpPZe^wD{|#3Q(uNtRQog*|YJ2j`H7%HCzyb4yj1L6zO1rDu@fz>o4WXjM!Z2FQRL8 zaT_c`yfmM^4^;2+0u>S$s5{#|9{h#NN?#>VMR9@p{e|CyC~QA}$$h28^|vfQpY-^f zMOa4xbnrIYX!

wmE6AO$<5>YVU*gWGM+)&?EgG56;$74Q@LE=;Ck9mFk8$Hs6Fz z(f$Q=L7xFXSap6eg+%82#*cadze@n!(64bPMc9b4xs5#0ukqdoVGGr!x1dGG^c};2 z^aBX)kVg2*<_kUTU|ghs%+PuGLQiy+NZ*o6fbez8Uw&q%;R=svoB#j-07*qoM6N<$ Ef@u6}-2eap diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/ic_report.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/ReportIcon.imageset/ic_report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1c2c0e01e2e7345a5b138644d52c683b69312ab0 GIT binary patch literal 4125 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/Contents.json index 5e19672ebc..3c915fe3da 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "PanelSearchIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "PanelSearchIcon@3x.png", - "scale" : "3x" + "filename" : "ic_search (2).pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/PanelSearchIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/SearchIcon.imageset/PanelSearchIcon@2x.png deleted file mode 100644 index d0560d61dbccd7c1932057bbd83484c1ce08d264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|^t)d4;su0Wch^)*A?Glqs|4D~?t z6huz?58?s^LFg$%!+#hXtOg|VoT1@0L&GbmE}%#w(1iaCO|EeNbysZ!UUjeElYy@f*B;!m+Zg! znLY2szyD0J55BBTc2MJyJAE#Y!}?`3W5myG{5>ZFmVWwr|J1THl`H2{UuPcje3Hc} zzpFY=cLoCkW2C2xV@L(#+o{ag-WrIs1}9&CSD!ok^ZXl|Pug7*t7V&tL_Gm5h z^4r>dUw83Y<@>tSH#}TnWh0ezA>SgoVPoj;1BPr{pC6I!iEKXh;>w=mUItrc31oLH zvC2FwxzVjx=7uP@)r(DHr4Og%u2O!xRdKIKRc1z$W_Bps;wPQUW^Y&CnJrcu(sJD5 zlY-bU;~zFhj<2~eUGT#MhN6Y*6`m+6PH~ENJ>smiqV?Y&(G^TwXXuqHd!_{5saQ z=t+IsewwxS=e8v$K75`3)AUU98Jl9al#C

uZLFXABL`8S0-g z)FGi}px`sG;8TYG|3Pe^Y{LtXNc~d~Y5<}a3{9^XI$txa`VSTX8uApXY!Xn*ONKh2 zO0YStU^dW%=2r|e!KMMln_hy{z_ox3gh_#Py#g5pvhF$9d0?YJZg|bm_yTMT*kquB zwog!%-C%K$8jv}9mmIr+9`q^+@(X5=jOti_<=Lk{nr+wrGX|aTyZU`^LxdqObECrM zRX*%4?|x4c&t0R+I_sgO)$Su=^Vn)me&%_#ztih@>pwN;OCF0}3dbJgK6HR7E!DiD znt_2y#M8wwq=IqInb1W_fdb7BAAEakwRVT~oBG_(7DcOP7ypo3J?TV<#KsCK~-Sm0`H>{-nDA6VD=x zi}xp4NHMfD&RJTVurcQ4@~cIRXM!!Gt~Z_y+xC`i#rmg7+u8ZtQ>|qi{+>&G#S^pc zRPkPh=jW5FAC!gf`^|gfb+hS*3+em`YhyBH^NI?at5(Szl+i2Sxg$P7P9vJ5ef6Cf zegUmuev4CAIbUcx@8*}@dD~&XZZx}C^v>IQ3zTmQPy4j7Wt|VN#F{6`rVVX6z8z20 zo0jS5c05&Yo5sT`q4H@m&w_+I-3C+ED~j|MbGm&pZJJc5cQ|6-u>iAkqBBlhXVE&g zlZ*AImcvzx{SS2G^D88uTb+55&DMSY?F?q2!vPX4_ZhRK!#i^C{dd^9bM8Bf|2us5 zReX$iZo1}b$fLhm!t)oq)$C7O^Sv%+^~)pgFFtsAr0T?F{mCm#t3kGIg=Pf!jX&gB*LATNGcFinb1v80&%0S#>lC*-H+Pxz z;otU`SsE5L&yQqXo$w=M!=4|~W&bX`4dP&X(~@++PlNAG%c29Hf-XG!!m{1WI98(Z SrX>d`UwOLvxvXr}xQD_=Hk#k<=zeJVn}ajOX@M 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/Contents.json index 765a5f613e..296d3314b2 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "unarchive@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "unarchive@3x.png", - "scale" : "3x" + "filename" : "ic_unarchive.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/ic_unarchive.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Title Panels/UnarchiveIcon.imageset/ic_unarchive.pdf new file mode 100644 index 0000000000000000000000000000000000000000..97e2691eb7ceb0ad22952ecb3485ac063ef9c58f GIT binary patch literal 4399 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 SDE=1!00001^@s6Ho@cm00004XF*Lt006O% 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/Contents.json index 9c84f011dd..d5564b8a9d 100644 --- a/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ModernContactListCreateGroupIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ModernContactListCreateGroupIcon@3x.png", - "scale" : "3x" + "filename" : "ic_group.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/ModernContactListCreateGroupIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/ModernContactListCreateGroupIcon@2x.png deleted file mode 100644 index 52f027fecd14a6f235757e9318f6b01bc0d4bd4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1630 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 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/ic_group.pdf b/submodules/TelegramUI/Images.xcassets/Contact List/CreateGroupActionIcon.imageset/ic_group.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53f43a5167e1b05dd898ecb98777ebc9a68268f3 GIT binary patch literal 4735 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 NUwr$(C?R3pw$@{kZ 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 T%cA-W`p3dFvob9{=F0sC@Ji}a diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/CreateSecretChatActionIcon.imageset/ic_secretchat.pdf b/submodules/TelegramUI/Images.xcassets/Contact List/CreateSecretChatActionIcon.imageset/ic_secretchat.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ad3e2f59a628b40f79f8aceaaf9cb2fb16086574 GIT binary patch literal 4126 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 Q1SSEI0`u@FYpa0&4_yfhhX4Qo literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/Contents.json index de83dc2139..e3a6b13e9f 100644 --- a/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ModernContactListInviteIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ModernContactListInviteIcon@3x.png", - "scale" : "3x" + "filename" : "ic_heart.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/ModernContactListInviteIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/ModernContactListInviteIcon@2x.png deleted file mode 100644 index 4175b2c4e2b37393c4c4c632dcdb3906264d156d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 zcmV;l1xxygP);cxe1AzRGjuotb-*=Dnj9yI?e^^ zaC~_diS>1#ILdcIvG4ktU=tV(J%bjKSU>m4`b4_ZW$hft)Nu|QY%>J9OG`_ngM5Ns z7N;}H$WX^QY_O$Gl|ZkqBvEpg#CpHP$+>cBI)&7NbJ$=@8`^d>t}=0}eH0(3i&o2e z)v}KC3|>SUfep5_p>0QUab+TLy1zvFmEB>j=w}j@4$F=#j;XVoOt#OX1k+v8me9hPGDEcYF_6DwXjVC7I+65tnXfPZ@v> zmuIZ+kFpM=j&s;}Xp0YgSrUnX&49w`S^a)(Y&uNcI ze}Qje5DSRSceJ3X5JaWeCV!4IbD^*QM*0bS6N6X{^t2(jR3?yEFRt~AGe_Avue-dw zjAQU=>qKJJx+2hs*0$n|%48BJcMAfUbGp)vYbW~ zJ<4B7U&{%lnPhCi2fpx$?*^dJ)}v^r53PW`IZIxgye)3FcGyWoDxw)?3G9Ql|~`o{eUF_I2t(JMHO9)A6Iv zm$&R4MlNhwGt773I!j{yr;clBi;q4(vY{2t*`1%J6DNP#OP=AM|BBNK0e${NuqRH$q5Ot zB(l7yHz%G`nM5MJ%a59$`m&xx6WVBtRy3pC`q8okS|Un|XZHFK`H;Bs{Q2L?B}43H zaPr`(M!&_CJZ{S+S6W8$fCjW=H(t@|X`2MvhG>-RNe69F?eypz+wCNA35itg1-dP9 z?3L!LHo{%HWX{(HN29@#jy5zxJ0{Se^G>fZ8+Mbsb>&>6B~CuIm+Ou#eVw~{{E^s8 z_3{GJ0Adl-;-dvkMw=(l=qjx)aq_VrRsU6wFK@Wyap}zV_YOv+ZRsa(HvC%$zKKCB z+7KHJMzIoT6TjaP`9tiFLZw}#4$Ofz-`SRagI#HS;v0Kn5tGbdjK%3ua1WlS8>DWO4pQ}U`rdDTk(ZY=!66s-N}j)>3imjM>=jIHQ*dJW=~su7@d{C?0W4; z)@$}`8|l8(XKkqCoUJcuV>TU}K%*y}Pa=IFGrF`|?(jve9vf`4gal^j(k*Qrm@U+C zt^px|*=Or6-CQUf8zF&BBP1{+umFSvh6IKL7LJg>kid{Y+es<#AG*A^w3svGAz~KPQ zmH+F4vFv)71Ckeo=M|+PG;mYI5Aw_bS3$R6XhKU+2-89vU&z6c$VRg8*@+UkDkQlE z8U~Hc0hz)Cz>#PQ9tY|{DzN!t7(AxPFo@rU@lPwnsDVF{h6q~)e1clUiyfDb3#jGcI?kk-uv&7MHRon1pQ)4y8ff1{P0FJZC z5tmDoFY+_JG+^>4`F9F_n(|Zbz=hV8A!h>J4fh}HjQ7>VSDm|VaR2Luw$i$Hr&ArJ zYU*qKPe1mEcp0MTmRoEc9WylIYzzS6tpuCn#He#i{gm*xB(;;Pwvlpo2SammRWBfD z6&Ld&E#VX@m3ppRv)#;`z1);l8DJ5n%j^94GxdF}e(X$YY1K~44SF{}?2)&z`=`8v z{2Px-(^+B%J|7~OX1n0=)`OnL%8)#Go4Wv5Xs z#RXS~nqriCV-1^oFoB)wMs6GX*p5kx?g4n$xXY#*j%-GW_A_Qmx@TE`y2*t7byrKI zo;Uma1}69kQal}l7Q3Q~{-BDjLdM^(xQ)U@{O9-ihIl)?LsHkCmc6VI$)nb?H?s~G zH+MYY)=3ow{Gwbj&v4RrlI_aw%4;>tDqN<2(_>_=me*D4jivTor70q+E!`GB4tQeh zHB#+9TE5V@xy~$=B^gznZT4?a;g%H(o`>0-)yXfD?ELdUSkdue2MSxwq+UiwA7D_) zR#s-dLm4x{UUGNNW(q<)>i#QpZNAqGeyLCG;!5kAtC?HAY1D_3TiQ#_hyqkz7R<`I zSv#%$Ja5u8)!sE09b)yfVV?NtP^td%Gj*OH`pGZ)@0Wor+>KYvDJ$EQ^1wKQN~4&2 zyvowQ2Nbg-fGLcDCM6&~oQCi~X2skikg783!&`^UaN~ZkkRF-WKy^&wnW7Gv5txc` zS7VEp#&(6nVM(T)#l1}H5C`3F(wNn;l)ecAJeI<~JMY3#&OY(@@|gm=cuqT)Z=+ON zc>9e>h^P4>luY-6|6w9K14Xl+_`@x^3h0s1nn$CFdLw=2wHCaSn_|DkRnkt*91mfY z_hs)FSd`G7rZSP=wGGi{Js-4D1PJ}OpuGO?NQK2AEd$?MHKwgN0*$xyN0ydeMdHY# zON^x^rAxtDfaS#`g^6%_v^1h_5c%u@<>7w#Xk;=WM`{JDJq(AbREWEt(S5;rhvXG@ zmSXbBzXx#bJaff}vhZ5vGaa0${c*Uc=p#{kb5k(ikE51rI;AGvDSDZ;^)&$AsG5ai zp$AJceCPr;x8hqz2}D0Zo{>F7lJM8*E_n)U8aTNX0Lj00YhsZV7yckllPedMTietY z-5caKtMGP)66Zd6ak0of1(ylo2z%rctJO8{+znn+>y_w7W3Zt+K4Gk{VWSegciX#S zkH|*_J*AXyOCN}qzU`?yDQKeq*0ertL*jUet#G_`FN?J* zlswz>dW^c6id_C4(msL^-?llF4)4IK^s< z_`&R0@%eM@3rK(z*zfC!bQMN-KL^YEw z|6;rg0c5akbb4AXT6g-o^vV$2-I}SkdX)GUJ`gjG!H)Z^yzXKkiq5yay1P$d8K%V5 zq8Z70P4_8x5_{E1Q6GvZ*=Y GoA3{ehOHR@ diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/ic_heart.pdf b/submodules/TelegramUI/Images.xcassets/Contact List/InviteActionIcon.imageset/ic_heart.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c58b17ba05ed5be52adf4c6c57995ee4cb78977f GIT binary patch literal 4236 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/Contents.json index 1d8c48f119..8ac22e0ade 100644 --- a/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ModernContactListInviteFriendsIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ModernContactListInviteFriendsIcon@3x.png", - "scale" : "3x" + "filename" : "ic_link.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ModernContactListInviteFriendsIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ModernContactListInviteFriendsIcon@2x.png deleted file mode 100644 index 699598d62c4a3fd0e54786bbefa9a2a1545c9ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg3?x4-dwml~Jq+*(aRt(%b$`Sg{)pB85d)G9 zzeT|el}Z1_>VE?TLs$J51v2XXh&2I4Kx(8L{sWbXHT(x^lJBI!8V&=2a)-$Kc^jUr2e6#agP{wtQoE2I(g&76j?PFp6arKcq z*Doo-=7}<*(kHv`=Bs3>PJJ>fujjGY1fiCwSXmnb(~}1o7#JUTx;TbZ#BIHDweN|6 zK-)zxqqhbo#>STw4uAUpkAKUn3|&|2ZO3a3@AppaRt{GReZl=Y-tRoK-{LGrx6i-) z?q3mS(DKi2P)+sS%-mGq{lxt|k7L~Fn1-$F|7*6l&)zd_N^>@ERnx+ z-@{VL-IvYxq{nFcIwoj11*iI)v6K3A{a8qznduFc7o5|JrYvw?r1iqP*WSrHW#3_? zOxH7>Aswq^Zhmk{6Ih_=zWqjbfHe2>&$FGr+a*uqDV_A4{oTnK$6h{ps`JL<;*u8U ztR91GJ&#D6vY_O7i7$3sGON2-w{fxODU-9$3R{Ag{`j$fW4ciCwT7MBzsL0a%sHp1 zx|T0s!W(|8wIT99%p-aqR^8uY8DOkhZMAvl^UZsYtIm;9mA;ynes-njm)Fzopr0GG#{$p8QV diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ModernContactListInviteFriendsIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ModernContactListInviteFriendsIcon@3x.png deleted file mode 100644 index ddafd80782afae2a5faee9e0527582cfd49e3f9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1209 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+nA=V3ZB;32_B-RVMwHY5p(O@L#;? zzih*QAP{T%FW&G+tp2xX{U6b~-(vND#OnTt*Zq}m{V(1K7Ow-6f212gx_}H(Ah+(1 zX#H<7m}0TIzY-1qLE;U6#2bDqH2jxo0htL>Q~$>SuB+jXblZQ)CZHj|fr_=kT7Z^H z0BvdbBh~aDs9qH4Fra#%`9Q<#{(>9>6o-g3`~?XDoeHw(FOUIt!(VZ*d&C-nZU)*8 zl>IH){9ml$H_#;@DX<989I1xiATc3k`e9Ji#@G5KB#L~z$!O1=sG#fg?gO2RB3e01QS{>pSWus?2`{Z{9 z2BtTjE{-7;jCZd!mu1IFxIHX4SD#ZF5dBee(v@wwcmBuzS+nt&`6SztdE7IkyMGy1 zmNv#8oKPd!=aS6umABV-RcJAHe$->mt4cGO7OdU7cr$myJGs#H+xcI-lb4vXWZ^@> zhKq)wniJZ5%$A4$WD58bo0==5ruKE7IjhL=Rcn`e|60P+6BfPN9x#En=}u5dE~tfP@fzizvfi#hTa+KleyOPp3G%fv?;QkcjroZrA;?mbay`8 zrKmHT_r|nnv8a?S%)5(bopIRQ^Jv5J^xy2t?Z4KTFlt819^Ck^{1Th;uO*Y(_AOcC z_wdcyV+YN*maIQBDfdXz`mNjkuHX8xA*Gy8eErtRQQ5nmoH{;hU4D=0?x?JVr+z&< zmiy<0$xG+ljdzZ3-uC(Qh5oIq-e+e=KiWJ0Uvx(0y@1*CSR-!VxV7)LwOx0u)aC94 z|ID}TVmdSBN!TpLu(0D__CGlOv&{9)n~MDM>g;6RgtA)&*Usy=*GXKKz85{~Gtbs9 zO?4|?{`$11H@)_$>uuX3miH$ucmFuI_v}|MkF8g7-fW#cVg6Qaz1lUg2P)TY{d;{@ zli{sNMz4MA*S>tPRc-FUm1`!|-oIk2F*1`CU1S3>3C+G+lAxNcTlEjqRZ?xKA$OyY*Bo zs&P{e(*?!tsS#0A&I*^D%1o4dmLk%kw=?9D!RwP6A^gtoq>L{cWj7?2=k8J2?Iuxp zooP~Ru=bO+rp*>2HutlLf`*;3j}!Sn9To>Oo=rcS)kDQ_1QlMsFXha&dsoHzn={1Dm3^Dbuw>FISEYNWW=~7Ix@zUdg>njF ly)93>13qX5Jb&5$#a!ZMsT0@VTcE;;!PC{xWt~$(69CfoT4w+N diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ic_link.pdf b/submodules/TelegramUI/Images.xcassets/Contact List/LinkActionIcon.imageset/ic_link.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da716b17f67c0384a508909a0fc39cff6b774b63 GIT binary patch literal 4545 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/Contents.json index a4450f3bc4..77dd2fca4e 100644 --- a/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "locationcontacts@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "locationcontacts@3x.png", - "scale" : "3x" + "filename" : "ic_location.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/ic_location.pdf b/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/ic_location.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45afa9b5f7d5e8cddbcc94c0051cc78161f5a5ef GIT binary patch literal 4276 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 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/locationcontacts@3x.png b/submodules/TelegramUI/Images.xcassets/Contact List/PeopleNearbyIcon.imageset/locationcontacts@3x.png deleted file mode 100644 index 478fe6ef664e382cae79f5ec425a95b5ef2a9f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmeAS@N?(olHy`uVBq!ia0vp^t{}|83?#LKZ%YHIoB*E?kRU_Ve})(IGViBLZ(F+c?CE)Rn^QDdihn+onk@AA$dY_sHx5N3 zSqA3XrJI>JJPm~{9X#VRWODu#sUBo8`nfU0&MeRO|1*vk9_Qw$3oz|o8q2su`=rEG z4yO#hEsISj)+{{8qj=<%OSr0l_Z#nQc7aQO{>jJ(yjXGT=&{w;+V3|OSXoTFbo^N6 zi;3J4$BzZgIhIuVWeICjW5wb+scyqd+-3=atIe4?HX7}n7sXJ*Zf<+_UhgFqnY_z; zYjwVy6Jg?wci@;a?OrhBeEkI%-q_#MWYgN#uw|m%sm7G2+%GnpvKDP?un-kE>%;ib z#vzrf<2u8`6CwiV8GV*DRNM{bv$n3dRno_LqePqg9aqQp=NtB(&fOqBfrq)^sMcPtc1Dp)U?bV2jTf{+f!l>*Ivifl`rc&u6_rf?a)5J?KqvS~*Wl2=?V&>Zwo zSp}-)2Z!WRXP&ONlaH27;*m-_@49dHT N)zj6_Wt~$(69B#fH`D+C diff --git a/submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/Contents.json deleted file mode 100644 index d0860847fb..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ic_search@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ic_search@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/ic_search@2x.png b/submodules/TelegramUI/Images.xcassets/Item List/SearchIcon.imageset/ic_search@2x.png deleted file mode 100644 index 8c3c79e804a02f5c5227f81b69452e37134494a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-HD>V9xe*aSW+o zd^^*+Tf|YMwft)Q0=B-66%UL9OajDOQ|p^L7c?!XKXl}bgP@~`$dMEmlR%%49-de; zLz4?vU0hk^8ynwW|9NAdf%TVnZ+Jp4pZ&74U|DtC@>TnGhQ`*W=bTAoQcEBTZB;Xf zn|$wL|J_SsnQOO1{ZiRGHEpT-CHs>XT@!ZCi=TGSgCWYJVUO0^DOsYSsSl(AEp%n4 zPZM{Edu^f2_fH4b1y4?Y*;_0maPom> z=96Yq{bjlzf{sMaWSIE1sFv%nRdr18^Q2pRvnuaCRu+CQzR!I3eVL`tb3*I9eYV$K z-xDWu!e$!lx^sK=T=wqC`fV2;xv4+7&q6==&uz;ytG~&FvnNfSqwTzHWp4y`vVY{) z9h0~6o3MS?nwh-w;^swjnV;rAub$d!kzSDReddhpCR;!8bJ3f(ZfGdXYY<`M$U9%; z_G5dIS_F;x}0#DB&hjS5;Gu*2!Z_j!@SNg$*W!E-L z>#F=vF-iJC&P65Fm2(9DU5q=ot?kuWy9qie+RmO@?giz||I;zIcJ&nWvCu+0>o%fbpQyZ^Zw_>km@9Sq*!`dZOj$R0fJpZX+ z`-i=2AA20P>h0UBAfVZ{tb^O=;QQ_^nyra+k(Wn(@qAdCB8ymF*&h?&|7GIbZI&63P4|%YWMaNm7DWxNirg zq@=r*&fDzyjQ{JqwWk92hGnW9Tfe?8L@Gs4($#joYGCL>gAaa>zP;JVvSJfM(qrR| zJU;g8L+5q=E!nnizUdK`{XL3lEfofh<;gmyj6S+1yUov7a93cy+NazpyqCW%W!dw$ lS86AFHWA4?K%VJ8<6o5%SNn7&LV&tFo|2=0YkWh& z14R{8m!bqd2NuSCtvj3e8GfE~o5Luu(mCIwLEkYclFuiNo#ozvuv~+^ENt1fXEID( z|GRsXd-@w+j=dVI&?4Z(p@>HC6`ky0^}d#Kb5q*MCc){;S6V$}{QcsK>fSGjn_;}feRd05ZWYhW&zpY#@13$M{jS>Txo321v)J9Qz9`-; zy?xQk(CvqlC+t}M`~1b&cZXlNTiKOvmpEo^et%x^Ve7VyUzgwE@&7*6ab0Ejp0?$8 zzHALy+w{)$-A-}G%BPt>e@VtYI~cfm{h{u;ziyV_H_$o0efNLe^x0D;*H%h}JyS~2 z{&vM(Xl82YU8lfZioc5{6!*FuZk%2!;luyshZdJbO)EE0v zB&8?uj8~`WVS{5=#o`hqt}i_zl_b%f#jS7H6Q{YcO5)h2TZgiF7RP$6F>BknZd*Z^ zqUzEkUQSP+IP3`YTGPh<@I~Cq7h-F3qNR>))}1=D;*4QW;MMGm+~XbYYS$JoK=jwn0%{od-AO$_K$N5PW(P%*=O->RjNP<@8dpW|5L7dm+xrF zm&d+}_&J07qx$_*^P}a`V%n#*t8B43W4F~t<<8HrbN8PoZYMg5Fb+M*)5}H+;P3riT{8Edr1J be`LR(|4A+9T6hdFc`OH-#6KP?|pyFeCPANGxMF92PBjrkRXsCkRXsCkRXsCkRXsC zkRXsCkRXsCkRXsC@IQrs=z449#5$mKJv{L~KxOIAr4^r?)YXuKPgI_}aFgyrowiC@ zSOewV2e0&Q%TSH32z31gcE^F-kz3gGZ$hC5LU=^xm%KjC2znk4j-iBKK&gH}oaXbR zNTt7ok;Tt7BDnCJ&I2S1H^KA1Ynmo-2qL{1a>?PErj8yVSYkavDo3~|@_8Kjq463$ zsT`othfF3@;rI8ygw0xieyFnm$*Gm_iihZWFB|*_oS_>a#dKg(?ml`EUMXEgFn2Pt zE;l+tJczOEW^=FQXNrHKY-x>sTC74Y`}-PR8xMQ~9VD-K4{PgXcY2oK+!zXucInQ6 z(;T4p!bz`$Bff3CRO(jbTnkWX<^uBA4eLm$H`H<3dhA>TNp}@I^^Ea0oq88?gHOlu zeAIn}UGAeCyN*L#uoUvrmm%E?k;VW-W*XjA?1mXL}%oA5On9J-gT3khtm{_URC=@;ws@sB~g8&IVsA_uEUgq$h@=h8n zflDH-b3;#Ytg-{Ur#=^{+eFwofCMIuFP<81;#0V|B=k~5)0DkL{HO3xS-OIQdE;ys zVLDsXIe>sa+KR>dXFCw<-ccVk`T~DwYS)`#eY%^Gob+W)^+Ocm12pRX4Eh(Bg!AjN z$$ID{FD}VbeVm>AnXvglZ}KG0XokF*xYhak@c~lmO6DVtvxr|}=+(Q%iquKG(i4AX z=@GiIeqQsD&}w`^5o_$ND8b9T;Irdi;{z182CaXuTEzV2bQfX*K8XVlrc9EZu=9LcxUW$7{_$@xK9d>O`%u8dTT z5OxNj9epp-hZEM1(xwQ1nusd4Ct%AA*O!BT;UIm=C@62v8Fgm>5_)~)?6S_{PK*`S zhPNz4qHPpyHR-Z+nNcL&_cBqm`I6&3AEg>4>kL4~gTZ@wdD3(>PklMcsX&>wvEB4Z zz?2oJW|)%uNFE-v3gRh@Wd9zn94+Y_K$1I$=@bW9zImnAKo(k`3AL`a(YCq_T~-u% z6Q5x8TtSs{T-kpnO0}7+oF~ju(>czZrtw*22rfv+vRn@ZP<7kFMLP3=rdz4wQ_C<@ zJizXiWw-h<%iR!AYLz9AW}%7)*@ia~oNqu5Z>b97-z`i8F-AgNNvG~&ButtH>xRpt z5erYsd~mdlu?;Pm3sr*SO%qIlVN>LI z9~gJnVn*y|L%6n@{t?yR5on?)vyn5wjj?smwo&92KS}X2M%v5#t%n?NqtsiGEldP8 zt62}4j=0&VDZDvU-IrX zRktb+yi*f~Ef|qf^#rQKWOffARk97x=VDSc?h$F8Ju~BkRMu_QxQkLh<@k1*UAG@z zVOulxR^;6SXhyxoIH;7(c7we2Wu6M}hO_PN7(ByF;6B3=*vWmMeA6}CZ2N%w?g1o} zU2+KQ3-HUbe3??84%Mj_i0l}nXdk1<;r7S~PPs2~d**A%PrR*OwUy`Y03?rWVFNy7 z926d7K+W~JAkCAVn z)$7Zak7IfEI(&=`kD`YOx(FcbR4?(29({QFARZf0#1xoY*^g-cuMzw_( zv~U3VZx6VI(XzVYyAV@6+q(;6gWqfR_9`}tTc@KFH?f?%`5UP4A)aAW?cr(mUUSk~ z6@=gEjkZ(nZh~~PQF6p;9u++sW-$K%nQaCg(%8VTzOY(xxiO0}KWw>+RE_PO?V>z2 zW%;$BpXKwz1e{To{Y|}D;B(I1Pn)&uL-$~8_>MpwGUpE<>0V36cd=5vinio;hm^C2 z$IXBC+4FMM-By)!bm}g{<7l4*vvh1HP>=bXz^in3a+cdc2=;M2y*^Nf%=rN*R~TX6 z&f7}#pr`i3N$o-3l6}}J&V^MzFZ{2oUL2pij$f)Vs>C|hU2c<;tNETtk7dujw761d zvAB%@Z6g9tFoLeG@at~c2WZ^A0!8&VTdw#OGR|g<4F0RGp3XduPb@{zdw?L>^E3Zj zAv4ey4ztU@wZRd=FG0qJH#YFgjP~=OB5ZgHae&|atnV5)xK@U6pkSXuJvo)Iq)+*5#OVwG_=39lhHMb9t{wP7`qDpPY3}=t? zi3I-Lt~>2_v9z^wmyaU($>K_EdOK_EdOK_EdOK_EdO mK_EdOK_EdOLE!%yf&T*e469?np7#m>0000`LvV}|5YbW6ol192z|k^BGbE%# zq)XyYBl7v(es|x+d*0`L&hwm$_gwuV4B-$UEhjA*85t0&12X>W?*A1H)!!NGXfgEH zZa6*Ce?&%B8w>btdy|Zeo)ZdsWa>-4ivYxNgE{_O<6Bok1l1Dskf*+yx5bR&$;8dV zrSIx~Vh$xBCMVa;ySB-o>V=`aF~b;)(jm}&M>)ouU`<7jjbqRqi~DQF)fG17cu zcW(*eXIVHpl`tYD(^H%Jmnn7Is{ql(2++co1GkSf#;zalg3sW(_( zI1p0|y$%-xQ#d;tx(o6Z0uj+Lh^1^}2=J(? zGWOnw?T`g$WZwUc^IMkd4Q!4JgWpn?8-FloOT<_~lQa0wap+~)uQg~y+5)fJ+^eJT ze$ptdMt9EHgJa<}<7j&AVCbfV?ofgKwV#R<-B=8GQyBVBJ3(X4pYPWZ{DTG85Pv`q zPz3=8Y!1HQXYavt!Zo7iZZ= z65rVoj}2^mpzZMaViapQ5g$R9Ld)xyb1W?LEaqX~A6rU+By&Q# zd~ZyZz`m`jSxPBu zuc?0$0(0Mj5AD|QX^^zZ9x5NS`)`JSIhit83afC_FJ=E33yF1}hG&HefwE>QP3gH(5?)YxoMZRweq}#qao)IR@SQCMjaJX8lraC z=@N%&wYao;#Q@7V&8zS{jw77&ykM-ehSy`BGX0Bz@pN+bB270j?CJNwE||A!^qE0Z zYa~7Yv~@(r&S{O_5X2cr?>8)v%@KZ}g(%p1zzJHf$r-oXg1!!EC%(yG(qte%;Wp_&`!A|!Urc|qy}BRWWblAZs*j^H$Lh7H3O2rp5qOWYd1 z5l>aGPzWClG^HC8%Mq(j&XQ%uSHC-%(1k7KzI}?9W637a9(?IUt$Mvh@XRHEvZNV! zC)8OHOfcE7BzL=?Rh|k3l4A0beQlZA5Eq4_?-{Xa5hPnCi|8tgUC#-Q8OgEg5|M)v zID{CkUyI-sGwG+-mUdz!9qx+8)yqZuvrn&~r)DrRU1uRt#45m8jbR zC{uZD=q9=z@b{>THP!*^rP|4)sFa5P>iK0VyLxHu5GndDp9Y=hd8gb&s6Rvf<92TE zVqP`SVR$ld99Fw4b=0TC&6pq=^w>?tE)t!$hE4+!(@_(<<|KR)45F!bJJYWDp|K;L z<;lBkfh+OFw(J05FTt-PtBTcx0tB}eO>t{=X0NNV)Lk03tnd8}?2{=?k8I-W3I=Ng zt;FfiAtCKp1t!zBzh5;V#W@Te70o|c2RcgA&wMHKs**}xY)^2Y>`#y*j6Pmh^nJfu z_`PE4zZJP4vCtO*O`bIGkt4f4;|zV)su$m4rx>knCdd_3)Yunm#Dck{_DU6S6u(M0=zegeZg$*%Yig5aL;^V}3yQM% z(R)(im3Qag6<|ii^34*da%%Ked5L^~RI>lnIU1c}s)mt2yEkzsgT?BG2oO)fTydwv zEnT4rrC6 z-(6|wrJEr91)57p{%bxhzl6%4jh3m~v$i@}$*Yj()L(z8iT#m9)C~l@vu_Q8++`-D zY-rj~Px55XkNQuQrhCrOh9tL7@Bfalq&BK6_v$c<`3O{20_19%NXIyJ0e8a`KZ!}X z6}&RoGD_OJ84$r{Xv5#>Q5a9#4KNe1aUGSQsL2~c8?aC-!H@q9sfr%9w9998x+SUm zVRA!eeniv>nqIjsQ;N3vX&!RYRO2^;>o7e#wg*|bkHdD<#nUuPreVOy%1s#;(MxN4 z-sF-6pIlfx5kfAc3nw5*ft-Nz|1f8w7O?iHp&CN zpKhx}zlPiSEwyl-FVq}uo16Syb6)Zy+4hJ&t8))6+?{(b?JGBH=2R`4FKYq^dQzRz z7mg59uTA&R(=1Ga!dYiSiN=>>*v#PAxaqcc75-NZMFi2;w;dxFyrU|e$|+V-nGo>c z{4%)Eo189YHJ!Z^(7pqu)BZgrg%d!N`)-hR(C24vDzH*KClyCVQ;}Nfn1C$*^1W_u z1(e{(!}CMAF8G0bO^Yu{M3WUa32^q@SI{jo|B1k*8|C6q>e%V4^*jtu^&`8s6cYVD zowvhO`-fmPEvt2B)p{AWeaJtuK{xzoD3nO5V@or}Hjg*99Q~z}`J1mf=~CN<&Bl$N zzo?Don1-p- z8DUZwJeL$*6H8wi51CDL>#56-j-lYz5OL+(|u?X=xUstciHOJ2h34@sHV8`aB*9g*B`-1%R*3l_;fn~Sf2dAg zC)7HT0eO93WARyb6s)SwuvFm|bzk0ts`r#)r!ZWvs%t0};~H=JB}{!k{n-`I^p82b zj%AF%XJQQ9<;#>c@2NaYlgsvmCHqsSW%4$Rk$?~%&}@RCq#B^TEZR#N>{!a&HtG&r zGC#9n4@hCDU)1q&ay>haQ*PMm=&^!#2rNTH_Y5ng7HOBdG;G_HN4e>7wPso_fv1c% z&L)8siaVP{5&1Q2MaWM+4bbXW%^W4WjC9SNa__LF&A~)D3EZc~fQs=nO zs;&jWp-eAoSsORh>YA%ZHpK^fwq*k5MQY|5MEc-$8O9A&gKlIq!2KyNHGzqwWDbua zC8Xge$XL3J*&oa9tgrgG(3zQ(ke zKe03E3wNI)!zTG}DS^mqa!i8>T>MZ?F*Fp6*Y*snVD>vz%30pkww%(5lb*u&0>+BBZjN>gKE46zvIn~AR*Xkx5 zrVXdAaa!6lanN%J0<`|h`{tylI~*E~;)1ZDJ;bdZLmij79ZzS!cn9eALzow(?9n3h zp7#j{HN{vPR48}A552Q+8OL%p9uikucU=kFFrTWY{_atHTA{|L)yk6trJ@iaBeZKY zVdqHFlyR6(^8lwKMQB>3Z~B7!lo|5pY1q%z0k2Fdr{^U(Z;d)LcO#evR9Mt^yZHkS zl?4=DiTm3gBy<@i@|`M3&6?6DVk$38P0TQ!SsNe(==8xV& zSmS*W+sGgd)JrRe>fDDUM`dsef@t0^M~vCK0W$^Te}g5$zm?ci$+5!^NzB^r`fh$s zP}P<9xC)kcLnewIItCJg6xVVHu5n8{+~ACWr_t9N**n(z#@4J$oT_bdX?6geT2(MI#Q5GhD z{GQlC&|LrwWY-2u_7_bA>wr377EjKtzm26!k{GnQFnVsLllEQOJ+X)p7ld^@w-=CF2pRb^1`L5?kd2CzrHB@vFnfE#g zXtP$X!`j*5dfBM}iu{s_yXB8<^P9>7eeKbX!8GtrOaPaOLtwM~6xWp9=?rTFw^Tp=rA9I+7!In^dLH^8)q(r< diff --git a/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/ic_addgroup.pdf b/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/ic_addgroup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b9d70fbf57660956266aa8b56c0e3a8aa64bdf4e GIT binary patch literal 4995 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 Qfl0~80t5xs5gLI11GC(}lK=n! literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/Contents.json index 714534a855..b3a939aaae 100644 --- a/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "VideoPlayerBackwardIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "VideoPlayerBackwardIcon@3x.png", - "scale" : "3x" + "filename" : "ic_goback15.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/VideoPlayerBackwardIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/VideoPlayerBackwardIcon@2x.png deleted file mode 100644 index dd3b84b8496ec33cd1c9bc4c197ead0dd63d2fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 903 zcmV;219<$2P)##!&PZQHhO+qPAm`~H*kOD2;!onm-1|K#^Huc!TPPu)Y} z+$%0FE-o&vtgP&4^g;p`*&II-osq!xQ5)_@9DsC}<@gua2kD8Z40bD)!`fZhx+yMpY%OHnq4h3nH<@iuIb&t)u ziy$ov3#gf!mG3;!hQ01jKjc|ZlD zrBE=Z(8A#kOj_jTfIT5iFLprwe5z%bC1`=(NSXfqZOyv>LfYWwfDIunD`CK^uqmsd z&Ao62Mr$?eHh{F;?bmzKw&J&_~lQjOt6?hga zAXT+l^BzbF=ej*$S4f*mc$jz(3c3~)asI9hc)!zI2$pMVOI9PzTFa0&t+yLhH0zy+ z6r?s@JzH4|X^Ts1o|?!1=?y7^v%MPd2`EUFe0mcr1F56eXE+y0X z9`G_GAtiC6M;{NYhNSSdU#}dVg@TmATQ07D3AVyq3%_3;{b?Cep)n3EaozWjfVrtb zekPHDxxM(c$TzB1+WgRl1pN-$V@SZ-evHK1I9zku`_KtnHLndTgynt9b2Xn1NeXG~ z!A>NhpldZA3hS2<=0Ty*6t?1{D7+JWCMseH(hk?`CbY$^QGV dadB~R2LWT}>0{OMatQzc002ovPDHLkV1iK{wax$l diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/VideoPlayerBackwardIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Media Gallery/BackwardButton.imageset/VideoPlayerBackwardIcon@3x.png deleted file mode 100644 index 9b278a7135ef3b42b42d87a369c10cbf155407d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1264 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 OE=p*HaVuyj0{;iuzJ`YY literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/Contents.json index 263e68fb2a..8d6aff79d8 100644 --- a/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "VideoPlayerForwardIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "VideoPlayerForwardIcon@3x.png", - "scale" : "3x" + "filename" : "ic_go15.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/VideoPlayerForwardIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/VideoPlayerForwardIcon@2x.png deleted file mode 100644 index 34a661e33c19eb3ef0126d9eef5116af7289bdab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmV;i15W&jP)uU2Bt(#)SiWMtX ztXS?A7Z*1fo$!d^_$c(iwwZ?e5M&tT7j>lbwKI5 zeA^}(P_pFPHd2SW1K*n8K14s9hm+Nhgu$l3-z;2#U48LHxCXlg zm2eq}+l3A|4qeOf71l%78hjtluiAr{tvPuN!pAlznG-0CTMTE>(?~ z!&^3IQ48JhnC3bt^~F=+{&~9}DDzd^no4ab*->)X*ZU@u4(@_1SQC~mPi z{zxQU1~MUj1(VZF^8+{msaJA)DyR%;7amAX!`*`;kh0sXeHA4=zSi6jl=R~Ma159Y z(r(;lSeF-PA=OQEyav4WLO2HO2dT2=_~RG_$uwYlsJ3IA!Q-JG?q(c@^s#1*40i(A zZ3Y|$RkcX^`Fj)65!|dZ^H7I*)ud`#y~<9zQ!dU~xzt0v(V)-wnw^Z{$Nc?1AbUJ~iz7 zH>Al<4wwT{zaR#D3==$ZXwJe%p&DV>H#?*OP7e4xq#1z@=q=WEgle1NctuFfoE-37 zNSlNB3OLx`?iKu#_8w3t58{ZD!>6hh4ho=)yGPxCK&cz0V$Q!XVRIF z@&`EJt=J9KKBUB>cn1R^rPu8F0;J2h-{}EMLYff7W#V&OfT?aieEf-STnk@flq{V)(x=q8O&(D<zsUziy|9;fRdFZ-^eOQWl*p7=ZH4Lvs;=9vl&;=LaZx*KG z%V>B>d@s_VHx9yrt}~d38_NI%&QKl|XM^?zEP&V^ns0dqySqohC>RB!U=#oV5vZjg T_V8iP00000NkvXXu0mjfh=IY+ diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/VideoPlayerForwardIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/VideoPlayerForwardIcon@3x.png deleted file mode 100644 index b4f4360d331b502e3616439df66a2ca8c4857006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmV+t1?~EYP)CL( z2HAa){?Qb-U}j&@A3^QB%=kD6-)K5zGBhQJ;;>M;r!d1Eg> zT#e7$|DL%Yj@p2TI*!ppez>|nZ~ukPfTM;QI7S={MFJ1Z+iIB=;HVLr%J4E{;x**P zYAUxDx*Kxa;ZIW;US<)QywATg%J^xh=`Svhc6T2<6KIF={xJ^Lx!4Ht`g%0~07P<^#9}(D_ z`GhzMF)y79oh!W^tEEFCyM6oq3SygF+-5z*wxYPsg>DgM`uW8dqs)+NqjRBO&a< z;^{btV-VYH#zL1v?2-o;8Xpw}p}jd?7l^geaSoRuw%iK89lh|>LJb}-iP7UR^8#Ws z%vfl5$c4ASLW4kTp^i%^<+@qr2f5rHddN4z$p7eW@E$r&$K{lA<;_@V637j8<2dPb zEOaKs;(2qtZV;>I;_nZIToSY1i#~zaRS(@m%R}rq!Z`W$;IlCI1(99+{i_grZ04K$ zMUYG4frSRdS%|&FP}D{XEQA-t2D$MlTV&=!t3a-cZ!T2&$3KJKHY1>mzug6LRm@yy zP`rcK0|fKMg~~s<%!3!4^$o*xEHfA$Kv)YMvg4}zgu+TZCzS{375Mu--vyJqZ-=nN4$P; zlou8tjtBpC94vqr9M#Xx7ejo3qrPGk!u#?Y_EGo>M}0v}yI&BI1&`sZx0s5e2<*o3 z1EVOWf@3-DF|uejPX1Ek7+m!p%h3=y5D5XLukj)w2O45I-osVL^nS*-+tqq?a34nd z3>fY{>cGF|$C5t)bi!+Rs@Ldb!W(weKmYf{b@*1-(G%gczd06=75#7k-=VkfIDmf0 zs;Qj5Y9~iIv_?-1`;VSzjdDniz?#KVsZ=VJN~Kb%R4Ua!09i}X)F}5TEdT%j07*qo IM6N<$g3_FKumAu6 diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/ic_go15.pdf b/submodules/TelegramUI/Images.xcassets/Media Gallery/ForwardButton.imageset/ic_go15.pdf new file mode 100644 index 0000000000000000000000000000000000000000..181570be2265df42e5a0309b81db07dd4c77e10f GIT binary patch literal 4883 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 Qf*>SNP%s3dqNxi04_7U|$p8QV literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/Contents.json index a3f6e6383b..6bf93d0bd5 100644 --- a/submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/Contents.json @@ -2,16 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "EmbedVideoPIPIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "ic_pictureinpicture.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/EmbedVideoPIPIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Media Gallery/PictureInPictureButton.imageset/EmbedVideoPIPIcon@2x.png deleted file mode 100644 index 9c6de4b160afeffab736dee3c248f7e3e754c968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1198 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/Contents.json index d5bf557e5a..3c915fe3da 100644 --- a/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ShareSearchIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ShareSearchIcon@3x.png", - "scale" : "3x" + "filename" : "ic_search (2).pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/ShareSearchIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/ShareSearchIcon@2x.png deleted file mode 100644 index 71b3e09c0b835b01065e2d65078fa9800e935bde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv81Sq5z)|S0K&M@SmajKSLFmgfMFU zGXPOHOav}l3sweE4-|wb18RgIhzO7kR{&8D6o(+7`l|nlku%=`EmbWE@(X5AdGhb` zoKHc1+~1e%zbS9n!?x_FhvL!$AO045>a2UDyMFfTq6Ut2e9IXa7{xtZ978JN-d?$$ z*J2>Ta^du@3)S&rn|7c4^IzXBa7jW}cg49qin89*>H5`IX~ur?qz@eYDot&A1=vzuN-lG(xh$467QFbJz#t*RPeyX zUwIn4?5B+hHa?ShAFK{FJ-*?7Dv#KOOs2Mq?BcdQla~iR@zyQME8VfyaJ5;_2c=w= zMF9uxF1#pY{xN&&rYnzwoHQ&P{oB5Hh|F1J^pI<1lO>n1-huT=za_%WGya!`^Q-nK z*GS-<==*_k!*=P%Lb z4a)zj{0)tcrc3_y`(R$tAgP-)hk=3dtfz}(NCo5D>8+b?8wj}O&v;^BY<&3t|ESW_ zTZJm`=j^mSJZo-plu=C5M;D{1=TeMch8PLxHMKh`R=2HY+TqnbM$>o~-7t7l*~fb3r0SwbBY$R_g(qqv6laNkUd%CFLOYv- z)A?Eq51(b)R~eyaXTHkFeEK)LAW!+d9lP}z4kNcWj^`#HiM-30!m{SCg_FvgMCKqV zGpj}c&+3YnDT{mklw3~9ZBtm9x;U6);F)YCRe7oG<)&p zUAtdclrO9hf2F_ZMEA1U;=kTpx!$oa=<8pn`&+;44ZeTyYq5*{*%0Ha#y7uTocy=u z;#=`2Rl#|db?qtFKUuR#&wnlOZZ6|@zoIgke{a9v$eO=vdD-h9mA`Fc)(N%Ov+w7W z`Df4AdHBD*Qu&YnT~GL?|L^~^Xm!*FLqul2s$qNM7B52V^d||{9aH3_H^}g JS?83{1OWRiVRrxk diff --git a/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/ic_search (2).pdf b/submodules/TelegramUI/Images.xcassets/Share/SearchIcon.imageset/ic_search (2).pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4c39f8062d93912665bdd5f8add7ff0fd712ce7 GIT binary patch literal 4085 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/Contents.json index 22549bd146..bbeea7231a 100644 --- a/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ShareExternalIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ShareExternalIcon@3x.png", - "scale" : "3x" + "filename" : "ic_share.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ShareExternalIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ShareExternalIcon@2x.png deleted file mode 100644 index 8a273425fb89901c8f94b8b160bcce53dfb4bc75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^NPi(jd0|DukE%A2Z7c-RD- z4H_cq6|~uzJKlc|Q+&pHPE1Vcp1x?&_w3iRKMM-BxcD6vF_*d1vgKi!48x4B8x0J{ zgj6{mx(l$W?0%o8za;xx%Y<~J`kZazpYr4W2rCvI*s07Q>LTFCA_yX83LWZGXyQ=n mP!QqJd)V_x$Znso<2@slnc?=aKQe({VDNPHb6Mw<&;$UQ#aSc( diff --git a/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ShareExternalIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ShareExternalIcon@3x.png deleted file mode 100644 index 274144916eacb4416cdbddc12615ad522c4fb843..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^#z5@B!3-pGX4y&sDd_;85LY10Q1zdo`ahJc`Oi@M zpP>Q7-TyyO5-7`2666=m@F#rzxdv^WBc~LtfnqhDE{-7;x87dZ$kkxL;~FTv_S^sc z5l<#LPWi;d$M;@usbYG@bpP%ZldmoEImR%RV}*-@E0dPc1iuP?57ok%0)g*h)%2AP zdb~Ix>$9k~%SwfJh5lzN7Urfiw=4~Kju@nTzP4k#?OCgLfA7DjPe=v=Wywt&HwyOL byMLCmhDm1A*Gp+4Ag6n}`njxgN@xNApt4!` diff --git a/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ic_share.pdf b/submodules/TelegramUI/Images.xcassets/Share/ShareIcon.imageset/ic_share.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c372a213f7833d7ad7b58e2f48cd0b5e1f9414c6 GIT binary patch literal 4321 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 Date: Fri, 23 Aug 2019 15:35:07 +0400 Subject: [PATCH 27/86] Display all reactions in context menu --- .../Postbox/Postbox/MessageHistoryTable.swift | 30 +++- submodules/Postbox/Postbox/Postbox.swift | 36 ++--- .../Sources/ReactionContextNode.swift | 128 +++++++++++++++--- .../Sources/ReactionSelectionNode.swift | 32 ++++- .../Sources/ShareController.swift | 2 +- .../AccountStateManagementUtils.swift | 8 +- .../TelegramCore/DeleteMessages.swift | 14 +- .../DeleteMessagesInteractively.swift | 4 +- .../TelegramCore/ProcessRemovedMedia.swift | 15 ++ .../TelegramCore/ScheduledMessages.swift | 4 +- .../TelegramCore/UpdateCachedPeerData.swift | 4 +- .../project.pbxproj | 6 + .../TelegramUI/ChatController.swift | 12 +- .../ChatMessageDateAndStatusNode.swift | 108 ++++++++------- .../SharedNotificationManager.swift | 78 ++++------- .../UrlEscaping/Sources/UrlEscaping.swift | 6 +- 16 files changed, 332 insertions(+), 155 deletions(-) create mode 100644 submodules/TelegramCore/TelegramCore/ProcessRemovedMedia.swift diff --git a/submodules/Postbox/Postbox/MessageHistoryTable.swift b/submodules/Postbox/Postbox/MessageHistoryTable.swift index 701d92990a..c6f854275b 100644 --- a/submodules/Postbox/Postbox/MessageHistoryTable.swift +++ b/submodules/Postbox/Postbox/MessageHistoryTable.swift @@ -408,32 +408,50 @@ final class MessageHistoryTable: Table { return globallyUniqueIdToMessageId } - func removeMessages(_ messageIds: [MessageId], operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation]) { + func removeMessages(_ messageIds: [MessageId], operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation], forEachMedia: (Media) -> Void) { for (peerId, messageIds) in self.messageIdsByPeerId(messageIds) { var operations: [MessageHistoryIndexOperation] = [] for id in messageIds { self.messageHistoryIndexTable.removeMessage(id, operations: &operations) } + for operation in operations { + if case let .Remove(index) = operation { + if let message = self.getMessage(index) { + for media in self.renderMessageMedia(referencedMedia: message.referencedMedia, embeddedMediaData: message.embeddedMediaData) { + forEachMedia(media) + } + } + } + } self.processIndexOperations(peerId, operations: operations, processedOperationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations) } } - func removeMessagesInRange(peerId: PeerId, namespace: MessageId.Namespace, minId: MessageId.Id, maxId: MessageId.Id, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation]) { + func removeMessagesInRange(peerId: PeerId, namespace: MessageId.Namespace, minId: MessageId.Id, maxId: MessageId.Id, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation], forEachMedia: (Media) -> Void) { var operations: [MessageHistoryIndexOperation] = [] self.messageHistoryIndexTable.removeMessagesInRange(peerId: peerId, namespace: namespace, minId: minId, maxId: maxId, operations: &operations) + for operation in operations { + if case let .Remove(index) = operation { + if let message = self.getMessage(index) { + for media in self.renderMessageMedia(referencedMedia: message.referencedMedia, embeddedMediaData: message.embeddedMediaData) { + forEachMedia(media) + } + } + } + } self.processIndexOperations(peerId, operations: operations, processedOperationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations) } - func clearHistory(peerId: PeerId, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation]) { + func clearHistory(peerId: PeerId, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation], forEachMedia: (Media) -> Void) { let indices = self.allMessageIndices(peerId: peerId) - self.removeMessages(indices.map { $0.id }, operationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations) + self.removeMessages(indices.map { $0.id }, operationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations, forEachMedia: forEachMedia) } - func removeAllMessagesWithAuthor(peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation]) { + func removeAllMessagesWithAuthor(peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation], forEachMedia: (Media) -> Void) { let indices = self.allIndicesWithAuthor(peerId: peerId, authorId: authorId, namespace: namespace) - self.removeMessages(indices.map { $0.id }, operationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations) + self.removeMessages(indices.map { $0.id }, operationsByPeerId: &operationsByPeerId, updatedMedia: &updatedMedia, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations, pendingActionsOperations: &pendingActionsOperations, updatedMessageActionsSummaries: &updatedMessageActionsSummaries, updatedMessageTagSummaries: &updatedMessageTagSummaries, invalidateMessageTagSummaries: &invalidateMessageTagSummaries, localTagsOperations: &localTagsOperations, forEachMedia: forEachMedia) } func updateMessage(_ id: MessageId, message: StoreMessage, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], updatedMedia: inout [MediaId: Media?], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?], globalTagsOperations: inout [GlobalMessageHistoryTagsOperation], pendingActionsOperations: inout [PendingMessageActionsOperation], updatedMessageActionsSummaries: inout [PendingMessageActionsSummaryKey: Int32], updatedMessageTagSummaries: inout [MessageHistoryTagsSummaryKey: MessageHistoryTagNamespaceSummary], invalidateMessageTagSummaries: inout [InvalidatedMessageHistoryTagsSummaryEntryOperation], localTagsOperations: inout [IntermediateMessageHistoryLocalTagsOperation]) { diff --git a/submodules/Postbox/Postbox/Postbox.swift b/submodules/Postbox/Postbox/Postbox.swift index c7216d6498..e07f206398 100644 --- a/submodules/Postbox/Postbox/Postbox.swift +++ b/submodules/Postbox/Postbox/Postbox.swift @@ -72,28 +72,28 @@ public final class Transaction { self.postbox?.replaceChatListHole(groupId: groupId, index: index, hole: hole) } - public func deleteMessages(_ messageIds: [MessageId]) { + public func deleteMessages(_ messageIds: [MessageId], forEachMedia: (Media) -> Void) { assert(!self.disposed) - self.postbox?.deleteMessages(messageIds) + self.postbox?.deleteMessages(messageIds, forEachMedia: forEachMedia) } - public func deleteMessagesInRange(peerId: PeerId, namespace: MessageId.Namespace, minId: MessageId.Id, maxId: MessageId.Id) { + public func deleteMessagesInRange(peerId: PeerId, namespace: MessageId.Namespace, minId: MessageId.Id, maxId: MessageId.Id, forEachMedia: (Media) -> Void) { assert(!self.disposed) - self.postbox?.deleteMessagesInRange(peerId: peerId, namespace: namespace, minId: minId, maxId: maxId) + self.postbox?.deleteMessagesInRange(peerId: peerId, namespace: namespace, minId: minId, maxId: maxId, forEachMedia: forEachMedia) } public func withAllMessages(peerId: PeerId, namespace: MessageId.Namespace? = nil, _ f: (Message) -> Bool) { self.postbox?.withAllMessages(peerId: peerId, namespace: namespace, f) } - public func clearHistory(_ peerId: PeerId) { + public func clearHistory(_ peerId: PeerId, forEachMedia: (Media) -> Void) { assert(!self.disposed) - self.postbox?.clearHistory(peerId) + self.postbox?.clearHistory(peerId, forEachMedia: forEachMedia) } - public func removeAllMessagesWithAuthor(_ peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace) { + public func removeAllMessagesWithAuthor(_ peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace, forEachMedia: (Media) -> Void) { assert(!self.disposed) - self.postbox?.removeAllMessagesWithAuthor(peerId, authorId: authorId, namespace: namespace) + self.postbox?.removeAllMessagesWithAuthor(peerId, authorId: authorId, namespace: namespace, forEachMedia: forEachMedia) } public func messageIdsForGlobalIds(_ ids: [Int32]) -> [MessageId] { @@ -105,11 +105,11 @@ public final class Transaction { } } - public func deleteMessagesWithGlobalIds(_ ids: [Int32]) { + public func deleteMessagesWithGlobalIds(_ ids: [Int32], forEachMedia: (Media) -> Void) { assert(!self.disposed) if let postbox = self.postbox { let messageIds = postbox.messageIdsForGlobalIds(ids) - postbox.deleteMessages(messageIds) + postbox.deleteMessages(messageIds, forEachMedia: forEachMedia) } } @@ -1499,12 +1499,12 @@ public final class Postbox { self.chatListTable.replaceHole(groupId: groupId, index: index, hole: hole, operations: &self.currentChatListOperations) } - fileprivate func deleteMessages(_ messageIds: [MessageId]) { - self.messageHistoryTable.removeMessages(messageIds, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations) + fileprivate func deleteMessages(_ messageIds: [MessageId], forEachMedia: (Media) -> Void) { + self.messageHistoryTable.removeMessages(messageIds, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations, forEachMedia: forEachMedia) } - fileprivate func deleteMessagesInRange(peerId: PeerId, namespace: MessageId.Namespace, minId: MessageId.Id, maxId: MessageId.Id) { - self.messageHistoryTable.removeMessagesInRange(peerId: peerId, namespace: namespace, minId: minId, maxId: maxId, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations) + fileprivate func deleteMessagesInRange(peerId: PeerId, namespace: MessageId.Namespace, minId: MessageId.Id, maxId: MessageId.Id, forEachMedia: (Media) -> Void) { + self.messageHistoryTable.removeMessagesInRange(peerId: peerId, namespace: namespace, minId: minId, maxId: maxId, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations, forEachMedia: forEachMedia) } fileprivate func withAllMessages(peerId: PeerId, namespace: MessageId.Namespace?, _ f: (Message) -> Bool) { @@ -1519,15 +1519,15 @@ public final class Postbox { } } - fileprivate func clearHistory(_ peerId: PeerId) { - self.messageHistoryTable.clearHistory(peerId: peerId, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations) + fileprivate func clearHistory(_ peerId: PeerId, forEachMedia: (Media) -> Void) { + self.messageHistoryTable.clearHistory(peerId: peerId, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations, forEachMedia: forEachMedia) for namespace in self.messageHistoryHoleIndexTable.existingNamespaces(peerId: peerId, holeSpace: .everywhere) { self.messageHistoryHoleIndexTable.remove(peerId: peerId, namespace: namespace, space: .everywhere, range: 1 ... Int32.max - 1, operations: &self.currentPeerHoleOperations) } } - fileprivate func removeAllMessagesWithAuthor(_ peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace) { - self.messageHistoryTable.removeAllMessagesWithAuthor(peerId: peerId, authorId: authorId, namespace: namespace, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations) + fileprivate func removeAllMessagesWithAuthor(_ peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace, forEachMedia: (Media) -> Void) { + self.messageHistoryTable.removeAllMessagesWithAuthor(peerId: peerId, authorId: authorId, namespace: namespace, operationsByPeerId: &self.currentOperationsByPeerId, updatedMedia: &self.currentUpdatedMedia, unsentMessageOperations: ¤tUnsentOperations, updatedPeerReadStateOperations: &self.currentUpdatedSynchronizeReadStateOperations, globalTagsOperations: &self.currentGlobalTagsOperations, pendingActionsOperations: &self.currentPendingMessageActionsOperations, updatedMessageActionsSummaries: &self.currentUpdatedMessageActionsSummaries, updatedMessageTagSummaries: &self.currentUpdatedMessageTagSummaries, invalidateMessageTagSummaries: &self.currentInvalidateMessageTagSummaries, localTagsOperations: &self.currentLocalTagsOperations, forEachMedia: forEachMedia) } fileprivate func resetIncomingReadStates(_ states: [PeerId: [MessageId.Namespace: PeerReadState]]) { diff --git a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift index f0753116f6..d86a58791b 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift @@ -86,7 +86,9 @@ public final class ReactionContextNode: ASDisplayNode { private let smallCircleNode: ASImageNode private let smallCircleShadowNode: ASImageNode + private let contentContainer: ASDisplayNode private var itemNodes: [ReactionNode] = [] + private let disclosureButton: HighlightTrackingButtonNode private var isExpanded: Bool = false private var highlightedReaction: String? @@ -139,6 +141,28 @@ public final class ReactionContextNode: ASDisplayNode { self.largeCircleShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: largeCircleSize, shadowBlur: shadowBlur) self.smallCircleShadowNode.image = generateBubbleShadowImage(shadow: UIColor(white: 0.0, alpha: 0.2), diameter: smallCircleSize, shadowBlur: shadowBlur) + self.contentContainer = ASDisplayNode() + self.contentContainer.clipsToBounds = true + + self.disclosureButton = HighlightTrackingButtonNode() + self.disclosureButton.hitTestSlop = UIEdgeInsets(top: -6.0, left: -6.0, bottom: -6.0, right: -6.0) + let buttonImage = generateImage(CGSize(width: 30.0, height: 30.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(theme.contextMenu.dimColor.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + context.setBlendMode(.copy) + context.setStrokeColor(UIColor.clear.cgColor) + context.setLineWidth(2.0) + context.setLineCap(.round) + context.setLineJoin(.round) + context.beginPath() + context.move(to: CGPoint(x: 8.0, y: size.height / 2.0 + 3.0)) + context.addLine(to: CGPoint(x: size.width / 2.0, y: 11.0)) + context.addLine(to: CGPoint(x: size.width - 8.0, y: size.height / 2.0 + 3.0)) + context.strokePath() + }) + self.disclosureButton.setImage(buttonImage, for: []) + super.init() self.addSubnode(self.smallCircleShadowNode) @@ -150,10 +174,23 @@ public final class ReactionContextNode: ASDisplayNode { self.backgroundContainerNode.addSubnode(self.backgroundNode) self.addSubnode(self.backgroundContainerNode) + self.contentContainer.addSubnode(self.disclosureButton) + self.itemNodes = self.items.map { item in return ReactionNode(account: account, theme: theme, reaction: .reaction(value: item.value, text: item.text, path: item.path), maximizedReactionSize: 30.0 - 18.0, loadFirstFrame: true) } - self.itemNodes.forEach(self.addSubnode) + self.itemNodes.forEach(self.contentContainer.addSubnode) + + self.addSubnode(self.contentContainer) + + self.disclosureButton.addTarget(self, action: #selector(self.disclosurePressed), forControlEvents: .touchUpInside) + self.disclosureButton.highligthedChanged = { [weak self] highlighted in + if highlighted { + self?.disclosureButton.layer.animateScale(from: 1.0, to: 0.8, duration: 0.15, removeOnCompletion: false) + } else { + self?.disclosureButton.layer.animateScale(from: 0.8, to: 1.0, duration: 0.25) + } + } } override public func didLoad() { @@ -193,18 +230,27 @@ public final class ReactionContextNode: ASDisplayNode { let minimizedItemSize: CGFloat = 30.0 let maximizedItemSize: CGFloat = 30.0 - 18.0 let shadowBlur: CGFloat = 5.0 - let rowHeight: CGFloat = 52.0 + let verticalInset: CGFloat = 11.0 + let rowHeight: CGFloat = 30.0 + let rowSpacing: CGFloat = itemSpacing - let columnCount = min(7, self.items.count) + let columnCount = min(6, self.items.count) let contentWidth = CGFloat(columnCount) * minimizedItemSize + (CGFloat(columnCount) - 1.0) * itemSpacing + sideInset * 2.0 let rowCount = self.items.count / columnCount + (self.items.count % columnCount == 0 ? 0 : 1) - let contentHeight = rowHeight * CGFloat(rowCount) + + let expandedRowCount = self.isExpanded ? rowCount : 1 + + let contentHeight = verticalInset * 2.0 + rowHeight * CGFloat(expandedRowCount) + CGFloat(expandedRowCount - 1) * rowSpacing let (backgroundFrame, isLeftAligned) = self.calculateBackgroundFrame(containerSize: size, insets: insets, anchorRect: anchorRect, contentSize: CGSize(width: contentWidth, height: contentHeight)) + transition.updateFrame(node: self.contentContainer, frame: backgroundFrame) + for i in 0 ..< self.items.count { - let row = CGFloat(i / columnCount) - let column = CGFloat(i % columnCount) + let rowIndex = i / columnCount + let columnIndex = i % columnCount + let row = CGFloat(rowIndex) + let column = CGFloat(columnIndex) var reactionValue: String? switch self.itemNodes[i].reaction { @@ -224,18 +270,43 @@ public final class ReactionContextNode: ASDisplayNode { itemSize = updatedSize } - transition.updateFrame(node: self.itemNodes[i], frame: CGRect(origin: CGPoint(x: backgroundFrame.minX + sideInset + column * (minimizedItemSize + itemSpacing) - itemOffset, y: backgroundFrame.minY + row * rowHeight + floor((rowHeight - minimizedItemSize) / 2.0) - itemOffset), size: CGSize(width: itemSize, height: itemSize)), beginWithCurrentState: true) + let itemFrame = CGRect(origin: CGPoint(x: sideInset + column * (minimizedItemSize + itemSpacing) - itemOffset, y: verticalInset + row * (rowHeight + rowSpacing) + floor((rowHeight - minimizedItemSize) / 2.0) - itemOffset), size: CGSize(width: itemSize, height: itemSize)) + transition.updateFrame(node: self.itemNodes[i], frame: itemFrame, beginWithCurrentState: true) self.itemNodes[i].updateLayout(size: CGSize(width: itemSize, height: itemSize), scale: itemSize / (maximizedItemSize + 18.0), transition: transition, displayText: false) self.itemNodes[i].updateIsAnimating(false, animated: false) - if row != 0 { + if rowIndex != 0 || columnIndex == columnCount - 1 { if self.isExpanded { - self.itemNodes[i].alpha = 1.0 + if self.itemNodes[i].alpha.isZero { + self.itemNodes[i].alpha = 1.0 + if transition.isAnimated { + let delayOffset: Double = 1.0 - Double(columnIndex) / Double(columnCount - 1) + self.itemNodes[i].layer.animateSpring(from: 0.1 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.4 + delayOffset * 0.32, initialVelocity: 0.0, damping: 95.0) + self.itemNodes[i].layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.05) + } + } } else { self.itemNodes[i].alpha = 0.0 } } else { self.itemNodes[i].alpha = 1.0 } + + if rowIndex == 0 && columnIndex == columnCount - 1 { + transition.updateFrame(node: self.disclosureButton, frame: itemFrame) + if self.isExpanded { + if self.disclosureButton.alpha.isEqual(to: 1.0) { + self.disclosureButton.alpha = 0.0 + if transition.isAnimated { + self.disclosureButton.layer.animateScale(from: 0.8, to: 0.1, duration: 0.2, removeOnCompletion: false) + self.disclosureButton.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak self] _ in + self?.disclosureButton.layer.removeAnimation(forKey: "scale") + }) + } + } + } else { + self.disclosureButton.alpha = 1.0 + } + } } let isInOverflow = backgroundFrame.maxY > anchorRect.minY @@ -254,10 +325,10 @@ public final class ReactionContextNode: ASDisplayNode { let largeCircleFrame: CGRect let smallCircleFrame: CGRect if isLeftAligned { - largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.maxX + 22.0 - rowHeight + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize)) + largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.maxX + 16.0 - rowHeight + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize)) smallCircleFrame = CGRect(origin: CGPoint(x: largeCircleFrame.maxX - 3.0, y: largeCircleFrame.maxY + 2.0), size: CGSize(width: smallCircleSize, height: smallCircleSize)) } else { - largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.minX - 24.0 + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize)) + largeCircleFrame = CGRect(origin: CGPoint(x: anchorRect.minX - 18.0 + floor((rowHeight - largeCircleSize) / 2.0), y: backgroundFrame.maxY - largeCircleSize / 2.0), size: CGSize(width: largeCircleSize, height: largeCircleSize)) smallCircleFrame = CGRect(origin: CGPoint(x: largeCircleFrame.minX + 3.0 - smallCircleSize, y: largeCircleFrame.maxY + 2.0), size: CGSize(width: smallCircleSize, height: smallCircleSize)) } @@ -289,15 +360,16 @@ public final class ReactionContextNode: ASDisplayNode { } public func animateOut(to targetAnchorRect: CGRect?, animatingOutToReaction: Bool) { + self.backgroundNode.layer.animateAlpha(from: self.backgroundNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.backgroundShadowNode.layer.animateAlpha(from: self.backgroundShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.largeCircleNode.layer.animateAlpha(from: self.largeCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.largeCircleShadowNode.layer.animateAlpha(from: self.largeCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.smallCircleNode.layer.animateAlpha(from: self.smallCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.smallCircleShadowNode.layer.animateAlpha(from: self.smallCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) for itemNode in self.itemNodes { - self.backgroundNode.layer.animateAlpha(from: self.backgroundNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) - self.backgroundShadowNode.layer.animateAlpha(from: self.backgroundShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) - self.largeCircleNode.layer.animateAlpha(from: self.largeCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) - self.largeCircleShadowNode.layer.animateAlpha(from: self.largeCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) - self.smallCircleNode.layer.animateAlpha(from: self.smallCircleNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) - self.smallCircleShadowNode.layer.animateAlpha(from: self.smallCircleShadowNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) - itemNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) + itemNode.layer.animateAlpha(from: itemNode.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) } + self.disclosureButton.layer.animateAlpha(from: self.disclosureButton.alpha, to: 0.0, duration: 0.2, removeOnCompletion: false) if let targetAnchorRect = targetAnchorRect, let (size, insets, anchorRect) = self.validLayout { self.updateLayout(size: size, insets: insets, anchorRect: anchorRect, transition: .immediate, animateInFromAnchorRect: nil, animateOutToAnchorRect: targetAnchorRect) @@ -383,8 +455,14 @@ public final class ReactionContextNode: ASDisplayNode { } override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + let contentPoint = self.contentContainer.view.convert(point, from: self.view) + if !self.disclosureButton.alpha.isZero { + if let result = self.disclosureButton.hitTest(self.disclosureButton.view.convert(point, from: self.view), with: event) { + return result + } + } for itemNode in self.itemNodes { - if itemNode.frame.contains(point) { + if !itemNode.alpha.isZero && itemNode.frame.contains(contentPoint) { return self.view } } @@ -401,13 +479,14 @@ public final class ReactionContextNode: ASDisplayNode { } public func reaction(at point: CGPoint) -> ReactionGestureItem? { + let contentPoint = self.contentContainer.view.convert(point, from: self.view) for itemNode in self.itemNodes { - if itemNode.frame.contains(point) { + if !itemNode.alpha.isZero && itemNode.frame.contains(contentPoint) { return itemNode.reaction } } for itemNode in self.itemNodes { - if itemNode.frame.insetBy(dx: -8.0, dy: -8.0).contains(point) { + if !itemNode.alpha.isZero && itemNode.frame.insetBy(dx: -8.0, dy: -8.0).contains(contentPoint) { return itemNode.reaction } } @@ -420,4 +499,11 @@ public final class ReactionContextNode: ASDisplayNode { self.updateLayout(size: size, insets: insets, anchorRect: anchorRect, transition: .animated(duration: 0.18, curve: .easeInOut), animateInFromAnchorRect: nil, animateOutToAnchorRect: nil, animateReactionHighlight: true) } } + + @objc private func disclosurePressed() { + self.isExpanded = true + if let (size, insets, anchorRect) = self.validLayout { + self.updateLayout(size: size, insets: insets, anchorRect: anchorRect, transition: .animated(duration: 0.3, curve: .spring), animateInFromAnchorRect: nil, animateOutToAnchorRect: nil, animateReactionHighlight: true) + } + } } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift index 10e3d67288..77c5fa1c2c 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -80,7 +80,7 @@ final class ReactionNode: ASDisplayNode { switch reaction { case let .reaction(value, _, path): switch value { - case "😒": + case "😔": intrinsicSize.width *= 1.7 intrinsicSize.height *= 1.7 self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) @@ -96,6 +96,34 @@ final class ReactionNode: ASDisplayNode { intrinsicSize.width *= 1.256 intrinsicSize.height *= 1.256 self.intrinsicOffset = CGPoint(x: 0.0, y: 0.05 * intrinsicSize.width) + case "🥳": + intrinsicSize.width *= 1.39 + intrinsicSize.height *= 1.39 + self.intrinsicOffset = CGPoint(x: 0.1 * intrinsicSize.width, y: -0.05 * intrinsicSize.width) + case "😭": + intrinsicSize.width *= 1.15 + intrinsicSize.height *= 1.15 + self.intrinsicOffset = CGPoint(x: 0.1 * intrinsicSize.width, y: 0.03 * intrinsicSize.width) + case "😒": + intrinsicSize.width *= 1.05 + intrinsicSize.height *= 1.05 + self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) + case "👌": + intrinsicSize.width *= 1.08 + intrinsicSize.height *= 1.08 + self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) + case "😐": + intrinsicSize.width *= 1.75 + intrinsicSize.height *= 1.75 + self.intrinsicOffset = CGPoint(x: 0.0, y: 0.01 * intrinsicSize.width) + case "💩": + intrinsicSize.width *= 1.1 + intrinsicSize.height *= 1.1 + self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) + case "😊": + intrinsicSize.width *= 1.2 + intrinsicSize.height *= 1.2 + self.intrinsicOffset = CGPoint(x: 0.0, y: -0.01 * intrinsicSize.width) default: self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) } @@ -116,6 +144,8 @@ final class ReactionNode: ASDisplayNode { super.init() + //self.backgroundColor = .gray + self.textBackgroundNode.addSubnode(self.textNode) self.addSubnode(self.textBackgroundNode) diff --git a/submodules/ShareController/Sources/ShareController.swift b/submodules/ShareController/Sources/ShareController.swift index 0f1d4a7e5b..8ff38ca2cb 100644 --- a/submodules/ShareController/Sources/ShareController.swift +++ b/submodules/ShareController/Sources/ShareController.swift @@ -477,7 +477,7 @@ public final class ShareController: ViewController { if let error = error { Queue.mainQueue().async { let _ = (account.postbox.transaction { transaction -> Peer? in - transaction.deleteMessages([id]) + deleteMessages(transaction: transaction, mediaBox: account.postbox.mediaBox, ids: [id]) return transaction.getPeer(id.peerId) } |> deliverOnMainQueue).start(next: { peer in diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index 2539e788bb..2971525db1 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -2281,14 +2281,18 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } } case let .DeleteMessagesWithGlobalIds(ids): - transaction.deleteMessagesWithGlobalIds(ids) + transaction.deleteMessagesWithGlobalIds(ids, forEachMedia: { media in + processRemovedMedia(mediaBox, media) + }) case let .DeleteMessages(ids): deleteMessages(transaction: transaction, mediaBox: mediaBox, ids: ids) case let .UpdateMinAvailableMessage(id): if let message = transaction.getMessage(id) { updatePeerChatInclusionWithMinTimestamp(transaction: transaction, id: id.peerId, minTimestamp: message.timestamp, forceRootGroupIfNotExists: false) } - transaction.deleteMessagesInRange(peerId: id.peerId, namespace: id.namespace, minId: 1, maxId: id.id) + transaction.deleteMessagesInRange(peerId: id.peerId, namespace: id.namespace, minId: 1, maxId: id.id, forEachMedia: { media in + processRemovedMedia(mediaBox, media) + }) case let .UpdatePeerChatInclusion(peerId, groupId, changedGroup): let currentInclusion = transaction.getPeerChatListInclusion(peerId) var currentPinningIndex: UInt16? diff --git a/submodules/TelegramCore/TelegramCore/DeleteMessages.swift b/submodules/TelegramCore/TelegramCore/DeleteMessages.swift index 07fcdbdd46..291e704b98 100644 --- a/submodules/TelegramCore/TelegramCore/DeleteMessages.swift +++ b/submodules/TelegramCore/TelegramCore/DeleteMessages.swift @@ -26,7 +26,15 @@ public func deleteMessages(transaction: Transaction, mediaBox: MediaBox, ids: [M } } } - transaction.deleteMessages(ids) + transaction.deleteMessages(ids, forEachMedia: { media in + processRemovedMedia(mediaBox, media) + }) +} + +public func deleteAllMessagesWithAuthor(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace) { + transaction.removeAllMessagesWithAuthor(peerId, authorId: authorId, namespace: namespace, forEachMedia: { media in + processRemovedMedia(mediaBox, media) + }) } public func clearHistory(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId) { @@ -36,5 +44,7 @@ public func clearHistory(transaction: Transaction, mediaBox: MediaBox, peerId: P return true }) } - transaction.clearHistory(peerId) + transaction.clearHistory(peerId, forEachMedia: { media in + processRemovedMedia(mediaBox, media) + }) } diff --git a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift index 6ddc2999b4..bb1ba5df9c 100644 --- a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift +++ b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift @@ -165,7 +165,9 @@ public func clearAuthorHistory(account: Account, peerId: PeerId, memberId: PeerI |> `catch` { success -> Signal in if success { return account.postbox.transaction { transaction -> Void in - transaction.removeAllMessagesWithAuthor(peerId, authorId: memberId, namespace: Namespaces.Message.Cloud) + transaction.removeAllMessagesWithAuthor(peerId, authorId: memberId, namespace: Namespaces.Message.Cloud, forEachMedia: { media in + processRemovedMedia(account.postbox.mediaBox, media) + }) } } else { return .complete() diff --git a/submodules/TelegramCore/TelegramCore/ProcessRemovedMedia.swift b/submodules/TelegramCore/TelegramCore/ProcessRemovedMedia.swift new file mode 100644 index 0000000000..fdeacf55fa --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/ProcessRemovedMedia.swift @@ -0,0 +1,15 @@ +import Foundation +#if os(macOS) +import PostboxMac +#else +import Postbox +#endif + +func processRemovedMedia(_ mediaBox: MediaBox, _ media: Media) { + if let image = media as? TelegramMediaImage { + let _ = mediaBox.removeCachedResources(Set(image.representations.map({ WrappedMediaResourceId($0.resource.id) }))).start() + } else if let file = media as? TelegramMediaFile { + let _ = mediaBox.removeCachedResources(Set(file.previewRepresentations.map({ WrappedMediaResourceId($0.resource.id) }))).start() + let _ = mediaBox.removeCachedResources(Set([WrappedMediaResourceId(file.resource.id)])).start() + } +} diff --git a/submodules/TelegramCore/TelegramCore/ScheduledMessages.swift b/submodules/TelegramCore/TelegramCore/ScheduledMessages.swift index 23f66776b6..66eedfd5e7 100644 --- a/submodules/TelegramCore/TelegramCore/ScheduledMessages.swift +++ b/submodules/TelegramCore/TelegramCore/ScheduledMessages.swift @@ -127,7 +127,9 @@ func managedApplyPendingScheduledMessagesActions(postbox: Postbox, network: Netw }) |> then( postbox.transaction { transaction -> Void in - transaction.deleteMessages([entry.id]) + transaction.deleteMessages([entry.id], forEachMedia: { media in + processRemovedMedia(postbox.mediaBox, media) + }) } |> ignoreValues ) diff --git a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift index 4fb5c5230c..7722753bdc 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift @@ -425,7 +425,9 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI }) if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { - transaction.deleteMessagesInRange(peerId: peerId, namespace: minAvailableMessageId.namespace, minId: 1, maxId: minAvailableMessageId.id) + transaction.deleteMessagesInRange(peerId: peerId, namespace: minAvailableMessageId.namespace, minId: 1, maxId: minAvailableMessageId.id, forEachMedia: { media in + processRemovedMedia(postbox.mediaBox, media) + }) } case .chatFull: break diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 93fa992764..3329a427b4 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -602,6 +602,8 @@ D0B844531DAC0773005F29E1 /* TelegramUserPresence.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B844521DAC0773005F29E1 /* TelegramUserPresence.swift */; }; D0B85AC51F6B2B9400B8B5CE /* RecentlyUsedHashtags.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B85AC41F6B2B9400B8B5CE /* RecentlyUsedHashtags.swift */; }; D0B85AC61F6B2B9400B8B5CE /* RecentlyUsedHashtags.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B85AC41F6B2B9400B8B5CE /* RecentlyUsedHashtags.swift */; }; + D0BAAA14230FDB4100AFC473 /* ProcessRemovedMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA13230FDB4100AFC473 /* ProcessRemovedMedia.swift */; }; + D0BAAA15230FDB4100AFC473 /* ProcessRemovedMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA13230FDB4100AFC473 /* ProcessRemovedMedia.swift */; }; D0BB7C5A1E5C8074001527C3 /* ChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BB7C591E5C8074001527C3 /* ChannelParticipants.swift */; }; D0BC386E1E3FDAB70044D6FE /* CreateGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC386D1E3FDAB70044D6FE /* CreateGroup.swift */; }; D0BC38701E40853E0044D6FE /* UpdatePeers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC386F1E40853E0044D6FE /* UpdatePeers.swift */; }; @@ -1118,6 +1120,7 @@ D0B843961DA7FBBC005F29E1 /* ChangePeerNotificationSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePeerNotificationSettings.swift; sourceTree = ""; }; D0B844521DAC0773005F29E1 /* TelegramUserPresence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramUserPresence.swift; sourceTree = ""; }; D0B85AC41F6B2B9400B8B5CE /* RecentlyUsedHashtags.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentlyUsedHashtags.swift; sourceTree = ""; }; + D0BAAA13230FDB4100AFC473 /* ProcessRemovedMedia.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessRemovedMedia.swift; sourceTree = ""; }; D0BB7C591E5C8074001527C3 /* ChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelParticipants.swift; sourceTree = ""; }; D0BC386D1E3FDAB70044D6FE /* CreateGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroup.swift; sourceTree = ""; }; D0BC386F1E40853E0044D6FE /* UpdatePeers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatePeers.swift; sourceTree = ""; }; @@ -1513,6 +1516,7 @@ D03B0D121D62257600955575 /* Resources */, D0DFD5DE1FCDBCFD0039B3B1 /* CachedSentMediaReferences.swift */, D0879BC722F85A3E00C4D6B3 /* ImageRepresentationWithReference.swift */, + D0BAAA13230FDB4100AFC473 /* ProcessRemovedMedia.swift */, ); name = Media; sourceTree = ""; @@ -2484,6 +2488,7 @@ D041E3F81E535A88008C24B4 /* RemovePeerMember.swift in Sources */, D076F8892296D8E9004F895A /* ManageChannelDiscussionGroup.swift in Sources */, D0B417C11D7DCEEF004562A4 /* ApiGroupOrChannel.swift in Sources */, + D0BAAA14230FDB4100AFC473 /* ProcessRemovedMedia.swift in Sources */, D041E3F51E535464008C24B4 /* AddPeerMember.swift in Sources */, D0AF32311FACEDEC0097362B /* CoreSettings.swift in Sources */, D054649A20738760002ECC1E /* SecureIdRentalAgreementValue.swift in Sources */, @@ -2875,6 +2880,7 @@ D0B418971D7E0580004562A4 /* TelegramMediaImage.swift in Sources */, D01843A92190C28100278AFF /* ConfirmTwoStepRecoveryEmail.swift in Sources */, D041E3F91E535A88008C24B4 /* RemovePeerMember.swift in Sources */, + D0BAAA15230FDB4100AFC473 /* ProcessRemovedMedia.swift in Sources */, D049EAF61E44DF3300A2CD3A /* AccountState.swift in Sources */, D0467D1620D7F2C90055C28F /* ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift in Sources */, D041E3F61E535464008C24B4 /* AddPeerMember.swift in Sources */, diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index fbc1ac2e5f..18b1a28acf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -530,11 +530,18 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } let reactions: [(String, String, String)] = [ - ("😒", "Sad", "sad"), + ("😔", "Sad", "sad"), ("😳", "Surprised", "surprised"), ("😂", "Fun", "lol"), ("👍", "Like", "thumbsup"), ("❤", "Love", "heart"), + ("🥳", "Celebrate", "celebrate"), + ("😭", "Cry", "cry"), + ("😒", "Meh", "meh"), + ("👌", "OK", "ok"), + ("😐", "Poker", "poker"), + ("💩", "Poop", "poop"), + ("😊", "Smile", "smile") ] var reactionItems: [ReactionContextItem] = [] @@ -6971,8 +6978,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withoutSelectionState() } }) if actions.contains(3) { + let mediaBox = strongSelf.context.account.postbox.mediaBox let _ = strongSelf.context.account.postbox.transaction({ transaction -> Void in - transaction.removeAllMessagesWithAuthor(peerId, authorId: author.id, namespace: Namespaces.Message.Cloud) + deleteAllMessagesWithAuthor(transaction: transaction, mediaBox: mediaBox, peerId: peerId, authorId: author.id, namespace: Namespaces.Message.Cloud) }).start() let _ = clearAuthorHistory(account: strongSelf.context.account, peerId: peerId, memberId: author.id).start() } else if actions.contains(0) { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift index 94451cd5bd..bf13645ce6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import AccountContext private let dateFont = UIFont.italicSystemFont(ofSize: 11.0) +private let reactionCountFont = Font.semiboldItalic(11.0) private func maybeAddRotationAnimation(_ layer: CALayer, duration: Double) { if let _ = layer.animation(forKey: "clockFrameAnimation") { @@ -62,50 +63,10 @@ enum ChatMessageDateAndStatusType: Equatable { case ImageOutgoing(ChatMessageDateAndStatusOutgoingType) case FreeIncoming case FreeOutgoing(ChatMessageDateAndStatusOutgoingType) - - static func ==(lhs: ChatMessageDateAndStatusType, rhs: ChatMessageDateAndStatusType) -> Bool { - switch lhs { - case .BubbleIncoming: - if case .BubbleIncoming = rhs { - return true - } else { - return false - } - case let .BubbleOutgoing(type): - if case .BubbleOutgoing(type) = rhs { - return true - } else { - return false - } - case .ImageIncoming: - if case .ImageIncoming = rhs { - return true - } else { - return false - } - case let .ImageOutgoing(type): - if case .ImageOutgoing(type) = rhs { - return true - } else { - return false - } - case .FreeIncoming: - if case .FreeIncoming = rhs { - return true - } else { - return false - } - case let .FreeOutgoing(type): - if case .FreeOutgoing(type) = rhs { - return true - } else { - return false - } - } - } } -private let reactionSize: CGFloat = 18.0 +private let reactionSize: CGFloat = 19.0 +private let reactionFont = Font.regular(12.0) private final class StatusReactionNode: ASImageNode { let value: String @@ -120,7 +81,7 @@ private final class StatusReactionNode: ASImageNode { self.image = generateImage(CGSize(width: reactionSize, height: reactionSize), rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) UIGraphicsPushContext(context) - let string = NSAttributedString(string: value, font: Font.regular(11.0), textColor: .black) + let string = NSAttributedString(string: value, font: reactionFont, textColor: .black) string.draw(at: CGPoint(x: 1.0, y: 3.0)) UIGraphicsPopContext() }) @@ -136,6 +97,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { private let dateNode: TextNode private var impressionIcon: ASImageNode? private var reactionNodes: [StatusReactionNode] = [] + private var reactionCountNode: TextNode? private var type: ChatMessageDateAndStatusType? private var theme: ChatPresentationThemeData? @@ -166,6 +128,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let currentType = self.type let currentTheme = self.theme + let makeReactionCountLayout = TextNode.asyncLayout(self.reactionCountNode) + return { context, presentationData, edited, impressionCount, dateText, type, constrainedSize, reactions in let dateColor: UIColor var backgroundImage: UIImage? @@ -396,9 +360,20 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { backgroundInsets = UIEdgeInsets(top: 2.0, left: 7.0, bottom: 2.0, right: 7.0) } + var reactionCountLayoutAndApply: (TextNodeLayout, () -> TextNode)? + var reactionInset: CGFloat = 0.0 if !reactions.isEmpty { - reactionInset = 1.0 + CGFloat(reactions.count) * reactionSize + reactionInset = 5.0 + CGFloat(reactions.count) * reactionSize + + var count = 0 + for reaction in reactions { + count += Int(reaction.count) + } + + let layoutAndApply = makeReactionCountLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "\(count)", font: reactionCountFont, textColor: dateColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: 100.0))) + reactionInset += layoutAndApply.0.size.width + 2.0 + reactionCountLayoutAndApply = layoutAndApply } leftInset += reactionInset @@ -543,7 +518,14 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { } else { node = StatusReactionNode(value: reactions[i].value, count: Int(reactions[i].count)) if strongSelf.reactionNodes.count > i { - strongSelf.reactionNodes[i].removeFromSupernode() + let previousNode = strongSelf.reactionNodes[i] + if animated { + previousNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak previousNode] _ in + previousNode?.removeFromSupernode() + }) + } else { + previousNode.removeFromSupernode() + } strongSelf.reactionNodes[i] = node } else { strongSelf.reactionNodes.append(node) @@ -551,12 +533,44 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { } if node.supernode == nil { strongSelf.addSubnode(node) + if animated { + node.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) + } } - node.frame = CGRect(origin: CGPoint(x: reactionOffset, y: backgroundInsets.top + 1.0 + offset - 3.0), size: CGSize(width: reactionSize, height: reactionSize)) + node.frame = CGRect(origin: CGPoint(x: reactionOffset, y: backgroundInsets.top + offset - 3.0), size: CGSize(width: reactionSize, height: reactionSize)) reactionOffset += reactionSize } for _ in reactions.count ..< strongSelf.reactionNodes.count { - strongSelf.reactionNodes.removeLast().removeFromSupernode() + let node = strongSelf.reactionNodes.removeLast() + if animated { + node.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak node] _ in + node?.removeFromSupernode() + }) + } else { + node.removeFromSupernode() + } + } + + if let (layout, apply) = reactionCountLayoutAndApply { + let node = apply() + if strongSelf.reactionCountNode !== node { + strongSelf.reactionCountNode?.removeFromSupernode() + strongSelf.addSubnode(node) + strongSelf.reactionCountNode = node + if animated { + node.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) + } + } + node.frame = CGRect(origin: CGPoint(x: reactionOffset + 1, y: backgroundInsets.top + 1.0 + offset), size: layout.size) + } else if let reactionCountNode = strongSelf.reactionCountNode { + strongSelf.reactionCountNode = nil + if animated { + reactionCountNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak reactionCountNode] _ in + reactionCountNode?.removeFromSupernode() + }) + } else { + reactionCountNode.removeFromSupernode() + } } } }) diff --git a/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift b/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift index 232c40158c..e25fa61511 100644 --- a/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift +++ b/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift @@ -234,60 +234,36 @@ public final class SharedNotificationManager { title = alertTitle } } - if let locKey = alert["loc-key"] as? String { - if locKey == "SESSION_REVOKE" { - isForcedLogOut = true - } else if locKey == "PHONE_CALL_REQUEST" { - isCall = true - } else if locKey == "GEO_LIVE_PENDING" { - isLocationPolling = true - } else if locKey == "MESSAGE_MUTED" { - shouldPollState = true - } else if locKey == "MESSAGE_DELETED" { - var peerId: PeerId? - if let fromId = payload["from_id"] { - let fromIdValue = fromId as! NSString - peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: Int32(fromIdValue.intValue)) - } else if let fromId = payload["chat_id"] { - let fromIdValue = fromId as! NSString - peerId = PeerId(namespace: Namespaces.Peer.CloudGroup, id: Int32(fromIdValue.intValue)) - } else if let fromId = payload["channel_id"] { - let fromIdValue = fromId as! NSString - peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: Int32(fromIdValue.intValue)) - } - if let peerId = peerId { - if let messageIds = payload["messages"] as? String { - for messageId in messageIds.split(separator: ",") { - if let messageIdValue = Int32(messageId) { - messagesDeleted.append(MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: messageIdValue)) - } - } - } - } + } + if let locKey = payload["loc-key"] as? String { + if locKey == "SESSION_REVOKE" { + isForcedLogOut = true + } else if locKey == "PHONE_CALL_REQUEST" { + isCall = true + } else if locKey == "GEO_LIVE_PENDING" { + isLocationPolling = true + } else if locKey == "MESSAGE_MUTED" { + shouldPollState = true + } else if locKey == "MESSAGE_DELETED" { + var peerId: PeerId? + if let fromId = payload["from_id"] { + let fromIdValue = fromId as! NSString + peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: Int32(fromIdValue.intValue)) + } else if let fromId = payload["chat_id"] { + let fromIdValue = fromId as! NSString + peerId = PeerId(namespace: Namespaces.Peer.CloudGroup, id: Int32(fromIdValue.intValue)) + } else if let fromId = payload["channel_id"] { + let fromIdValue = fromId as! NSString + peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: Int32(fromIdValue.intValue)) } - let string = NSLocalizedString(locKey, comment: "") - if !string.isEmpty { - if let locArgs = alert["loc-args"] as? [AnyObject] { - var args: [CVarArg] = [] - var failed = false - for arg in locArgs { - if let arg = arg as? CVarArg { - args.append(arg) - } else { - failed = true - break + if let peerId = peerId { + if let messageIds = payload["messages"] as? String { + for messageId in messageIds.split(separator: ",") { + if let messageIdValue = Int32(messageId) { + messagesDeleted.append(MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: messageIdValue)) } } - if failed { - body = "\(string)" - } else { - body = String(format: string, arguments: args) - } - } else { - body = "\(string)" } - } else { - body = nil } } } @@ -419,7 +395,7 @@ public final class SharedNotificationManager { if !messagesDeleted.isEmpty { let _ = account.postbox.transaction(ignoreDisabled: true, { transaction -> Void in - transaction.deleteMessages(messagesDeleted) + deleteMessages(transaction: transaction, mediaBox: account.postbox.mediaBox, ids: messagesDeleted) }).start() } diff --git a/submodules/UrlEscaping/Sources/UrlEscaping.swift b/submodules/UrlEscaping/Sources/UrlEscaping.swift index a312d0e5df..9988ce64ef 100644 --- a/submodules/UrlEscaping/Sources/UrlEscaping.swift +++ b/submodules/UrlEscaping/Sources/UrlEscaping.swift @@ -1,6 +1,11 @@ import Foundation public func doesUrlMatchText(url: String, text: String) -> Bool { + for c in url { + if !c.isASCII { + return false + } + } if url == text { return true } @@ -32,7 +37,6 @@ public extension CharacterSet { } public func isValidUrl(_ url: String) -> Bool { - if let escapedUrl = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let url = URL(string: escapedUrl), ["http", "https"].contains(url.scheme), let host = url.host, host.contains(".") && url.user == nil { let components = host.components(separatedBy: ".") let domain = (components.first ?? "") From 7e2e86b395df4a09838812cb88d6c847f9ea1758 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 23 Aug 2019 20:59:41 +0400 Subject: [PATCH 28/86] Rewrite notification service in objc --- NotificationService/Api.h | 298 +++ NotificationService/Api.m | 1979 +++++++++++++++++ NotificationService/Api0.swift | 108 +- NotificationService/Attachments.h | 7 + NotificationService/Attachments.m | 30 + NotificationService/FetchImage.h | 11 + NotificationService/FetchImage.m | 195 ++ NotificationService/Info.plist | 2 +- NotificationService/NotificationService.h | 10 + NotificationService/NotificationService.m | 359 +++ NotificationService/Serialization.h | 10 + NotificationService/Serialization.m | 35 + NotificationService/StoredAccountInfos.h | 67 + NotificationService/StoredAccountInfos.m | 412 ++++ Telegram-iOS.xcodeproj/project.pbxproj | 54 +- .../xcschemes/NotificationService.xcscheme | 2 +- .../ImageRepresentationsUtils.swift | 15 +- .../NotificationContentContext.swift | 312 +-- 18 files changed, 3688 insertions(+), 218 deletions(-) create mode 100644 NotificationService/Api.h create mode 100644 NotificationService/Api.m create mode 100644 NotificationService/Attachments.h create mode 100644 NotificationService/Attachments.m create mode 100644 NotificationService/FetchImage.h create mode 100644 NotificationService/FetchImage.m create mode 100644 NotificationService/NotificationService.h create mode 100644 NotificationService/NotificationService.m create mode 100644 NotificationService/Serialization.h create mode 100644 NotificationService/Serialization.m create mode 100644 NotificationService/StoredAccountInfos.h create mode 100644 NotificationService/StoredAccountInfos.m diff --git a/NotificationService/Api.h b/NotificationService/Api.h new file mode 100644 index 0000000000..dd47051a4a --- /dev/null +++ b/NotificationService/Api.h @@ -0,0 +1,298 @@ +#import + +/* + * Layer 1 + */ + +@class Api1_Photo; +@class Api1_Photo_photoEmpty; +@class Api1_Photo_photo; + +@class Api1_PhotoSize; +@class Api1_PhotoSize_photoSizeEmpty; +@class Api1_PhotoSize_photoSize; +@class Api1_PhotoSize_photoCachedSize; +@class Api1_PhotoSize_photoStrippedSize; + +@class Api1_FileLocation; +@class Api1_FileLocation_fileLocationToBeDeprecated; + +@class Api1_DocumentAttribute; +@class Api1_DocumentAttribute_documentAttributeImageSize; +@class Api1_DocumentAttribute_documentAttributeAnimated; +@class Api1_DocumentAttribute_documentAttributeSticker; +@class Api1_DocumentAttribute_documentAttributeVideo; +@class Api1_DocumentAttribute_documentAttributeAudio; +@class Api1_DocumentAttribute_documentAttributeFilename; +@class Api1_DocumentAttribute_documentAttributeHasStickers; + +@class Api1_InputStickerSet; +@class Api1_InputStickerSet_inputStickerSetEmpty; +@class Api1_InputStickerSet_inputStickerSetID; +@class Api1_InputStickerSet_inputStickerSetShortName; + +@class Api1_InputFileLocation; +@class Api1_InputFileLocation_inputPhotoFileLocation; +@class Api1_InputFileLocation_inputDocumentFileLocation; + +@class Api1_MaskCoords; +@class Api1_MaskCoords_maskCoords; + +@class Api1_Document; +@class Api1_Document_document; + + +@interface Api1__Environment : NSObject + ++ (NSData *)serializeObject:(id)object; ++ (id)parseObject:(NSData *)data; + +@end + +@interface Api1_FunctionContext : NSObject + +@property (nonatomic, strong, readonly) NSData *payload; +@property (nonatomic, copy, readonly) id (^responseParser)(NSData *); +@property (nonatomic, strong, readonly) id metadata; + +- (instancetype)initWithPayload:(NSData *)payload responseParser:(id (^)(NSData *))responseParser metadata:(id)metadata; + +@end + +/* + * Types 1 + */ + +@interface Api1_Photo : NSObject + +@property (nonatomic, strong, readonly) NSNumber * pid; + ++ (Api1_Photo_photoEmpty *)photoEmptyWithPid:(NSNumber *)pid; ++ (Api1_Photo_photo *)photoWithFlags:(NSNumber *)flags pid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference date:(NSNumber *)date sizes:(NSArray *)sizes dcId:(NSNumber *)dcId; + +@end + +@interface Api1_Photo_photoEmpty : Api1_Photo + +@end + +@interface Api1_Photo_photo : Api1_Photo + +@property (nonatomic, strong, readonly) NSNumber * flags; +@property (nonatomic, strong, readonly) NSNumber * accessHash; +@property (nonatomic, strong, readonly) NSData * fileReference; +@property (nonatomic, strong, readonly) NSNumber * date; +@property (nonatomic, strong, readonly) NSArray * sizes; +@property (nonatomic, strong, readonly) NSNumber * dcId; + +@end + + +@interface Api1_PhotoSize : NSObject + +@property (nonatomic, strong, readonly) NSString * type; + ++ (Api1_PhotoSize_photoSizeEmpty *)photoSizeEmptyWithType:(NSString *)type; ++ (Api1_PhotoSize_photoSize *)photoSizeWithType:(NSString *)type location:(Api1_FileLocation *)location w:(NSNumber *)w h:(NSNumber *)h size:(NSNumber *)size; ++ (Api1_PhotoSize_photoCachedSize *)photoCachedSizeWithType:(NSString *)type location:(Api1_FileLocation *)location w:(NSNumber *)w h:(NSNumber *)h bytes:(NSData *)bytes; ++ (Api1_PhotoSize_photoStrippedSize *)photoStrippedSizeWithType:(NSString *)type bytes:(NSData *)bytes; + +@end + +@interface Api1_PhotoSize_photoSizeEmpty : Api1_PhotoSize + +@end + +@interface Api1_PhotoSize_photoSize : Api1_PhotoSize + +@property (nonatomic, strong, readonly) Api1_FileLocation * location; +@property (nonatomic, strong, readonly) NSNumber * w; +@property (nonatomic, strong, readonly) NSNumber * h; +@property (nonatomic, strong, readonly) NSNumber * size; + +@end + +@interface Api1_PhotoSize_photoCachedSize : Api1_PhotoSize + +@property (nonatomic, strong, readonly) Api1_FileLocation * location; +@property (nonatomic, strong, readonly) NSNumber * w; +@property (nonatomic, strong, readonly) NSNumber * h; +@property (nonatomic, strong, readonly) NSData * bytes; + +@end + +@interface Api1_PhotoSize_photoStrippedSize : Api1_PhotoSize + +@property (nonatomic, strong, readonly) NSData * bytes; + +@end + + +@interface Api1_FileLocation : NSObject + +@property (nonatomic, strong, readonly) NSNumber * volumeId; +@property (nonatomic, strong, readonly) NSNumber * localId; + ++ (Api1_FileLocation_fileLocationToBeDeprecated *)fileLocationToBeDeprecatedWithVolumeId:(NSNumber *)volumeId localId:(NSNumber *)localId; + +@end + +@interface Api1_FileLocation_fileLocationToBeDeprecated : Api1_FileLocation + +@end + + +@interface Api1_DocumentAttribute : NSObject + ++ (Api1_DocumentAttribute_documentAttributeImageSize *)documentAttributeImageSizeWithW:(NSNumber *)w h:(NSNumber *)h; ++ (Api1_DocumentAttribute_documentAttributeAnimated *)documentAttributeAnimated; ++ (Api1_DocumentAttribute_documentAttributeSticker *)documentAttributeStickerWithFlags:(NSNumber *)flags alt:(NSString *)alt stickerset:(Api1_InputStickerSet *)stickerset maskCoords:(Api1_MaskCoords *)maskCoords; ++ (Api1_DocumentAttribute_documentAttributeVideo *)documentAttributeVideoWithFlags:(NSNumber *)flags duration:(NSNumber *)duration w:(NSNumber *)w h:(NSNumber *)h; ++ (Api1_DocumentAttribute_documentAttributeAudio *)documentAttributeAudioWithFlags:(NSNumber *)flags duration:(NSNumber *)duration title:(NSString *)title performer:(NSString *)performer waveform:(NSData *)waveform; ++ (Api1_DocumentAttribute_documentAttributeFilename *)documentAttributeFilenameWithFileName:(NSString *)fileName; ++ (Api1_DocumentAttribute_documentAttributeHasStickers *)documentAttributeHasStickers; + +@end + +@interface Api1_DocumentAttribute_documentAttributeImageSize : Api1_DocumentAttribute + +@property (nonatomic, strong, readonly) NSNumber * w; +@property (nonatomic, strong, readonly) NSNumber * h; + +@end + +@interface Api1_DocumentAttribute_documentAttributeAnimated : Api1_DocumentAttribute + +@end + +@interface Api1_DocumentAttribute_documentAttributeSticker : Api1_DocumentAttribute + +@property (nonatomic, strong, readonly) NSNumber * flags; +@property (nonatomic, strong, readonly) NSString * alt; +@property (nonatomic, strong, readonly) Api1_InputStickerSet * stickerset; +@property (nonatomic, strong, readonly) Api1_MaskCoords * maskCoords; + +@end + +@interface Api1_DocumentAttribute_documentAttributeVideo : Api1_DocumentAttribute + +@property (nonatomic, strong, readonly) NSNumber * flags; +@property (nonatomic, strong, readonly) NSNumber * duration; +@property (nonatomic, strong, readonly) NSNumber * w; +@property (nonatomic, strong, readonly) NSNumber * h; + +@end + +@interface Api1_DocumentAttribute_documentAttributeAudio : Api1_DocumentAttribute + +@property (nonatomic, strong, readonly) NSNumber * flags; +@property (nonatomic, strong, readonly) NSNumber * duration; +@property (nonatomic, strong, readonly) NSString * title; +@property (nonatomic, strong, readonly) NSString * performer; +@property (nonatomic, strong, readonly) NSData * waveform; + +@end + +@interface Api1_DocumentAttribute_documentAttributeFilename : Api1_DocumentAttribute + +@property (nonatomic, strong, readonly) NSString * fileName; + +@end + +@interface Api1_DocumentAttribute_documentAttributeHasStickers : Api1_DocumentAttribute + +@end + + +@interface Api1_InputStickerSet : NSObject + ++ (Api1_InputStickerSet_inputStickerSetEmpty *)inputStickerSetEmpty; ++ (Api1_InputStickerSet_inputStickerSetID *)inputStickerSetIDWithPid:(NSNumber *)pid accessHash:(NSNumber *)accessHash; ++ (Api1_InputStickerSet_inputStickerSetShortName *)inputStickerSetShortNameWithShortName:(NSString *)shortName; + +@end + +@interface Api1_InputStickerSet_inputStickerSetEmpty : Api1_InputStickerSet + +@end + +@interface Api1_InputStickerSet_inputStickerSetID : Api1_InputStickerSet + +@property (nonatomic, strong, readonly) NSNumber * pid; +@property (nonatomic, strong, readonly) NSNumber * accessHash; + +@end + +@interface Api1_InputStickerSet_inputStickerSetShortName : Api1_InputStickerSet + +@property (nonatomic, strong, readonly) NSString * shortName; + +@end + + +@interface Api1_InputFileLocation : NSObject + +@property (nonatomic, strong, readonly) NSNumber * pid; +@property (nonatomic, strong, readonly) NSNumber * accessHash; +@property (nonatomic, strong, readonly) NSData * fileReference; +@property (nonatomic, strong, readonly) NSString * thumbSize; + ++ (Api1_InputFileLocation_inputPhotoFileLocation *)inputPhotoFileLocationWithPid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference thumbSize:(NSString *)thumbSize; ++ (Api1_InputFileLocation_inputDocumentFileLocation *)inputDocumentFileLocationWithPid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference thumbSize:(NSString *)thumbSize; + +@end + +@interface Api1_InputFileLocation_inputPhotoFileLocation : Api1_InputFileLocation + +@end + +@interface Api1_InputFileLocation_inputDocumentFileLocation : Api1_InputFileLocation + +@end + + +@interface Api1_MaskCoords : NSObject + +@property (nonatomic, strong, readonly) NSNumber * n; +@property (nonatomic, strong, readonly) NSNumber * x; +@property (nonatomic, strong, readonly) NSNumber * y; +@property (nonatomic, strong, readonly) NSNumber * zoom; + ++ (Api1_MaskCoords_maskCoords *)maskCoordsWithN:(NSNumber *)n x:(NSNumber *)x y:(NSNumber *)y zoom:(NSNumber *)zoom; + +@end + +@interface Api1_MaskCoords_maskCoords : Api1_MaskCoords + +@end + + +@interface Api1_Document : NSObject + +@property (nonatomic, strong, readonly) NSNumber * flags; +@property (nonatomic, strong, readonly) NSNumber * pid; +@property (nonatomic, strong, readonly) NSNumber * accessHash; +@property (nonatomic, strong, readonly) NSData * fileReference; +@property (nonatomic, strong, readonly) NSNumber * date; +@property (nonatomic, strong, readonly) NSString * mimeType; +@property (nonatomic, strong, readonly) NSNumber * size; +@property (nonatomic, strong, readonly) NSArray * thumbs; +@property (nonatomic, strong, readonly) NSNumber * dcId; +@property (nonatomic, strong, readonly) NSArray * attributes; + ++ (Api1_Document_document *)documentWithFlags:(NSNumber *)flags pid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference date:(NSNumber *)date mimeType:(NSString *)mimeType size:(NSNumber *)size thumbs:(NSArray *)thumbs dcId:(NSNumber *)dcId attributes:(NSArray *)attributes; + +@end + +@interface Api1_Document_document : Api1_Document + +@end + + +/* + * Functions 1 + */ + +@interface Api1: NSObject + +@end diff --git a/NotificationService/Api.m b/NotificationService/Api.m new file mode 100644 index 0000000000..e57d131ce8 --- /dev/null +++ b/NotificationService/Api.m @@ -0,0 +1,1979 @@ +#import "Api.h" +#import + +static const char *Api1__Serializer_Key = "Api1__Serializer"; + +@interface Api1__Number : NSNumber +{ + NSNumber *_value; +} + +@end + +@implementation Api1__Number + +- (instancetype)initWithNumber:(NSNumber *)number +{ + self = [super init]; + if (self != nil) + { + _value = number; + } + return self; +} + +- (char)charValue +{ + return [_value charValue]; +} + +- (unsigned char)unsignedCharValue +{ + return [_value unsignedCharValue]; +} + +- (short)shortValue +{ + return [_value shortValue]; +} + +- (unsigned short)unsignedShortValue +{ + return [_value unsignedShortValue]; +} + +- (int)intValue +{ + return [_value intValue]; +} + +- (unsigned int)unsignedIntValue +{ + return [_value unsignedIntValue]; +} + +- (long)longValue +{ + return [_value longValue]; +} + +- (unsigned long)unsignedLongValue +{ + return [_value unsignedLongValue]; +} + +- (long long)longLongValue +{ + return [_value longLongValue]; +} + +- (unsigned long long)unsignedLongLongValue +{ + return [_value unsignedLongLongValue]; +} + +- (float)floatValue +{ + return [_value floatValue]; +} + +- (double)doubleValue +{ + return [_value doubleValue]; +} + +- (BOOL)boolValue +{ + return [_value boolValue]; +} + +- (NSInteger)integerValue +{ + return [_value integerValue]; +} + +- (NSUInteger)unsignedIntegerValue +{ + return [_value unsignedIntegerValue]; +} + +- (NSString *)stringValue +{ + return [_value stringValue]; +} + +- (NSComparisonResult)compare:(NSNumber *)otherNumber +{ + return [_value compare:otherNumber]; +} + +- (BOOL)isEqualToNumber:(NSNumber *)number +{ + return [_value isEqualToNumber:number]; +} + +- (NSString *)descriptionWithLocale:(id)locale +{ + return [_value descriptionWithLocale:locale]; +} + +- (void)getValue:(void *)value +{ + [_value getValue:value]; +} + +- (const char *)objCType +{ + return [_value objCType]; +} + +- (NSUInteger)hash +{ + return [_value hash]; +} + +- (instancetype)copyWithZone:(NSZone *)__unused zone +{ + return self; +} + +@end + +@interface Api1__Serializer : NSObject + +@property (nonatomic) int32_t constructorSignature; +@property (nonatomic, copy) bool (^serializeBlock)(id object, NSMutableData *); + +@end + +@implementation Api1__Serializer + +- (instancetype)initWithConstructorSignature:(int32_t)constructorSignature serializeBlock:(bool (^)(id, NSMutableData *))serializeBlock +{ + self = [super init]; + if (self != nil) + { + self.constructorSignature = constructorSignature; + self.serializeBlock = serializeBlock; + } + return self; +} + ++ (id)addSerializerToObject:(id)object withConstructorSignature:(int32_t)constructorSignature serializeBlock:(bool (^)(id, NSMutableData *))serializeBlock +{ + if (object != nil) + objc_setAssociatedObject(object, Api1__Serializer_Key, [[Api1__Serializer alloc] initWithConstructorSignature:constructorSignature serializeBlock:serializeBlock], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return object; +} + ++ (id)addSerializerToObject:(id)object serializer:(Api1__Serializer *)serializer +{ + if (object != nil) + objc_setAssociatedObject(object, Api1__Serializer_Key, serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return object; +} + +@end + +@interface Api1__UnboxedTypeMetaInfo : NSObject + +@property (nonatomic, readonly) int32_t constructorSignature; + +@end + +@implementation Api1__UnboxedTypeMetaInfo + +- (instancetype)initWithConstructorSignature:(int32_t)constructorSignature +{ + self = [super init]; + if (self != nil) + { + _constructorSignature = constructorSignature; + } + return self; +} + +@end + +@interface Api1__PreferNSDataTypeMetaInfo : NSObject + +@end + +@implementation Api1__PreferNSDataTypeMetaInfo + ++ (instancetype)preferNSDataTypeMetaInfo +{ + static Api1__PreferNSDataTypeMetaInfo *instance = nil; + static dispatch_once_t t; + dispatch_once(&t, ^ + { + instance = [[Api1__PreferNSDataTypeMetaInfo alloc] init]; + }); + return instance; +} + +@end + +@interface Api1__BoxedTypeMetaInfo : NSObject + +@end + +@implementation Api1__BoxedTypeMetaInfo + ++ (instancetype)boxedTypeMetaInfo +{ + static Api1__BoxedTypeMetaInfo *instance = nil; + static dispatch_once_t t; + dispatch_once(&t, ^ + { + instance = [[Api1__BoxedTypeMetaInfo alloc] init]; + }); + return instance; +} + +@end + +@implementation Api1__Environment + ++ (id (^)(NSData *data, NSUInteger *offset, id metaInfo))parserByConstructorSignature:(int32_t)constructorSignature +{ + static NSMutableDictionary *parsers = nil; + static dispatch_once_t t; + dispatch_once(&t, ^ + { + parsers = [[NSMutableDictionary alloc] init]; + + parsers[@((int32_t)0xA8509BDA)] = [^id (NSData *data, NSUInteger *offset, __unused id metaInfo) + { + if (*offset + 4 > data.length) + return nil; + int32_t value = 0; + [data getBytes:(void *)&value range:NSMakeRange(*offset, 4)]; + *offset += 4; + return @(value); + } copy]; + + parsers[@((int32_t)0x22076CBA)] = [^id (NSData *data, NSUInteger *offset, __unused id metaInfo) + { + if (*offset + 8 > data.length) + return nil; + int64_t value = 0; + [data getBytes:(void *)&value range:NSMakeRange(*offset, 8)]; + *offset += 8; + return @(value); + } copy]; + + parsers[@((int32_t)0x2210C154)] = [^id (NSData *data, NSUInteger *offset, __unused id metaInfo) + { + if (*offset + 8 > data.length) + return nil; + double value = 0; + [data getBytes:(void *)&value range:NSMakeRange(*offset, 8)]; + *offset += 8; + return @(value); + } copy]; + + parsers[@((int32_t)0xB5286E24)] = [^id (NSData *data, NSUInteger *offset, __unused id metaInfo) + { + if (*offset + 1 > data.length) + return nil; + uint8_t tmp = 0; + [data getBytes:(void *)&tmp range:NSMakeRange(*offset, 1)]; + *offset += 1; + + int paddingBytes = 0; + + int32_t length = tmp; + if (length == 254) + { + length = 0; + if (*offset + 3 > data.length) + return nil; + [data getBytes:((uint8_t *)&length) + 1 range:NSMakeRange(*offset, 3)]; + *offset += 3; + length >>= 8; + + paddingBytes = (((length % 4) == 0 ? length : (length + 4 - (length % 4)))) - length; + } + else + paddingBytes = ((((length + 1) % 4) == 0 ? (length + 1) : ((length + 1) + 4 - ((length + 1) % 4)))) - (length + 1); + + bool isData = [metaInfo isKindOfClass:[Api1__PreferNSDataTypeMetaInfo class]]; + id object = nil; + + if (length > 0) + { + if (*offset + length > data.length) + return nil; + if (isData) + object = [[NSData alloc] initWithBytes:((uint8_t *)data.bytes) + *offset length:length]; + else + object = [[NSString alloc] initWithBytes:((uint8_t *)data.bytes) + *offset length:length encoding:NSUTF8StringEncoding]; + + *offset += length; + } + + *offset += paddingBytes; + + return object == nil ? (isData ? [NSData data] : @"") : object; + } copy]; + + parsers[@((int32_t)0x1cb5c415)] = [^id (NSData *data, NSUInteger *offset, id metaInfo) + { + if (*offset + 4 > data.length) + return nil; + + int32_t count = 0; + [data getBytes:(void *)&count range:NSMakeRange(*offset, 4)]; + *offset += 4; + + if (count < 0) + return nil; + + bool isBoxed = false; + int32_t unboxedConstructorSignature = 0; + if ([metaInfo isKindOfClass:[Api1__BoxedTypeMetaInfo class]]) + isBoxed = true; + else if ([metaInfo isKindOfClass:[Api1__UnboxedTypeMetaInfo class]]) + unboxedConstructorSignature = ((Api1__UnboxedTypeMetaInfo *)metaInfo).constructorSignature; + else + return nil; + + NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:(NSUInteger)count]; + for (int32_t i = 0; i < count; i++) + { + int32_t itemConstructorSignature = 0; + if (isBoxed) + { + if (*offset + 4 > data.length) + return nil; + [data getBytes:(void *)&itemConstructorSignature range:NSMakeRange(*offset, 4)]; + *offset += 4; + } + else + itemConstructorSignature = unboxedConstructorSignature; + id item = [Api1__Environment parseObject:data offset:offset implicitSignature:itemConstructorSignature metaInfo:nil]; + if (item == nil) + return nil; + + [array addObject:item]; + } + + return array; + } copy]; + + parsers[@((int32_t)0x2331b22d)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * pid = nil; + if ((pid = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + return [Api1_Photo photoEmptyWithPid:pid]; + } copy]; + parsers[@((int32_t)0xd07504a5)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * flags = nil; + if ((flags = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * pid = nil; + if ((pid = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSNumber * accessHash = nil; + if ((accessHash = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSData * fileReference = nil; + if ((fileReference = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:[Api1__PreferNSDataTypeMetaInfo preferNSDataTypeMetaInfo]]) == nil) + return nil; + NSNumber * date = nil; + if ((date = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSArray * sizes = nil; + int32_t sizes_signature = 0; [_data getBytes:(void *)&sizes_signature range:NSMakeRange(*_offset, 4)]; *_offset += 4; + if ((sizes = [Api1__Environment parseObject:_data offset:_offset implicitSignature:sizes_signature metaInfo:[Api1__BoxedTypeMetaInfo boxedTypeMetaInfo]]) == nil) + return nil; + NSNumber * dcId = nil; + if ((dcId = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + return [Api1_Photo photoWithFlags:flags pid:pid accessHash:accessHash fileReference:fileReference date:date sizes:sizes dcId:dcId]; + } copy]; + parsers[@((int32_t)0xe17e23c)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSString * type = nil; + if ((type = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + return [Api1_PhotoSize photoSizeEmptyWithType:type]; + } copy]; + parsers[@((int32_t)0x77bfb61b)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSString * type = nil; + if ((type = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + Api1_FileLocation * location = nil; + int32_t location_signature = 0; [_data getBytes:(void *)&location_signature range:NSMakeRange(*_offset, 4)]; *_offset += 4; + if ((location = [Api1__Environment parseObject:_data offset:_offset implicitSignature:location_signature metaInfo:nil]) == nil) + return nil; + NSNumber * w = nil; + if ((w = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * h = nil; + if ((h = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * size = nil; + if ((size = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + return [Api1_PhotoSize photoSizeWithType:type location:location w:w h:h size:size]; + } copy]; + parsers[@((int32_t)0xe9a734fa)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSString * type = nil; + if ((type = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + Api1_FileLocation * location = nil; + int32_t location_signature = 0; [_data getBytes:(void *)&location_signature range:NSMakeRange(*_offset, 4)]; *_offset += 4; + if ((location = [Api1__Environment parseObject:_data offset:_offset implicitSignature:location_signature metaInfo:nil]) == nil) + return nil; + NSNumber * w = nil; + if ((w = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * h = nil; + if ((h = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSData * bytes = nil; + if ((bytes = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:[Api1__PreferNSDataTypeMetaInfo preferNSDataTypeMetaInfo]]) == nil) + return nil; + return [Api1_PhotoSize photoCachedSizeWithType:type location:location w:w h:h bytes:bytes]; + } copy]; + parsers[@((int32_t)0xe0b0bc2e)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSString * type = nil; + if ((type = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + NSData * bytes = nil; + if ((bytes = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:[Api1__PreferNSDataTypeMetaInfo preferNSDataTypeMetaInfo]]) == nil) + return nil; + return [Api1_PhotoSize photoStrippedSizeWithType:type bytes:bytes]; + } copy]; + parsers[@((int32_t)0xbc7fc6cd)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * volumeId = nil; + if ((volumeId = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSNumber * localId = nil; + if ((localId = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + return [Api1_FileLocation fileLocationToBeDeprecatedWithVolumeId:volumeId localId:localId]; + } copy]; + parsers[@((int32_t)0x6c37c15c)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * w = nil; + if ((w = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * h = nil; + if ((h = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + return [Api1_DocumentAttribute documentAttributeImageSizeWithW:w h:h]; + } copy]; + parsers[@((int32_t)0x11b58939)] = [^id (__unused NSData *_data, __unused NSUInteger* _offset, __unused id metaInfo) + { + return [Api1_DocumentAttribute documentAttributeAnimated]; + } copy]; + parsers[@((int32_t)0x6319d612)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * flags = nil; + if ((flags = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSString * alt = nil; + if ((alt = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + Api1_InputStickerSet * stickerset = nil; + int32_t stickerset_signature = 0; [_data getBytes:(void *)&stickerset_signature range:NSMakeRange(*_offset, 4)]; *_offset += 4; + if ((stickerset = [Api1__Environment parseObject:_data offset:_offset implicitSignature:stickerset_signature metaInfo:nil]) == nil) + return nil; + Api1_MaskCoords * maskCoords = nil; + if (flags != nil && ([flags intValue] & (1 << 0))) { + int32_t maskCoords_signature = 0; [_data getBytes:(void *)&maskCoords_signature range:NSMakeRange(*_offset, 4)]; *_offset += 4; + if ((maskCoords = [Api1__Environment parseObject:_data offset:_offset implicitSignature:maskCoords_signature metaInfo:nil]) == nil) + return nil; + } + return [Api1_DocumentAttribute documentAttributeStickerWithFlags:flags alt:alt stickerset:stickerset maskCoords:maskCoords]; + } copy]; + parsers[@((int32_t)0xef02ce6)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * flags = nil; + if ((flags = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * duration = nil; + if ((duration = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * w = nil; + if ((w = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * h = nil; + if ((h = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + return [Api1_DocumentAttribute documentAttributeVideoWithFlags:flags duration:duration w:w h:h]; + } copy]; + parsers[@((int32_t)0x9852f9c6)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * flags = nil; + if ((flags = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * duration = nil; + if ((duration = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSString * title = nil; + if (flags != nil && ([flags intValue] & (1 << 0))) { + if ((title = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + } + NSString * performer = nil; + if (flags != nil && ([flags intValue] & (1 << 1))) { + if ((performer = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + } + NSData * waveform = nil; + if (flags != nil && ([flags intValue] & (1 << 2))) { + if ((waveform = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:[Api1__PreferNSDataTypeMetaInfo preferNSDataTypeMetaInfo]]) == nil) + return nil; + } + return [Api1_DocumentAttribute documentAttributeAudioWithFlags:flags duration:duration title:title performer:performer waveform:waveform]; + } copy]; + parsers[@((int32_t)0x15590068)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSString * fileName = nil; + if ((fileName = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + return [Api1_DocumentAttribute documentAttributeFilenameWithFileName:fileName]; + } copy]; + parsers[@((int32_t)0x9801d2f7)] = [^id (__unused NSData *_data, __unused NSUInteger* _offset, __unused id metaInfo) + { + return [Api1_DocumentAttribute documentAttributeHasStickers]; + } copy]; + parsers[@((int32_t)0xffb62b95)] = [^id (__unused NSData *_data, __unused NSUInteger* _offset, __unused id metaInfo) + { + return [Api1_InputStickerSet inputStickerSetEmpty]; + } copy]; + parsers[@((int32_t)0x9de7a269)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * pid = nil; + if ((pid = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSNumber * accessHash = nil; + if ((accessHash = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + return [Api1_InputStickerSet inputStickerSetIDWithPid:pid accessHash:accessHash]; + } copy]; + parsers[@((int32_t)0x861cc8a0)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSString * shortName = nil; + if ((shortName = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + return [Api1_InputStickerSet inputStickerSetShortNameWithShortName:shortName]; + } copy]; + parsers[@((int32_t)0x40181ffe)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * pid = nil; + if ((pid = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSNumber * accessHash = nil; + if ((accessHash = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSData * fileReference = nil; + if ((fileReference = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:[Api1__PreferNSDataTypeMetaInfo preferNSDataTypeMetaInfo]]) == nil) + return nil; + NSString * thumbSize = nil; + if ((thumbSize = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + return [Api1_InputFileLocation inputPhotoFileLocationWithPid:pid accessHash:accessHash fileReference:fileReference thumbSize:thumbSize]; + } copy]; + parsers[@((int32_t)0xbad07584)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * pid = nil; + if ((pid = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSNumber * accessHash = nil; + if ((accessHash = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSData * fileReference = nil; + if ((fileReference = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:[Api1__PreferNSDataTypeMetaInfo preferNSDataTypeMetaInfo]]) == nil) + return nil; + NSString * thumbSize = nil; + if ((thumbSize = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + return [Api1_InputFileLocation inputDocumentFileLocationWithPid:pid accessHash:accessHash fileReference:fileReference thumbSize:thumbSize]; + } copy]; + parsers[@((int32_t)0xaed6dbb2)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * n = nil; + if ((n = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * x = nil; + if ((x = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x2210c154 metaInfo:nil]) == nil) + return nil; + NSNumber * y = nil; + if ((y = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x2210c154 metaInfo:nil]) == nil) + return nil; + NSNumber * zoom = nil; + if ((zoom = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x2210c154 metaInfo:nil]) == nil) + return nil; + return [Api1_MaskCoords maskCoordsWithN:n x:x y:y zoom:zoom]; + } copy]; + parsers[@((int32_t)0x9ba29cc1)] = [^id (NSData *_data, NSUInteger* _offset, __unused id metaInfo) + { + NSNumber * flags = nil; + if ((flags = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSNumber * pid = nil; + if ((pid = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSNumber * accessHash = nil; + if ((accessHash = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0x22076cba metaInfo:nil]) == nil) + return nil; + NSData * fileReference = nil; + if ((fileReference = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:[Api1__PreferNSDataTypeMetaInfo preferNSDataTypeMetaInfo]]) == nil) + return nil; + NSNumber * date = nil; + if ((date = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSString * mimeType = nil; + if ((mimeType = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xb5286e24 metaInfo:nil]) == nil) + return nil; + NSNumber * size = nil; + if ((size = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSArray * thumbs = nil; + if (flags != nil && ([flags intValue] & (1 << 0))) { + int32_t thumbs_signature = 0; [_data getBytes:(void *)&thumbs_signature range:NSMakeRange(*_offset, 4)]; *_offset += 4; + if ((thumbs = [Api1__Environment parseObject:_data offset:_offset implicitSignature:thumbs_signature metaInfo:[Api1__BoxedTypeMetaInfo boxedTypeMetaInfo]]) == nil) + return nil; + } + NSNumber * dcId = nil; + if ((dcId = [Api1__Environment parseObject:_data offset:_offset implicitSignature:(int32_t)0xa8509bda metaInfo:nil]) == nil) + return nil; + NSArray * attributes = nil; + int32_t attributes_signature = 0; [_data getBytes:(void *)&attributes_signature range:NSMakeRange(*_offset, 4)]; *_offset += 4; + if ((attributes = [Api1__Environment parseObject:_data offset:_offset implicitSignature:attributes_signature metaInfo:[Api1__BoxedTypeMetaInfo boxedTypeMetaInfo]]) == nil) + return nil; + return [Api1_Document documentWithFlags:flags pid:pid accessHash:accessHash fileReference:fileReference date:date mimeType:mimeType size:size thumbs:thumbs dcId:dcId attributes:attributes]; + } copy]; +}); + + return parsers[@(constructorSignature)]; +} + ++ (NSData *)serializeObject:(id)object +{ + NSMutableData *data = [[NSMutableData alloc] init]; + if ([self serializeObject:object data:data addSignature:true]) + return data; + return nil; +} + ++ (bool)serializeObject:(id)object data:(NSMutableData *)data addSignature:(bool)addSignature +{ + Api1__Serializer *serializer = objc_getAssociatedObject(object, Api1__Serializer_Key); + if (serializer == nil) + return false; + if (addSignature) + { + int32_t value = serializer.constructorSignature; + [data appendBytes:(void *)&value length:4]; + } + return serializer.serializeBlock(object, data); +} + ++ (id)parseObject:(NSData *)data +{ + if (data.length < 4) + return nil; + int32_t constructorSignature = 0; + [data getBytes:(void *)&constructorSignature length:4]; + NSUInteger offset = 4; + return [self parseObject:data offset:&offset implicitSignature:constructorSignature metaInfo:nil]; +} + ++ (id)parseObject:(NSData *)data offset:(NSUInteger *)offset implicitSignature:(int32_t)implicitSignature metaInfo:(id)metaInfo +{ + id (^parser)(NSData *data, NSUInteger *offset, id metaInfo) = [self parserByConstructorSignature:implicitSignature]; + if (parser) + return parser(data, offset, metaInfo); + return nil; +} + +@end + +@interface Api1_BuiltinSerializer_Int : Api1__Serializer +@end + +@implementation Api1_BuiltinSerializer_Int + +- (instancetype)init +{ + return [super initWithConstructorSignature:(int32_t)0xA8509BDA serializeBlock:^bool (NSNumber *object, NSMutableData *data) + { + int32_t value = (int32_t)[object intValue]; + [data appendBytes:(void *)&value length:4]; + return true; + }]; +} + +@end + +@interface Api1_BuiltinSerializer_Long : Api1__Serializer +@end + +@implementation Api1_BuiltinSerializer_Long + +- (instancetype)init +{ + return [super initWithConstructorSignature:(int32_t)0x22076CBA serializeBlock:^bool (NSNumber *object, NSMutableData *data) + { + int64_t value = (int64_t)[object longLongValue]; + [data appendBytes:(void *)&value length:8]; + return true; + }]; +} + +@end + +@interface Api1_BuiltinSerializer_Double : Api1__Serializer +@end + +@implementation Api1_BuiltinSerializer_Double + +- (instancetype)init +{ + return [super initWithConstructorSignature:(int32_t)0x2210C154 serializeBlock:^bool (NSNumber *object, NSMutableData *data) + { + double value = (double)[object doubleValue]; + [data appendBytes:(void *)&value length:8]; + return true; + }]; +} + +@end + +@interface Api1_BuiltinSerializer_String : Api1__Serializer +@end + +@implementation Api1_BuiltinSerializer_String + +- (instancetype)init +{ + return [super initWithConstructorSignature:(int32_t)0xB5286E24 serializeBlock:^bool (NSString *object, NSMutableData *data) + { + NSData *value = [object dataUsingEncoding:NSUTF8StringEncoding]; + int32_t length = value.length; + int32_t padding = 0; + if (length >= 254) + { + uint8_t tmp = 254; + [data appendBytes:&tmp length:1]; + [data appendBytes:(void *)&length length:3]; + padding = (((length % 4) == 0 ? length : (length + 4 - (length % 4)))) - length; + } + else + { + [data appendBytes:(void *)&length length:1]; + padding = ((((length + 1) % 4) == 0 ? (length + 1) : ((length + 1) + 4 - ((length + 1) % 4)))) - (length + 1); + } + [data appendData:value]; + for (int i = 0; i < padding; i++) + { + uint8_t tmp = 0; + [data appendBytes:(void *)&tmp length:1]; + } + + return true; + }]; +} + +@end + +@interface Api1_BuiltinSerializer_Bytes : Api1__Serializer +@end + +@implementation Api1_BuiltinSerializer_Bytes + +- (instancetype)init +{ + return [super initWithConstructorSignature:(int32_t)0xB5286E24 serializeBlock:^bool (NSData *object, NSMutableData *data) + { + NSData *value = object; + int32_t length = (int32_t)value.length; + int32_t padding = 0; + if (length >= 254) + { + uint8_t tmp = 254; + [data appendBytes:&tmp length:1]; + [data appendBytes:(void *)&length length:3]; + padding = (((length % 4) == 0 ? length : (length + 4 - (length % 4)))) - length; + } + else + { + [data appendBytes:(void *)&length length:1]; + padding = ((((length + 1) % 4) == 0 ? (length + 1) : ((length + 1) + 4 - ((length + 1) % 4)))) - (length + 1); + } + [data appendData:value]; + for (int i = 0; i < padding; i++) + { + uint8_t tmp = 0; + [data appendBytes:(void *)&tmp length:1]; + } + + return true; + }]; +} + +@end + +@interface Api1_BuiltinSerializer_Int128 : Api1__Serializer +@end + +@implementation Api1_BuiltinSerializer_Int128 + +- (instancetype)init +{ + return [super initWithConstructorSignature:(int32_t)0x4BB5362B serializeBlock:^bool (NSData *object, NSMutableData *data) + { + if (object.length != 16) + return false; + [data appendData:object]; + return true; + }]; +} + +@end + +@interface Api1_BuiltinSerializer_Int256 : Api1__Serializer +@end + +@implementation Api1_BuiltinSerializer_Int256 + +- (instancetype)init +{ + return [super initWithConstructorSignature:(int32_t)0x0929C32F serializeBlock:^bool (NSData *object, NSMutableData *data) + { + if (object.length != 32) + return false; + [data appendData:object]; + return true; + }]; +} + +@end + + + +@implementation Api1_FunctionContext + +- (instancetype)initWithPayload:(NSData *)payload responseParser:(id (^)(NSData *))responseParser metadata:(id)metadata +{ + self = [super init]; + if (self != nil) + { + _payload = payload; + _responseParser = [responseParser copy]; + _metadata = metadata; + } + return self; +} + +@end + +@interface Api1_Photo () + +@property (nonatomic, strong) NSNumber * pid; + +@end + +@interface Api1_Photo_photoEmpty () + +@end + +@interface Api1_Photo_photo () + +@property (nonatomic, strong) NSNumber * flags; +@property (nonatomic, strong) NSNumber * accessHash; +@property (nonatomic, strong) NSData * fileReference; +@property (nonatomic, strong) NSNumber * date; +@property (nonatomic, strong) NSArray * sizes; +@property (nonatomic, strong) NSNumber * dcId; + +@end + +@implementation Api1_Photo + ++ (Api1_Photo_photoEmpty *)photoEmptyWithPid:(NSNumber *)pid +{ + Api1_Photo_photoEmpty *_object = [[Api1_Photo_photoEmpty alloc] init]; + _object.pid = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:pid] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + return _object; +} + ++ (Api1_Photo_photo *)photoWithFlags:(NSNumber *)flags pid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference date:(NSNumber *)date sizes:(NSArray *)sizes dcId:(NSNumber *)dcId +{ + Api1_Photo_photo *_object = [[Api1_Photo_photo alloc] init]; + _object.flags = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:flags] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.pid = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:pid] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.accessHash = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:accessHash] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.fileReference = [Api1__Serializer addSerializerToObject:[fileReference copy] serializer:[[Api1_BuiltinSerializer_Bytes alloc] init]]; + _object.date = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:date] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.sizes = +({ +NSMutableArray *sizes_copy = [[NSMutableArray alloc] initWithCapacity:sizes.count]; +for (id sizes_item in sizes) +{ + [sizes_copy addObject:sizes_item]; +} +id sizes_result = [Api1__Serializer addSerializerToObject:sizes_copy serializer:[[Api1__Serializer alloc] initWithConstructorSignature:(int32_t)0x1cb5c415 serializeBlock:^bool (NSArray *object, NSMutableData *data) +{ + int32_t count = (int32_t)object.count; + [data appendBytes:(void *)&count length:4]; + for (id item in object) + { + if (![Api1__Environment serializeObject:item data:data addSignature:true]) + return false; + } + return true; +}]]; sizes_result;}); + _object.dcId = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:dcId] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + return _object; +} + + +@end + +@implementation Api1_Photo_photoEmpty + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x2331b22d serializeBlock:^bool (Api1_Photo_photoEmpty *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.pid data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(photoEmpty id:%@)", self.pid]; +} + +@end + +@implementation Api1_Photo_photo + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xd07504a5 serializeBlock:^bool (Api1_Photo_photo *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.flags data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.pid data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.accessHash data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.fileReference data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.date data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.sizes data:data addSignature:true]) + return false; + if (![Api1__Environment serializeObject:object.dcId data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(photo flags:%@ id:%@ access_hash:%@ file_reference:%d date:%@ sizes:%@ dc_id:%@)", self.flags, self.pid, self.accessHash, (int)[self.fileReference length], self.date, self.sizes, self.dcId]; +} + +@end + + + + +@interface Api1_PhotoSize () + +@property (nonatomic, strong) NSString * type; + +@end + +@interface Api1_PhotoSize_photoSizeEmpty () + +@end + +@interface Api1_PhotoSize_photoSize () + +@property (nonatomic, strong) Api1_FileLocation * location; +@property (nonatomic, strong) NSNumber * w; +@property (nonatomic, strong) NSNumber * h; +@property (nonatomic, strong) NSNumber * size; + +@end + +@interface Api1_PhotoSize_photoCachedSize () + +@property (nonatomic, strong) Api1_FileLocation * location; +@property (nonatomic, strong) NSNumber * w; +@property (nonatomic, strong) NSNumber * h; +@property (nonatomic, strong) NSData * bytes; + +@end + +@interface Api1_PhotoSize_photoStrippedSize () + +@property (nonatomic, strong) NSData * bytes; + +@end + +@implementation Api1_PhotoSize + ++ (Api1_PhotoSize_photoSizeEmpty *)photoSizeEmptyWithType:(NSString *)type +{ + Api1_PhotoSize_photoSizeEmpty *_object = [[Api1_PhotoSize_photoSizeEmpty alloc] init]; + _object.type = [Api1__Serializer addSerializerToObject:[type copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + return _object; +} + ++ (Api1_PhotoSize_photoSize *)photoSizeWithType:(NSString *)type location:(Api1_FileLocation *)location w:(NSNumber *)w h:(NSNumber *)h size:(NSNumber *)size +{ + Api1_PhotoSize_photoSize *_object = [[Api1_PhotoSize_photoSize alloc] init]; + _object.type = [Api1__Serializer addSerializerToObject:[type copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + _object.location = location; + _object.w = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:w] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.h = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:h] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.size = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:size] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + return _object; +} + ++ (Api1_PhotoSize_photoCachedSize *)photoCachedSizeWithType:(NSString *)type location:(Api1_FileLocation *)location w:(NSNumber *)w h:(NSNumber *)h bytes:(NSData *)bytes +{ + Api1_PhotoSize_photoCachedSize *_object = [[Api1_PhotoSize_photoCachedSize alloc] init]; + _object.type = [Api1__Serializer addSerializerToObject:[type copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + _object.location = location; + _object.w = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:w] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.h = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:h] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.bytes = [Api1__Serializer addSerializerToObject:[bytes copy] serializer:[[Api1_BuiltinSerializer_Bytes alloc] init]]; + return _object; +} + ++ (Api1_PhotoSize_photoStrippedSize *)photoStrippedSizeWithType:(NSString *)type bytes:(NSData *)bytes +{ + Api1_PhotoSize_photoStrippedSize *_object = [[Api1_PhotoSize_photoStrippedSize alloc] init]; + _object.type = [Api1__Serializer addSerializerToObject:[type copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + _object.bytes = [Api1__Serializer addSerializerToObject:[bytes copy] serializer:[[Api1_BuiltinSerializer_Bytes alloc] init]]; + return _object; +} + + +@end + +@implementation Api1_PhotoSize_photoSizeEmpty + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xe17e23c serializeBlock:^bool (Api1_PhotoSize_photoSizeEmpty *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.type data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(photoSizeEmpty type:%d)", (int)[self.type length]]; +} + +@end + +@implementation Api1_PhotoSize_photoSize + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x77bfb61b serializeBlock:^bool (Api1_PhotoSize_photoSize *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.type data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.location data:data addSignature:true]) + return false; + if (![Api1__Environment serializeObject:object.w data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.h data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.size data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(photoSize type:%d location:%@ w:%@ h:%@ size:%@)", (int)[self.type length], self.location, self.w, self.h, self.size]; +} + +@end + +@implementation Api1_PhotoSize_photoCachedSize + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xe9a734fa serializeBlock:^bool (Api1_PhotoSize_photoCachedSize *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.type data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.location data:data addSignature:true]) + return false; + if (![Api1__Environment serializeObject:object.w data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.h data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.bytes data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(photoCachedSize type:%d location:%@ w:%@ h:%@ bytes:%d)", (int)[self.type length], self.location, self.w, self.h, (int)[self.bytes length]]; +} + +@end + +@implementation Api1_PhotoSize_photoStrippedSize + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xe0b0bc2e serializeBlock:^bool (Api1_PhotoSize_photoStrippedSize *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.type data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.bytes data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(photoStrippedSize type:%d bytes:%d)", (int)[self.type length], (int)[self.bytes length]]; +} + +@end + + + + +@interface Api1_FileLocation () + +@property (nonatomic, strong) NSNumber * volumeId; +@property (nonatomic, strong) NSNumber * localId; + +@end + +@interface Api1_FileLocation_fileLocationToBeDeprecated () + +@end + +@implementation Api1_FileLocation + ++ (Api1_FileLocation_fileLocationToBeDeprecated *)fileLocationToBeDeprecatedWithVolumeId:(NSNumber *)volumeId localId:(NSNumber *)localId +{ + Api1_FileLocation_fileLocationToBeDeprecated *_object = [[Api1_FileLocation_fileLocationToBeDeprecated alloc] init]; + _object.volumeId = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:volumeId] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.localId = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:localId] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + return _object; +} + + +@end + +@implementation Api1_FileLocation_fileLocationToBeDeprecated + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xbc7fc6cd serializeBlock:^bool (Api1_FileLocation_fileLocationToBeDeprecated *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.volumeId data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.localId data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(fileLocationToBeDeprecated volume_id:%@ local_id:%@)", self.volumeId, self.localId]; +} + +@end + + + + +@interface Api1_DocumentAttribute () + +@end + +@interface Api1_DocumentAttribute_documentAttributeImageSize () + +@property (nonatomic, strong) NSNumber * w; +@property (nonatomic, strong) NSNumber * h; + +@end + +@interface Api1_DocumentAttribute_documentAttributeAnimated () + +@end + +@interface Api1_DocumentAttribute_documentAttributeSticker () + +@property (nonatomic, strong) NSNumber * flags; +@property (nonatomic, strong) NSString * alt; +@property (nonatomic, strong) Api1_InputStickerSet * stickerset; +@property (nonatomic, strong) Api1_MaskCoords * maskCoords; + +@end + +@interface Api1_DocumentAttribute_documentAttributeVideo () + +@property (nonatomic, strong) NSNumber * flags; +@property (nonatomic, strong) NSNumber * duration; +@property (nonatomic, strong) NSNumber * w; +@property (nonatomic, strong) NSNumber * h; + +@end + +@interface Api1_DocumentAttribute_documentAttributeAudio () + +@property (nonatomic, strong) NSNumber * flags; +@property (nonatomic, strong) NSNumber * duration; +@property (nonatomic, strong) NSString * title; +@property (nonatomic, strong) NSString * performer; +@property (nonatomic, strong) NSData * waveform; + +@end + +@interface Api1_DocumentAttribute_documentAttributeFilename () + +@property (nonatomic, strong) NSString * fileName; + +@end + +@interface Api1_DocumentAttribute_documentAttributeHasStickers () + +@end + +@implementation Api1_DocumentAttribute + ++ (Api1_DocumentAttribute_documentAttributeImageSize *)documentAttributeImageSizeWithW:(NSNumber *)w h:(NSNumber *)h +{ + Api1_DocumentAttribute_documentAttributeImageSize *_object = [[Api1_DocumentAttribute_documentAttributeImageSize alloc] init]; + _object.w = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:w] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.h = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:h] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + return _object; +} + ++ (Api1_DocumentAttribute_documentAttributeAnimated *)documentAttributeAnimated +{ + Api1_DocumentAttribute_documentAttributeAnimated *_object = [[Api1_DocumentAttribute_documentAttributeAnimated alloc] init]; + return _object; +} + ++ (Api1_DocumentAttribute_documentAttributeSticker *)documentAttributeStickerWithFlags:(NSNumber *)flags alt:(NSString *)alt stickerset:(Api1_InputStickerSet *)stickerset maskCoords:(Api1_MaskCoords *)maskCoords +{ + Api1_DocumentAttribute_documentAttributeSticker *_object = [[Api1_DocumentAttribute_documentAttributeSticker alloc] init]; + _object.flags = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:flags] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.alt = [Api1__Serializer addSerializerToObject:[alt copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + _object.stickerset = stickerset; + _object.maskCoords = maskCoords; + return _object; +} + ++ (Api1_DocumentAttribute_documentAttributeVideo *)documentAttributeVideoWithFlags:(NSNumber *)flags duration:(NSNumber *)duration w:(NSNumber *)w h:(NSNumber *)h +{ + Api1_DocumentAttribute_documentAttributeVideo *_object = [[Api1_DocumentAttribute_documentAttributeVideo alloc] init]; + _object.flags = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:flags] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.duration = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:duration] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.w = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:w] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.h = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:h] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + return _object; +} + ++ (Api1_DocumentAttribute_documentAttributeAudio *)documentAttributeAudioWithFlags:(NSNumber *)flags duration:(NSNumber *)duration title:(NSString *)title performer:(NSString *)performer waveform:(NSData *)waveform +{ + Api1_DocumentAttribute_documentAttributeAudio *_object = [[Api1_DocumentAttribute_documentAttributeAudio alloc] init]; + _object.flags = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:flags] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.duration = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:duration] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.title = [Api1__Serializer addSerializerToObject:[title copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + _object.performer = [Api1__Serializer addSerializerToObject:[performer copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + _object.waveform = [Api1__Serializer addSerializerToObject:[waveform copy] serializer:[[Api1_BuiltinSerializer_Bytes alloc] init]]; + return _object; +} + ++ (Api1_DocumentAttribute_documentAttributeFilename *)documentAttributeFilenameWithFileName:(NSString *)fileName +{ + Api1_DocumentAttribute_documentAttributeFilename *_object = [[Api1_DocumentAttribute_documentAttributeFilename alloc] init]; + _object.fileName = [Api1__Serializer addSerializerToObject:[fileName copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + return _object; +} + ++ (Api1_DocumentAttribute_documentAttributeHasStickers *)documentAttributeHasStickers +{ + Api1_DocumentAttribute_documentAttributeHasStickers *_object = [[Api1_DocumentAttribute_documentAttributeHasStickers alloc] init]; + return _object; +} + + +@end + +@implementation Api1_DocumentAttribute_documentAttributeImageSize + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x6c37c15c serializeBlock:^bool (Api1_DocumentAttribute_documentAttributeImageSize *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.w data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.h data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(documentAttributeImageSize w:%@ h:%@)", self.w, self.h]; +} + +@end + +@implementation Api1_DocumentAttribute_documentAttributeAnimated + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x11b58939 serializeBlock:^bool (__unused Api1_DocumentAttribute_documentAttributeAnimated *object, __unused NSMutableData *data) + { + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(documentAttributeAnimated)"]; +} + +@end + +@implementation Api1_DocumentAttribute_documentAttributeSticker + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x6319d612 serializeBlock:^bool (Api1_DocumentAttribute_documentAttributeSticker *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.flags data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.alt data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.stickerset data:data addSignature:true]) + return false; + if ([object.flags intValue] & (1 << 0)) { + if (![Api1__Environment serializeObject:object.maskCoords data:data addSignature:true]) + return false; + } + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(documentAttributeSticker flags:%@ alt:%d stickerset:%@ mask_coords:%@)", self.flags, (int)[self.alt length], self.stickerset, self.maskCoords]; +} + +@end + +@implementation Api1_DocumentAttribute_documentAttributeVideo + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xef02ce6 serializeBlock:^bool (Api1_DocumentAttribute_documentAttributeVideo *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.flags data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.duration data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.w data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.h data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(documentAttributeVideo flags:%@ duration:%@ w:%@ h:%@)", self.flags, self.duration, self.w, self.h]; +} + +@end + +@implementation Api1_DocumentAttribute_documentAttributeAudio + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x9852f9c6 serializeBlock:^bool (Api1_DocumentAttribute_documentAttributeAudio *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.flags data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.duration data:data addSignature:false]) + return false; + if ([object.flags intValue] & (1 << 0)) { + if (![Api1__Environment serializeObject:object.title data:data addSignature:false]) + return false; + } + if ([object.flags intValue] & (1 << 1)) { + if (![Api1__Environment serializeObject:object.performer data:data addSignature:false]) + return false; + } + if ([object.flags intValue] & (1 << 2)) { + if (![Api1__Environment serializeObject:object.waveform data:data addSignature:false]) + return false; + } + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(documentAttributeAudio flags:%@ duration:%@ title:%d performer:%d waveform:%d)", self.flags, self.duration, (int)[self.title length], (int)[self.performer length], (int)[self.waveform length]]; +} + +@end + +@implementation Api1_DocumentAttribute_documentAttributeFilename + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x15590068 serializeBlock:^bool (Api1_DocumentAttribute_documentAttributeFilename *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.fileName data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(documentAttributeFilename file_name:%d)", (int)[self.fileName length]]; +} + +@end + +@implementation Api1_DocumentAttribute_documentAttributeHasStickers + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x9801d2f7 serializeBlock:^bool (__unused Api1_DocumentAttribute_documentAttributeHasStickers *object, __unused NSMutableData *data) + { + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(documentAttributeHasStickers)"]; +} + +@end + + + + +@interface Api1_InputStickerSet () + +@end + +@interface Api1_InputStickerSet_inputStickerSetEmpty () + +@end + +@interface Api1_InputStickerSet_inputStickerSetID () + +@property (nonatomic, strong) NSNumber * pid; +@property (nonatomic, strong) NSNumber * accessHash; + +@end + +@interface Api1_InputStickerSet_inputStickerSetShortName () + +@property (nonatomic, strong) NSString * shortName; + +@end + +@implementation Api1_InputStickerSet + ++ (Api1_InputStickerSet_inputStickerSetEmpty *)inputStickerSetEmpty +{ + Api1_InputStickerSet_inputStickerSetEmpty *_object = [[Api1_InputStickerSet_inputStickerSetEmpty alloc] init]; + return _object; +} + ++ (Api1_InputStickerSet_inputStickerSetID *)inputStickerSetIDWithPid:(NSNumber *)pid accessHash:(NSNumber *)accessHash +{ + Api1_InputStickerSet_inputStickerSetID *_object = [[Api1_InputStickerSet_inputStickerSetID alloc] init]; + _object.pid = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:pid] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.accessHash = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:accessHash] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + return _object; +} + ++ (Api1_InputStickerSet_inputStickerSetShortName *)inputStickerSetShortNameWithShortName:(NSString *)shortName +{ + Api1_InputStickerSet_inputStickerSetShortName *_object = [[Api1_InputStickerSet_inputStickerSetShortName alloc] init]; + _object.shortName = [Api1__Serializer addSerializerToObject:[shortName copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + return _object; +} + + +@end + +@implementation Api1_InputStickerSet_inputStickerSetEmpty + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xffb62b95 serializeBlock:^bool (__unused Api1_InputStickerSet_inputStickerSetEmpty *object, __unused NSMutableData *data) + { + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(inputStickerSetEmpty)"]; +} + +@end + +@implementation Api1_InputStickerSet_inputStickerSetID + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x9de7a269 serializeBlock:^bool (Api1_InputStickerSet_inputStickerSetID *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.pid data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.accessHash data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(inputStickerSetID id:%@ access_hash:%@)", self.pid, self.accessHash]; +} + +@end + +@implementation Api1_InputStickerSet_inputStickerSetShortName + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x861cc8a0 serializeBlock:^bool (Api1_InputStickerSet_inputStickerSetShortName *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.shortName data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(inputStickerSetShortName short_name:%d)", (int)[self.shortName length]]; +} + +@end + + + + +@interface Api1_InputFileLocation () + +@property (nonatomic, strong) NSNumber * pid; +@property (nonatomic, strong) NSNumber * accessHash; +@property (nonatomic, strong) NSData * fileReference; +@property (nonatomic, strong) NSString * thumbSize; + +@end + +@interface Api1_InputFileLocation_inputPhotoFileLocation () + +@end + +@interface Api1_InputFileLocation_inputDocumentFileLocation () + +@end + +@implementation Api1_InputFileLocation + ++ (Api1_InputFileLocation_inputPhotoFileLocation *)inputPhotoFileLocationWithPid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference thumbSize:(NSString *)thumbSize +{ + Api1_InputFileLocation_inputPhotoFileLocation *_object = [[Api1_InputFileLocation_inputPhotoFileLocation alloc] init]; + _object.pid = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:pid] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.accessHash = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:accessHash] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.fileReference = [Api1__Serializer addSerializerToObject:[fileReference copy] serializer:[[Api1_BuiltinSerializer_Bytes alloc] init]]; + _object.thumbSize = [Api1__Serializer addSerializerToObject:[thumbSize copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + return _object; +} + ++ (Api1_InputFileLocation_inputDocumentFileLocation *)inputDocumentFileLocationWithPid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference thumbSize:(NSString *)thumbSize +{ + Api1_InputFileLocation_inputDocumentFileLocation *_object = [[Api1_InputFileLocation_inputDocumentFileLocation alloc] init]; + _object.pid = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:pid] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.accessHash = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:accessHash] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.fileReference = [Api1__Serializer addSerializerToObject:[fileReference copy] serializer:[[Api1_BuiltinSerializer_Bytes alloc] init]]; + _object.thumbSize = [Api1__Serializer addSerializerToObject:[thumbSize copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + return _object; +} + + +@end + +@implementation Api1_InputFileLocation_inputPhotoFileLocation + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x40181ffe serializeBlock:^bool (Api1_InputFileLocation_inputPhotoFileLocation *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.pid data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.accessHash data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.fileReference data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.thumbSize data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(inputPhotoFileLocation id:%@ access_hash:%@ file_reference:%d thumb_size:%d)", self.pid, self.accessHash, (int)[self.fileReference length], (int)[self.thumbSize length]]; +} + +@end + +@implementation Api1_InputFileLocation_inputDocumentFileLocation + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xbad07584 serializeBlock:^bool (Api1_InputFileLocation_inputDocumentFileLocation *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.pid data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.accessHash data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.fileReference data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.thumbSize data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(inputDocumentFileLocation id:%@ access_hash:%@ file_reference:%d thumb_size:%d)", self.pid, self.accessHash, (int)[self.fileReference length], (int)[self.thumbSize length]]; +} + +@end + + + + +@interface Api1_MaskCoords () + +@property (nonatomic, strong) NSNumber * n; +@property (nonatomic, strong) NSNumber * x; +@property (nonatomic, strong) NSNumber * y; +@property (nonatomic, strong) NSNumber * zoom; + +@end + +@interface Api1_MaskCoords_maskCoords () + +@end + +@implementation Api1_MaskCoords + ++ (Api1_MaskCoords_maskCoords *)maskCoordsWithN:(NSNumber *)n x:(NSNumber *)x y:(NSNumber *)y zoom:(NSNumber *)zoom +{ + Api1_MaskCoords_maskCoords *_object = [[Api1_MaskCoords_maskCoords alloc] init]; + _object.n = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:n] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.x = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:x] serializer:[[Api1_BuiltinSerializer_Double alloc] init]]; + _object.y = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:y] serializer:[[Api1_BuiltinSerializer_Double alloc] init]]; + _object.zoom = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:zoom] serializer:[[Api1_BuiltinSerializer_Double alloc] init]]; + return _object; +} + + +@end + +@implementation Api1_MaskCoords_maskCoords + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0xaed6dbb2 serializeBlock:^bool (Api1_MaskCoords_maskCoords *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.n data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.x data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.y data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.zoom data:data addSignature:false]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(maskCoords n:%@ x:%@ y:%@ zoom:%@)", self.n, self.x, self.y, self.zoom]; +} + +@end + + + + +@interface Api1_Document () + +@property (nonatomic, strong) NSNumber * flags; +@property (nonatomic, strong) NSNumber * pid; +@property (nonatomic, strong) NSNumber * accessHash; +@property (nonatomic, strong) NSData * fileReference; +@property (nonatomic, strong) NSNumber * date; +@property (nonatomic, strong) NSString * mimeType; +@property (nonatomic, strong) NSNumber * size; +@property (nonatomic, strong) NSArray * thumbs; +@property (nonatomic, strong) NSNumber * dcId; +@property (nonatomic, strong) NSArray * attributes; + +@end + +@interface Api1_Document_document () + +@end + +@implementation Api1_Document + ++ (Api1_Document_document *)documentWithFlags:(NSNumber *)flags pid:(NSNumber *)pid accessHash:(NSNumber *)accessHash fileReference:(NSData *)fileReference date:(NSNumber *)date mimeType:(NSString *)mimeType size:(NSNumber *)size thumbs:(NSArray *)thumbs dcId:(NSNumber *)dcId attributes:(NSArray *)attributes +{ + Api1_Document_document *_object = [[Api1_Document_document alloc] init]; + _object.flags = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:flags] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.pid = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:pid] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.accessHash = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:accessHash] serializer:[[Api1_BuiltinSerializer_Long alloc] init]]; + _object.fileReference = [Api1__Serializer addSerializerToObject:[fileReference copy] serializer:[[Api1_BuiltinSerializer_Bytes alloc] init]]; + _object.date = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:date] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.mimeType = [Api1__Serializer addSerializerToObject:[mimeType copy] serializer:[[Api1_BuiltinSerializer_String alloc] init]]; + _object.size = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:size] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.thumbs = +({ +NSMutableArray *thumbs_copy = [[NSMutableArray alloc] initWithCapacity:thumbs.count]; +for (id thumbs_item in thumbs) +{ + [thumbs_copy addObject:thumbs_item]; +} +id thumbs_result = [Api1__Serializer addSerializerToObject:thumbs_copy serializer:[[Api1__Serializer alloc] initWithConstructorSignature:(int32_t)0x1cb5c415 serializeBlock:^bool (NSArray *object, NSMutableData *data) +{ + int32_t count = (int32_t)object.count; + [data appendBytes:(void *)&count length:4]; + for (id item in object) + { + if (![Api1__Environment serializeObject:item data:data addSignature:true]) + return false; + } + return true; +}]]; thumbs_result;}); + _object.dcId = [Api1__Serializer addSerializerToObject:[[Api1__Number alloc] initWithNumber:dcId] serializer:[[Api1_BuiltinSerializer_Int alloc] init]]; + _object.attributes = +({ +NSMutableArray *attributes_copy = [[NSMutableArray alloc] initWithCapacity:attributes.count]; +for (id attributes_item in attributes) +{ + [attributes_copy addObject:attributes_item]; +} +id attributes_result = [Api1__Serializer addSerializerToObject:attributes_copy serializer:[[Api1__Serializer alloc] initWithConstructorSignature:(int32_t)0x1cb5c415 serializeBlock:^bool (NSArray *object, NSMutableData *data) +{ + int32_t count = (int32_t)object.count; + [data appendBytes:(void *)&count length:4]; + for (id item in object) + { + if (![Api1__Environment serializeObject:item data:data addSignature:true]) + return false; + } + return true; +}]]; attributes_result;}); + return _object; +} + + +@end + +@implementation Api1_Document_document + +- (instancetype)init +{ + self = [super init]; + if (self != nil) + { + [Api1__Serializer addSerializerToObject:self withConstructorSignature:0x9ba29cc1 serializeBlock:^bool (Api1_Document_document *object, NSMutableData *data) + { + if (![Api1__Environment serializeObject:object.flags data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.pid data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.accessHash data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.fileReference data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.date data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.mimeType data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.size data:data addSignature:false]) + return false; + if ([object.flags intValue] & (1 << 0)) { + if (![Api1__Environment serializeObject:object.thumbs data:data addSignature:true]) + return false; + } + if (![Api1__Environment serializeObject:object.dcId data:data addSignature:false]) + return false; + if (![Api1__Environment serializeObject:object.attributes data:data addSignature:true]) + return false; + return true; + }]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"(document flags:%@ id:%@ access_hash:%@ file_reference:%d date:%@ mime_type:%d size:%@ thumbs:%@ dc_id:%@ attributes:%@)", self.flags, self.pid, self.accessHash, (int)[self.fileReference length], self.date, (int)[self.mimeType length], self.size, self.thumbs, self.dcId, self.attributes]; +} + +@end + + + + +@implementation Api1: NSObject + +@end diff --git a/NotificationService/Api0.swift b/NotificationService/Api0.swift index 0654582811..b7debd8831 100644 --- a/NotificationService/Api0.swift +++ b/NotificationService/Api0.swift @@ -29,8 +29,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { return dict }() -struct Api { - static func parse(_ buffer: Buffer) -> Any? { +public struct Api { + public static func parse(_ buffer: Buffer) -> Any? { let reader = BufferReader(buffer) if let signature = reader.readInt32() { return parse(reader, signature: signature) @@ -38,17 +38,17 @@ struct Api { return nil } - static func parse(_ reader: BufferReader, signature: Int32) -> Any? { + public static func parse(_ reader: BufferReader, signature: Int32) -> Any? { if let parser = parsers[signature] { return parser(reader) } else { - //Logger.shared.log("TL", "Type constructor \(String(signature, radix: 16, uppercase: false)) not found") + telegramApiLog("Type constructor \(String(signature, radix: 16, uppercase: false)) not found") return nil } } - static func parseVector(_ reader: BufferReader, elementSignature: Int32, elementType: T.Type) -> [T]? { + public static func parseVector(_ reader: BufferReader, elementSignature: Int32, elementType: T.Type) -> [T]? { if let count = reader.readInt32() { var array = [T]() var i: Int32 = 0 @@ -83,7 +83,7 @@ struct Api { return nil } - static func serializeObject(_ object: Any, buffer: Buffer, boxed: Swift.Bool) { + public static func serializeObject(_ object: Any, buffer: Buffer, boxed: Swift.Bool) { switch object { case let _1 as Api.Photo: _1.serialize(buffer, boxed) @@ -107,12 +107,12 @@ struct Api { } } -extension Api { - enum Photo: TypeConstructorDescription { +public extension Api { + public enum Photo: TypeConstructorDescription { case photoEmpty(id: Int64) case photo(flags: Int32, id: Int64, accessHash: Int64, fileReference: Buffer, date: Int32, sizes: [Api.PhotoSize], dcId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .photoEmpty(let id): if boxed { @@ -139,7 +139,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .photoEmpty(let id): return ("photoEmpty", [("id", id)]) @@ -148,7 +148,7 @@ extension Api { } } - static func parse_photoEmpty(_ reader: BufferReader) -> Photo? { + public static func parse_photoEmpty(_ reader: BufferReader) -> Photo? { var _1: Int64? _1 = reader.readInt64() let _c1 = _1 != nil @@ -159,7 +159,7 @@ extension Api { return nil } } - static func parse_photo(_ reader: BufferReader) -> Photo? { + public static func parse_photo(_ reader: BufferReader) -> Photo? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -192,13 +192,13 @@ extension Api { } } - enum PhotoSize: TypeConstructorDescription { + public enum PhotoSize: TypeConstructorDescription { case photoSizeEmpty(type: String) case photoSize(type: String, location: Api.FileLocation, w: Int32, h: Int32, size: Int32) case photoCachedSize(type: String, location: Api.FileLocation, w: Int32, h: Int32, bytes: Buffer) case photoStrippedSize(type: String, bytes: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .photoSizeEmpty(let type): if boxed { @@ -236,7 +236,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .photoSizeEmpty(let type): return ("photoSizeEmpty", [("type", type)]) @@ -249,7 +249,7 @@ extension Api { } } - static func parse_photoSizeEmpty(_ reader: BufferReader) -> PhotoSize? { + public static func parse_photoSizeEmpty(_ reader: BufferReader) -> PhotoSize? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -260,7 +260,7 @@ extension Api { return nil } } - static func parse_photoSize(_ reader: BufferReader) -> PhotoSize? { + public static func parse_photoSize(_ reader: BufferReader) -> PhotoSize? { var _1: String? _1 = parseString(reader) var _2: Api.FileLocation? @@ -285,7 +285,7 @@ extension Api { return nil } } - static func parse_photoCachedSize(_ reader: BufferReader) -> PhotoSize? { + public static func parse_photoCachedSize(_ reader: BufferReader) -> PhotoSize? { var _1: String? _1 = parseString(reader) var _2: Api.FileLocation? @@ -310,7 +310,7 @@ extension Api { return nil } } - static func parse_photoStrippedSize(_ reader: BufferReader) -> PhotoSize? { + public static func parse_photoStrippedSize(_ reader: BufferReader) -> PhotoSize? { var _1: String? _1 = parseString(reader) var _2: Buffer? @@ -326,10 +326,10 @@ extension Api { } } - enum FileLocation: TypeConstructorDescription { + public enum FileLocation: TypeConstructorDescription { case fileLocationToBeDeprecated(volumeId: Int64, localId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .fileLocationToBeDeprecated(let volumeId, let localId): if boxed { @@ -341,14 +341,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .fileLocationToBeDeprecated(let volumeId, let localId): return ("fileLocationToBeDeprecated", [("volumeId", volumeId), ("localId", localId)]) } } - static func parse_fileLocationToBeDeprecated(_ reader: BufferReader) -> FileLocation? { + public static func parse_fileLocationToBeDeprecated(_ reader: BufferReader) -> FileLocation? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -364,7 +364,7 @@ extension Api { } } - enum DocumentAttribute: TypeConstructorDescription { + public enum DocumentAttribute: TypeConstructorDescription { case documentAttributeImageSize(w: Int32, h: Int32) case documentAttributeAnimated case documentAttributeSticker(flags: Int32, alt: String, stickerset: Api.InputStickerSet, maskCoords: Api.MaskCoords?) @@ -373,7 +373,7 @@ extension Api { case documentAttributeFilename(fileName: String) case documentAttributeHasStickers - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .documentAttributeImageSize(let w, let h): if boxed { @@ -431,7 +431,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .documentAttributeImageSize(let w, let h): return ("documentAttributeImageSize", [("w", w), ("h", h)]) @@ -450,7 +450,7 @@ extension Api { } } - static func parse_documentAttributeImageSize(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeImageSize(_ reader: BufferReader) -> DocumentAttribute? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -464,10 +464,10 @@ extension Api { return nil } } - static func parse_documentAttributeAnimated(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeAnimated(_ reader: BufferReader) -> DocumentAttribute? { return Api.DocumentAttribute.documentAttributeAnimated } - static func parse_documentAttributeSticker(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeSticker(_ reader: BufferReader) -> DocumentAttribute? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -491,7 +491,7 @@ extension Api { return nil } } - static func parse_documentAttributeVideo(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeVideo(_ reader: BufferReader) -> DocumentAttribute? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -511,7 +511,7 @@ extension Api { return nil } } - static func parse_documentAttributeAudio(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeAudio(_ reader: BufferReader) -> DocumentAttribute? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -534,7 +534,7 @@ extension Api { return nil } } - static func parse_documentAttributeFilename(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeFilename(_ reader: BufferReader) -> DocumentAttribute? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -545,17 +545,17 @@ extension Api { return nil } } - static func parse_documentAttributeHasStickers(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeHasStickers(_ reader: BufferReader) -> DocumentAttribute? { return Api.DocumentAttribute.documentAttributeHasStickers } } - enum InputStickerSet: TypeConstructorDescription { + public enum InputStickerSet: TypeConstructorDescription { case inputStickerSetEmpty case inputStickerSetID(id: Int64, accessHash: Int64) case inputStickerSetShortName(shortName: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputStickerSetEmpty: if boxed { @@ -579,7 +579,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputStickerSetEmpty: return ("inputStickerSetEmpty", []) @@ -590,10 +590,10 @@ extension Api { } } - static func parse_inputStickerSetEmpty(_ reader: BufferReader) -> InputStickerSet? { + public static func parse_inputStickerSetEmpty(_ reader: BufferReader) -> InputStickerSet? { return Api.InputStickerSet.inputStickerSetEmpty } - static func parse_inputStickerSetID(_ reader: BufferReader) -> InputStickerSet? { + public static func parse_inputStickerSetID(_ reader: BufferReader) -> InputStickerSet? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -607,7 +607,7 @@ extension Api { return nil } } - static func parse_inputStickerSetShortName(_ reader: BufferReader) -> InputStickerSet? { + public static func parse_inputStickerSetShortName(_ reader: BufferReader) -> InputStickerSet? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -620,11 +620,11 @@ extension Api { } } - enum InputFileLocation: TypeConstructorDescription { + public enum InputFileLocation: TypeConstructorDescription { case inputPhotoFileLocation(id: Int64, accessHash: Int64, fileReference: Buffer, thumbSize: String) case inputDocumentFileLocation(id: Int64, accessHash: Int64, fileReference: Buffer, thumbSize: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPhotoFileLocation(let id, let accessHash, let fileReference, let thumbSize): if boxed { @@ -647,7 +647,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPhotoFileLocation(let id, let accessHash, let fileReference, let thumbSize): return ("inputPhotoFileLocation", [("id", id), ("accessHash", accessHash), ("fileReference", fileReference), ("thumbSize", thumbSize)]) @@ -656,7 +656,7 @@ extension Api { } } - static func parse_inputPhotoFileLocation(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputPhotoFileLocation(_ reader: BufferReader) -> InputFileLocation? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -676,7 +676,7 @@ extension Api { return nil } } - static func parse_inputDocumentFileLocation(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputDocumentFileLocation(_ reader: BufferReader) -> InputFileLocation? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -698,10 +698,10 @@ extension Api { } } - enum MaskCoords: TypeConstructorDescription { + public enum MaskCoords: TypeConstructorDescription { case maskCoords(n: Int32, x: Double, y: Double, zoom: Double) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .maskCoords(let n, let x, let y, let zoom): if boxed { @@ -715,14 +715,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .maskCoords(let n, let x, let y, let zoom): return ("maskCoords", [("n", n), ("x", x), ("y", y), ("zoom", zoom)]) } } - static func parse_maskCoords(_ reader: BufferReader) -> MaskCoords? { + public static func parse_maskCoords(_ reader: BufferReader) -> MaskCoords? { var _1: Int32? _1 = reader.readInt32() var _2: Double? @@ -744,10 +744,10 @@ extension Api { } } - enum Document: TypeConstructorDescription { + public enum Document: TypeConstructorDescription { case document(flags: Int32, id: Int64, accessHash: Int64, fileReference: Buffer, date: Int32, mimeType: String, size: Int32, thumbs: [Api.PhotoSize]?, dcId: Int32, attributes: [Api.DocumentAttribute]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .document(let flags, let id, let accessHash, let fileReference, let date, let mimeType, let size, let thumbs, let dcId, let attributes): if boxed { @@ -775,14 +775,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .document(let flags, let id, let accessHash, let fileReference, let date, let mimeType, let size, let thumbs, let dcId, let attributes): return ("document", [("flags", flags), ("id", id), ("accessHash", accessHash), ("fileReference", fileReference), ("date", date), ("mimeType", mimeType), ("size", size), ("thumbs", thumbs), ("dcId", dcId), ("attributes", attributes)]) } } - static func parse_document(_ reader: BufferReader) -> Document? { + public static func parse_document(_ reader: BufferReader) -> Document? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -827,8 +827,8 @@ extension Api { } } -extension Api { - struct functions { +public extension Api { + public struct functions { } } diff --git a/NotificationService/Attachments.h b/NotificationService/Attachments.h new file mode 100644 index 0000000000..a67240cfce --- /dev/null +++ b/NotificationService/Attachments.h @@ -0,0 +1,7 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +id _Nullable parseAttachment(NSData * _Nonnull data); + +NS_ASSUME_NONNULL_END diff --git a/NotificationService/Attachments.m b/NotificationService/Attachments.m new file mode 100644 index 0000000000..e0a86247ba --- /dev/null +++ b/NotificationService/Attachments.m @@ -0,0 +1,30 @@ +#import "Attachments.h" + +#import +#import "Api.h" + +id _Nullable parseAttachment(NSData * _Nonnull data) { + if (data.length < 4) { + return nil; + } + + MTInputStream *inputStream = [[MTInputStream alloc] initWithData:data]; + + int32_t signature = [inputStream readInt32]; + + NSData *dataToParse = nil; + if (signature == 0x3072cfa1) { + NSData *bytes = [inputStream readBytes]; + if (bytes != nil) { + dataToParse = [MTGzip decompress:bytes]; + } + } else { + dataToParse = data; + } + + if (dataToParse == nil) { + return nil; + } + + return [Api1__Environment parseObject:dataToParse]; +} diff --git a/NotificationService/FetchImage.h b/NotificationService/FetchImage.h new file mode 100644 index 0000000000..dd9b2fed90 --- /dev/null +++ b/NotificationService/FetchImage.h @@ -0,0 +1,11 @@ +#import + +#import "StoredAccountInfos.h" +#import "Api.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +dispatch_block_t fetchImage(BuildConfig *buildConfig, AccountProxyConnection * _Nullable proxyConnection, StoredAccountInfo *account, Api1_InputFileLocation *inputFileLocation, int32_t datacenterId, void (^_completion)(NSData * _Nullable)); + +NS_ASSUME_NONNULL_END diff --git a/NotificationService/FetchImage.m b/NotificationService/FetchImage.m new file mode 100644 index 0000000000..8a1e8921a5 --- /dev/null +++ b/NotificationService/FetchImage.m @@ -0,0 +1,195 @@ +#import "FetchImage.h" + +#import + +#import "Serialization.h" + +@interface InMemoryKeychain : NSObject { + NSMutableDictionary *_dict; +} + +@end + +@implementation InMemoryKeychain + +- (instancetype)init { + self = [super init]; + if (self != nil) { + _dict = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)setObject:(id)object forKey:(NSString *)aKey group:(NSString *)group { + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object]; + _dict[[NSString stringWithFormat:@"%@:%@", group, aKey]] = data; +} + +- (id)objectForKey:(NSString *)aKey group:(NSString *)group { + NSData *data = _dict[[NSString stringWithFormat:@"%@:%@", group, aKey]]; + if (data != nil) { + return [NSKeyedUnarchiver unarchiveObjectWithData:data]; + } else { + return nil; + } +} + +- (void)removeObjectForKey:(NSString *)aKey group:(NSString *)group { + [_dict removeObjectForKey:[NSString stringWithFormat:@"%@:%@", group, aKey]]; +} + +- (void)dropGroup:(NSString *)group { +} + +@end + +static void MTLoggingFunction(NSString *string, va_list args) { + NSLogv(string, args); +} + +@interface ParsedFile : NSObject + +@property (nonatomic, strong, readonly) NSData * _Nullable data; + +@end + +@implementation ParsedFile + +- (instancetype)initWithData:(NSData * _Nullable)data { + self = [super init]; + if (self != nil) { + _data = data; + } + return self; +} + +@end + +dispatch_block_t fetchImage(BuildConfig *buildConfig, AccountProxyConnection * _Nullable proxyConnection, StoredAccountInfo *account, Api1_InputFileLocation *inputFileLocation, int32_t datacenterId, void (^completion)(NSData * _Nullable)) { + MTLogSetEnabled(true); + MTLogSetLoggingFunction(&MTLoggingFunction); + + Serialization *serialization = [[Serialization alloc] init]; + + MTApiEnvironment *apiEnvironment = [[MTApiEnvironment alloc] init]; + + apiEnvironment.apiId = buildConfig.apiId; + apiEnvironment.langPack = @"ios"; + apiEnvironment.layer = @([serialization currentLayer]); + apiEnvironment.disableUpdates = true; + apiEnvironment = [apiEnvironment withUpdatedLangPackCode:@"en"]; + + if (proxyConnection != nil) { + apiEnvironment = [apiEnvironment withUpdatedSocksProxySettings:[[MTSocksProxySettings alloc] initWithIp:proxyConnection.host port:(uint16_t)proxyConnection.port username:proxyConnection.username password:proxyConnection.password secret:proxyConnection.secret]]; + } + + MTContext *context = [[MTContext alloc] initWithSerialization:serialization apiEnvironment:apiEnvironment isTestingEnvironment:account.isTestingEnvironment useTempAuthKeys:false]; + + NSDictionary *seedAddressList = @{}; + + if (account.isTestingEnvironment) { + seedAddressList = @{ + @(1): @[@"149.154.175.10"], + @(2): @[@"149.154.167.40"] + }; + } else { + seedAddressList = @{ + @(1): @[@"149.154.175.50", @"2001:b28:f23d:f001::a"], + @(2): @[@"149.154.167.50", @"2001:67c:4e8:f002::a"], + @(3): @[@"149.154.175.100", @"2001:b28:f23d:f003::a"], + @(4): @[@"149.154.167.91", @"2001:67c:4e8:f004::a"], + @(5): @[@"149.154.171.5", @"2001:b28:f23f:f005::a"] + }; + } + + for (NSNumber *datacenterId in seedAddressList) { + NSMutableArray *addressList = [[NSMutableArray alloc] init]; + for (NSString *host in seedAddressList[datacenterId]) { + [addressList addObject:[[MTDatacenterAddress alloc] initWithIp:host port:443 preferForMedia:false restrictToTcp:false cdn:false preferForProxy:false secret:nil]]; + } + [context setSeedAddressSetForDatacenterWithId:[datacenterId intValue] seedAddressSet:[[MTDatacenterAddressSet alloc] initWithAddressList:addressList]]; + } + + InMemoryKeychain *keychain = [[InMemoryKeychain alloc] init]; + context.keychain = keychain; + + [context performBatchUpdates:^{ + for (NSNumber *datacenterId in account.datacenters) { + AccountDatacenterInfo *info = account.datacenters[datacenterId]; + if (info.addressList.count != 0) { + NSMutableArray *list = [[NSMutableArray alloc] init]; + for (AccountDatacenterAddress *address in info.addressList) { + [list addObject:[[MTDatacenterAddress alloc] initWithIp:address.host port:address.port preferForMedia:address.isMedia restrictToTcp:false cdn:false preferForProxy:address.isProxy secret:address.secret]]; + } + [context updateAddressSetForDatacenterWithId:[datacenterId intValue] addressSet:[[MTDatacenterAddressSet alloc] initWithAddressList:list] forceUpdateSchemes:true]; + } + } + }]; + + for (NSNumber *datacenterId in account.datacenters) { + AccountDatacenterInfo *info = account.datacenters[datacenterId]; + [context updateAuthInfoForDatacenterWithId:[datacenterId intValue] authInfo:[[MTDatacenterAuthInfo alloc] initWithAuthKey:info.masterKey.data authKeyId:info.masterKey.keyId saltSet:@[] authKeyAttributes:@{} mainTempAuthKey:nil mediaTempAuthKey:nil]]; + } + + MTProto * mtProto = [[MTProto alloc] initWithContext:context datacenterId:datacenterId usageCalculationInfo:nil]; + mtProto.useTempAuthKeys = context.useTempAuthKeys; + mtProto.checkForProxyConnectionIssues = false; + + MTRequestMessageService *requestService = [[MTRequestMessageService alloc] initWithContext:context]; + [mtProto addMessageService:requestService]; + + MTRequest *request = [[MTRequest alloc] init]; + + MTOutputStream *outputStream = [[MTOutputStream alloc] init]; + [outputStream writeInt32:-475607115]; //upload.getFile + [outputStream writeData:[Api1__Environment serializeObject:inputFileLocation]]; + + [outputStream writeInt32:0]; + [outputStream writeInt32:32 * 1024]; + + [request setPayload:[outputStream currentBytes] metadata:@"getFile" shortMetadata:@"getFile" responseParser:^id(NSData *response) { + MTInputStream *inputStream = [[MTInputStream alloc] initWithData:response]; + int32_t signature = [inputStream readInt32]; + if (signature != 157948117) { + return [[ParsedFile alloc] initWithData:nil]; + } + [inputStream readInt32]; //type + [inputStream readInt32]; //mtime + + return [[ParsedFile alloc] initWithData:[inputStream readBytes]]; + }]; + + request.dependsOnPasswordEntry = false; + request.shouldContinueExecutionWithErrorContext = ^bool (__unused MTRequestErrorContext *errorContext) { + return true; + }; + + request.completed = ^(id boxedResponse, __unused NSTimeInterval completionTimestamp, MTRpcError *error) { + if (error != nil) { + if (completion) { + completion(nil); + } + } else { + if ([boxedResponse isKindOfClass:[ParsedFile class]]) { + if (completion) { + completion(((ParsedFile *)boxedResponse).data); + } + } else { + if (completion) { + completion(nil); + } + } + } + }; + + [requestService addRequest:request]; + [mtProto resume]; + + id internalId = request.internalId; + return ^{ + [requestService removeRequestByInternalId:internalId]; + [context performBatchUpdates:^{ + }]; + [mtProto stop]; + }; +} diff --git a/NotificationService/Info.plist b/NotificationService/Info.plist index 659f01ce86..14cecfaf70 100644 --- a/NotificationService/Info.plist +++ b/NotificationService/Info.plist @@ -25,7 +25,7 @@ NSExtensionPointIdentifier com.apple.usernotifications.service NSExtensionPrincipalClass - $(PRODUCT_MODULE_NAME).NotificationService + NotificationService diff --git a/NotificationService/NotificationService.h b/NotificationService/NotificationService.h new file mode 100644 index 0000000000..91142ad7de --- /dev/null +++ b/NotificationService/NotificationService.h @@ -0,0 +1,10 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NotificationService : UNNotificationServiceExtension + +@end + +NS_ASSUME_NONNULL_END diff --git a/NotificationService/NotificationService.m b/NotificationService/NotificationService.m new file mode 100644 index 0000000000..54ced01308 --- /dev/null +++ b/NotificationService/NotificationService.m @@ -0,0 +1,359 @@ +#import "NotificationService.h" + +#import +#import + +#import "StoredAccountInfos.h" +#import "Attachments.h" +#import "Api.h" +#import "FetchImage.h" + +static NSData * _Nullable parseBase64(NSString *string) { + string = [string stringByReplacingOccurrencesOfString:@"-" withString:@"+"]; + string = [string stringByReplacingOccurrencesOfString:@"_" withString:@"/"]; + while (string.length % 4 != 0) { + string = [string stringByAppendingString:@"="]; + } + return [[NSData alloc] initWithBase64EncodedString:string options:0]; +} + +typedef enum { + PeerNamespaceCloudUser = 0, + PeerNamespaceCloudGroup = 1, + PeerNamespaceCloudChannel = 2, + PeerNamespaceSecretChat = 3 +} PeerNamespace; + +static int64_t makePeerId(int32_t namespace, int32_t value) { + return (((int64_t)(namespace)) << 32) | ((int64_t)((uint64_t)((uint32_t)value))); +} + +@interface NotificationService () { + NSString * _Nullable _rootPath; + NSString * _Nullable _baseAppBundleId; + void (^_contentHandler)(UNNotificationContent *); + UNMutableNotificationContent * _Nullable _bestAttemptContent; + void (^_cancelFetch)(void); +} + +@end + +@implementation NotificationService + +- (instancetype)init { + self = [super init]; + if (self != nil) { + NSString *appBundleIdentifier = [NSBundle mainBundle].bundleIdentifier; + NSRange lastDotRange = [appBundleIdentifier rangeOfString:@"." options:NSBackwardsSearch]; + if (lastDotRange.location != NSNotFound) { + _baseAppBundleId = [appBundleIdentifier substringToIndex:lastDotRange.location]; + NSString *appGroupName = [@"group." stringByAppendingString:_baseAppBundleId]; + NSURL *appGroupUrl = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupName]; + + if (appGroupUrl != nil) { + NSString *rootPath = [[appGroupUrl path] stringByAppendingPathComponent:@"telegram-data"]; + _rootPath = rootPath; + } else { + NSAssert(false, @"appGroupUrl == nil"); + } + } else { + NSAssert(false, @"Invalid bundle id"); + } + } + return self; +} + +- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { + if (_rootPath == nil) { + contentHandler(request.content); + return; + } + + _contentHandler = [contentHandler copy]; + _bestAttemptContent = (UNMutableNotificationContent *)[request.content mutableCopy]; + + NSString * _Nullable encryptedPayload = request.content.userInfo[@"p"]; + NSData * _Nullable encryptedData = nil; + if (encryptedPayload != nil && [encryptedPayload isKindOfClass:[NSString class]]) { + encryptedData = parseBase64(encryptedPayload); + } + + StoredAccountInfos * _Nullable accountInfos = [StoredAccountInfos loadFromPath:[_rootPath stringByAppendingPathComponent:@"accounts-shared-data"]]; + + int selectedAccountIndex = -1; + NSDictionary *decryptedPayload = decryptedNotificationPayload(accountInfos.accounts, encryptedData, &selectedAccountIndex); + + if (decryptedPayload != nil && selectedAccountIndex != -1) { + StoredAccountInfo *account = accountInfos.accounts[selectedAccountIndex]; + + NSMutableDictionary *userInfo = nil; + if (_bestAttemptContent.userInfo != nil) { + userInfo = [[NSMutableDictionary alloc] initWithDictionary:_bestAttemptContent.userInfo]; + } else { + userInfo = [[NSMutableDictionary alloc] init]; + } + userInfo[@"accountId"] = @(account.accountId); + + int64_t peerId = 0; + int32_t messageId = 0; + bool silent = false; + + NSString *messageIdString = decryptedPayload[@"msg_id"]; + if ([messageIdString isKindOfClass:[NSString class]]) { + userInfo[@"msg_id"] = messageIdString; + messageId = [messageIdString intValue]; + } + + NSString *fromIdString = decryptedPayload[@"from_id"]; + if ([fromIdString isKindOfClass:[NSString class]]) { + userInfo[@"from_id"] = fromIdString; + peerId = makePeerId(PeerNamespaceCloudUser, [fromIdString intValue]); + } + + NSString *chatIdString = decryptedPayload[@"chat_id"]; + if ([chatIdString isKindOfClass:[NSString class]]) { + userInfo[@"chat_id"] = chatIdString; + peerId = makePeerId(PeerNamespaceCloudGroup, [chatIdString intValue]); + } + + NSString *channelIdString = decryptedPayload[@"channel_id"]; + if ([channelIdString isKindOfClass:[NSString class]]) { + userInfo[@"channel_id"] = channelIdString; + peerId = makePeerId(PeerNamespaceCloudChannel, [channelIdString intValue]); + } + + NSString *silentString = decryptedPayload[@"silent"]; + if ([silentString isKindOfClass:[NSString class]]) { + silent = [silentString intValue] != 0; + } + + NSString *attachmentDataString = decryptedPayload[@"attachb64"]; + NSData *attachmentData = nil; + id parsedAttachment = nil; + if ([attachmentDataString isKindOfClass:[NSString class]]) { + attachmentData = parseBase64(attachmentDataString); + if (attachmentData != nil) { + parsedAttachment = parseAttachment(attachmentData); + } + } + + NSString *imagesPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"aps-data"]; + [[NSFileManager defaultManager] createDirectoryAtPath:imagesPath withIntermediateDirectories:true attributes:nil error:nil]; + NSString *accountBasePath = [_rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"account-%llud", account.accountId]]; + + NSString *mediaBoxPath = [accountBasePath stringByAppendingPathComponent:@"/postbox/media"]; + + NSString *tempImagePath = nil; + NSString *mediaBoxThumbnailImagePath = nil; + + int32_t fileDatacenterId = 0; + Api1_InputFileLocation *inputFileLocation = nil; + + NSString *fetchResourceId = nil; + bool isPng = false; + bool isExpandableMedia = false; + + if (parsedAttachment != nil) { + if ([parsedAttachment isKindOfClass:[Api1_Photo_photo class]]) { + Api1_Photo_photo *photo = parsedAttachment; + isExpandableMedia = true; + for (id size in photo.sizes) { + if ([size isKindOfClass:[Api1_PhotoSize_photoSize class]]) { + Api1_PhotoSize_photoSize *sizeValue = size; + if ([sizeValue.type isEqualToString:@"m"]) { + inputFileLocation = [Api1_InputFileLocation inputPhotoFileLocationWithPid:photo.pid accessHash:photo.accessHash fileReference:photo.fileReference thumbSize:sizeValue.type]; + fileDatacenterId = [photo.dcId intValue]; + fetchResourceId = [NSString stringWithFormat:@"telegram-cloud-photo-size-%@-%@-%@", photo.dcId, photo.pid, sizeValue.type]; + break; + } + } + } + } else if ([parsedAttachment isKindOfClass:[Api1_Document_document class]]) { + Api1_Document_document *document = parsedAttachment; + + bool isSticker = false; + for (id attribute in document.attributes) { + if ([attribute isKindOfClass:[Api1_DocumentAttribute_documentAttributeSticker class]]) { + isSticker = true; + } + } + bool isAnimatedSticker = [document.mimeType isEqualToString:@"application/x-tgsticker"]; + if (isSticker || isAnimatedSticker) { + isExpandableMedia = true; + } + for (id size in document.thumbs) { + if ([size isKindOfClass:[Api1_PhotoSize_photoSize class]]) { + Api1_PhotoSize_photoSize *photoSize = size; + if ((isSticker && [photoSize.type isEqualToString:@"s"]) || [photoSize.type isEqualToString:@"m"]) { + if (isSticker) { + isPng = true; + } + inputFileLocation = [Api1_InputFileLocation inputDocumentFileLocationWithPid:document.pid accessHash:document.accessHash fileReference:document.fileReference thumbSize:photoSize.type]; + fileDatacenterId = [document.dcId intValue]; + fetchResourceId = [NSString stringWithFormat:@"telegram-cloud-document-size-%@-%@-%@", document.dcId, document.pid, photoSize.type]; + break; + } + } + } + } + } + + if (fetchResourceId != nil) { + tempImagePath = [imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", fetchResourceId, isPng ? @"png" : @"jpg"]]; + mediaBoxThumbnailImagePath = [mediaBoxPath stringByAppendingPathComponent:fetchResourceId]; + } + + NSDictionary *aps = decryptedPayload[@"aps"]; + if ([aps isKindOfClass:[NSDictionary class]]) { + id alert = aps[@"alert"]; + if ([alert isKindOfClass:[NSDictionary class]]) { + NSDictionary *alertDict = alert; + NSString *title = alertDict[@"title"]; + NSString *subtitle = alertDict[@"subtitle"]; + NSString *body = alertDict[@"body"]; + if (![title isKindOfClass:[NSString class]]) { + title = @""; + } + if (![subtitle isKindOfClass:[NSString class]]) { + subtitle = @""; + } + if (![body isKindOfClass:[NSString class]]) { + body = nil; + } + if (title.length != 0 && silent) { + title = [title stringByAppendingString:@" 🔕"]; + } + _bestAttemptContent.title = title; + _bestAttemptContent.subtitle = subtitle; + _bestAttemptContent.body = body; + } else if ([alert isKindOfClass:[NSString class]]) { + _bestAttemptContent.title = @""; + _bestAttemptContent.subtitle = @""; + _bestAttemptContent.body = alert; + } + + NSString *threadIdString = aps[@"thread-id"]; + if ([threadIdString isKindOfClass:[NSString class]]) { + _bestAttemptContent.threadIdentifier = threadIdString; + } + NSString *soundString = aps[@"sound"]; + if ([soundString isKindOfClass:[NSString class]]) { + _bestAttemptContent.sound = [UNNotificationSound soundNamed:soundString]; + } + NSString *categoryString = aps[@"category"]; + if ([categoryString isKindOfClass:[NSString class]]) { + _bestAttemptContent.categoryIdentifier = categoryString; + if (peerId != 0 && messageId != 0 && parsedAttachment != nil && attachmentData != nil) { + userInfo[@"peerId"] = @(peerId); + userInfo[@"messageId.namespace"] = @(0); + userInfo[@"messageId.id"] = @(messageId); + + userInfo[@"media"] = [attachmentData base64EncodedStringWithOptions:0]; + + if (isExpandableMedia) { + if ([categoryString isEqualToString:@"r"]) { + _bestAttemptContent.categoryIdentifier = @"withReplyMedia"; + } else if ([categoryString isEqualToString:@"m"]) { + _bestAttemptContent.categoryIdentifier = @"withMuteMedia"; + } + } + } + } + + if (accountInfos.accounts.count > 1) { + if (_bestAttemptContent.title.length != 0 && account.peerName.length != 0) { + _bestAttemptContent.title = [NSString stringWithFormat:@"%@ → %@", _bestAttemptContent.title, account.peerName]; + } + } + } + + _bestAttemptContent.userInfo = userInfo; + + if (_cancelFetch) { + _cancelFetch(); + _cancelFetch = nil; + } + + if (mediaBoxThumbnailImagePath != nil && tempImagePath != nil && inputFileLocation != nil) { + NSData *data = [NSData dataWithContentsOfFile:mediaBoxThumbnailImagePath]; + if (data != nil) { + NSData *tempData = data; + if (isPng) { + /*if let image = WebP.convert(fromWebP: data), let imageData = image.pngData() { + tempData = imageData + }*/ + } + if ([tempData writeToFile:tempImagePath atomically:true]) { + UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"image" URL:[NSURL fileURLWithPath:tempImagePath] options:nil error:nil]; + if (attachment != nil) { + _bestAttemptContent.attachments = @[attachment]; + } + } + if (_contentHandler && _bestAttemptContent != nil) { + _contentHandler(_bestAttemptContent); + } + } else { + BuildConfig *buildConfig = [[BuildConfig alloc] initWithBaseAppBundleId:_baseAppBundleId]; + + __weak NotificationService *weakSelf = self; + _cancelFetch = fetchImage(buildConfig, accountInfos.proxy, account, inputFileLocation, fileDatacenterId, ^(NSData * _Nullable data) { + dispatch_async(dispatch_get_main_queue(), ^{ + __strong NotificationService *strongSelf = weakSelf; + if (strongSelf == nil) { + return; + } + if (strongSelf->_cancelFetch) { + strongSelf->_cancelFetch(); + strongSelf->_cancelFetch = nil; + + if (data != nil) { + [data writeToFile:mediaBoxThumbnailImagePath atomically:true]; + NSData *tempData = data; + if (isPng) { + /*if let image = WebP.convert(fromWebP: data), let imageData = image.pngData() { + tempData = imageData + }*/ + } + if ([tempData writeToFile:tempImagePath atomically:true]) { + UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"image" URL:[NSURL fileURLWithPath:tempImagePath] options:nil error:nil]; + if (attachment != nil) { + strongSelf->_bestAttemptContent.attachments = @[attachment]; + } + } + } + + if (strongSelf->_contentHandler && strongSelf->_bestAttemptContent != nil) { + strongSelf->_contentHandler(strongSelf->_bestAttemptContent); + } + } + }); + }); + } + } else { + if (_contentHandler && _bestAttemptContent != nil) { + _contentHandler(_bestAttemptContent); + } + } + } else { + if (_contentHandler && _bestAttemptContent != nil) { + _contentHandler(_bestAttemptContent); + } + } +} + +- (void)serviceExtensionTimeWillExpire { + if (_cancelFetch) { + _cancelFetch(); + _cancelFetch = nil; + } + + if (_contentHandler) { + if(_bestAttemptContent) { + _contentHandler(_bestAttemptContent); + _bestAttemptContent = nil; + } + _contentHandler = nil; + } +} + +@end diff --git a/NotificationService/Serialization.h b/NotificationService/Serialization.h new file mode 100644 index 0000000000..f08453b3f3 --- /dev/null +++ b/NotificationService/Serialization.h @@ -0,0 +1,10 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface Serialization : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/NotificationService/Serialization.m b/NotificationService/Serialization.m new file mode 100644 index 0000000000..a10db76cba --- /dev/null +++ b/NotificationService/Serialization.m @@ -0,0 +1,35 @@ +#import "Serialization.h" + +@implementation Serialization + +- (NSUInteger)currentLayer { + return 105; +} + +- (id _Nullable)parseMessage:(NSData * _Nullable)data { + return nil; +} + +- (MTExportAuthorizationResponseParser _Nonnull)exportAuthorization:(int32_t)datacenterId data:(__autoreleasing NSData **)data { + return ^MTExportedAuthorizationData *(NSData *resultData) { + return nil; + }; +} + +- (NSData * _Nonnull)importAuthorization:(int32_t)authId bytes:(NSData * _Nonnull)bytes { + return [NSData data]; +} + +- (MTRequestDatacenterAddressListParser)requestDatacenterAddressWithData:(__autoreleasing NSData **)data { + return ^MTDatacenterAddressListData *(NSData *resultData) { + return nil; + }; +} + +- (MTRequestNoopParser)requestNoop:(__autoreleasing NSData **)data { + return ^id(NSData *resultData) { + return nil; + }; +} + +@end diff --git a/NotificationService/StoredAccountInfos.h b/NotificationService/StoredAccountInfos.h new file mode 100644 index 0000000000..a5fb775e47 --- /dev/null +++ b/NotificationService/StoredAccountInfos.h @@ -0,0 +1,67 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface AccountNotificationKey: NSObject + +@property (nonatomic, strong, readonly) NSData *keyId; +@property (nonatomic, strong, readonly) NSData *data; + +@end + +@interface AccountDatacenterKey: NSObject + +@property (nonatomic, readonly) int64_t keyId; +@property (nonatomic, strong, readonly) NSData *data; + +@end + +@interface AccountDatacenterAddress: NSObject + +@property (nonatomic, strong, readonly) NSString *host; +@property (nonatomic, readonly) int32_t port; +@property (nonatomic, readonly) bool isMedia; +@property (nonatomic, strong, readonly) NSData * _Nullable secret; + +@end + +@interface AccountDatacenterInfo: NSObject + +@property (nonatomic, strong, readonly) AccountDatacenterKey *masterKey; +@property (nonatomic, strong, readonly) NSArray *addressList; + +@end + +@interface AccountProxyConnection: NSObject + +@property (nonatomic, strong, readonly) NSString *host; +@property (nonatomic, readonly) int32_t port; +@property (nonatomic, strong) NSString * _Nullable username; +@property (nonatomic, strong) NSString * _Nullable password; +@property (nonatomic, strong) NSData * _Nullable secret; + +@end + +@interface StoredAccountInfo : NSObject + +@property (nonatomic, readonly) int64_t accountId; +@property (nonatomic, readonly) int32_t primaryId; +@property (nonatomic, readonly) bool isTestingEnvironment; +@property (nonatomic, strong, readonly) NSString *peerName; +@property (nonatomic, strong, readonly) NSDictionary *datacenters; +@property (nonatomic, strong, readonly) AccountNotificationKey *notificationKey; + +@end + +@interface StoredAccountInfos : NSObject + +@property (nonatomic, strong, readonly) AccountProxyConnection * _Nullable proxy; +@property (nonatomic, strong, readonly) NSArray *accounts; + ++ (StoredAccountInfos * _Nullable)loadFromPath:(NSString *)path; + +@end + +NSDictionary * _Nullable decryptedNotificationPayload(NSArray *accounts, NSData *data, int *selectedAccountIndex); + +NS_ASSUME_NONNULL_END diff --git a/NotificationService/StoredAccountInfos.m b/NotificationService/StoredAccountInfos.m new file mode 100644 index 0000000000..bdfeb05095 --- /dev/null +++ b/NotificationService/StoredAccountInfos.m @@ -0,0 +1,412 @@ +#import "StoredAccountInfos.h" + +#import +#import + +@implementation AccountNotificationKey + +- (instancetype)initWithKeyId:(NSData *)keyId data:(NSData *)data { + self = [super init]; + if (self != nil) { + _keyId = keyId; + _data = data; + } + return self; +} + ++ (instancetype _Nullable)parse:(NSDictionary *)dict { + NSString *keyIdString = dict[@"id"]; + NSData *keyId = nil; + if ([keyIdString isKindOfClass:[NSString class]]) { + keyId = [[NSData alloc] initWithBase64EncodedString:keyIdString options:0]; + } + if (keyId == nil) { + return nil; + } + + NSString *dataString = dict[@"data"]; + NSData *data = nil; + if ([dataString isKindOfClass:[NSString class]]) { + data = [[NSData alloc] initWithBase64EncodedString:dataString options:0]; + } + if (data == nil) { + return nil; + } + + return [[AccountNotificationKey alloc] initWithKeyId:keyId data:data]; +} + +@end + +@implementation AccountDatacenterKey + +- (instancetype)initWithKeyId:(int64_t)keyId data:(NSData *)data { + self = [super init]; + if (self != nil) { + _keyId = keyId; + _data = data; + } + return self; +} + ++ (instancetype _Nullable)parse:(NSDictionary *)dict { + NSNumber *keyIdNumber = dict[@"id"]; + if (![keyIdNumber isKindOfClass:[NSNumber class]]) { + return nil; + } + int64_t keyId = [keyIdNumber longLongValue]; + + NSString *dataString = dict[@"data"]; + NSData *data = nil; + if ([dataString isKindOfClass:[NSString class]]) { + data = [[NSData alloc] initWithBase64EncodedString:dataString options:0]; + } + if (data == nil) { + return nil; + } + + return [[AccountDatacenterKey alloc] initWithKeyId:keyId data:data]; +} + +@end + +@implementation AccountDatacenterAddress + +- (instancetype)initWithHost:(NSString *)host port:(int32_t)port isMedia:(bool)isMedia secret:(NSData * _Nullable)secret { + self = [super init]; + if (self != nil) { + _host = host; + _port = port; + _isMedia = isMedia; + _secret = secret; + } + return self; +} + ++ (instancetype _Nullable)parse:(NSDictionary *)dict { + NSString *hostString = dict[@"host"]; + if (![hostString isKindOfClass:[NSString class]]) { + return nil; + } + NSString *host = hostString; + + NSNumber *portNumber = dict[@"port"]; + if (![portNumber isKindOfClass:[NSNumber class]]) { + return nil; + } + int32_t port = [portNumber intValue]; + + NSNumber *isMediaNumber = dict[@"isMedia"]; + if (![isMediaNumber isKindOfClass:[NSNumber class]]) { + return nil; + } + bool isMedia = [isMediaNumber intValue] != 0; + + NSString *secretString = dict[@"secret"]; + NSData *secret = nil; + if ([secretString isKindOfClass:[NSString class]]) { + secret = [[NSData alloc] initWithBase64EncodedString:secretString options:0]; + } + + return [[AccountDatacenterAddress alloc] initWithHost:host port:port isMedia:isMedia secret:secret]; +} + +@end + +@implementation AccountDatacenterInfo + +- (instancetype)initWithMasterKey:(AccountDatacenterKey *)masterKey addressList:(NSArray *)addressList { + self = [super init]; + if (self != nil) { + _masterKey = masterKey; + _addressList = addressList; + } + return self; +} + ++ (instancetype _Nullable)parse:(NSDictionary *)dict { + NSDictionary *masterKeyDict = dict[@"masterKey"]; + if (![masterKeyDict isKindOfClass:[NSDictionary class]]) { + return nil; + } + AccountDatacenterKey *masterKey = [AccountDatacenterKey parse:masterKeyDict]; + if (masterKey == nil) { + return nil; + } + + NSArray *addressListArray = dict[@"addressList"]; + if (![addressListArray isKindOfClass:[NSArray class]]) { + return nil; + } + + NSMutableArray *addressList = [[NSMutableArray alloc] init]; + for (NSDictionary *addressListItem in addressListArray) { + if (![addressListItem isKindOfClass:[NSDictionary class]]) { + return nil; + } + AccountDatacenterAddress *address = [AccountDatacenterAddress parse:addressListItem]; + if (address == nil) { + return nil; + } + [addressList addObject:address]; + } + + return [[AccountDatacenterInfo alloc] initWithMasterKey:masterKey addressList:addressList]; +} + +@end + +@implementation AccountProxyConnection + +- (instancetype)initWithHost:(NSString *)host port:(int32_t)port username:(NSString * _Nullable)username password:(NSString * _Nullable)password secret:(NSData * _Nullable)secret { + self = [super init]; + if (self != nil) { + _host = host; + _port = port; + username = _username; + password = _password; + secret = _secret; + } + return self; +} + ++ (instancetype _Nullable)parse:(NSDictionary *)dict { + NSString *hostString = dict[@"host"]; + if (![hostString isKindOfClass:[NSString class]]) { + return nil; + } + NSString *host = hostString; + + NSNumber *portNumber = dict[@"port"]; + if (![portNumber isKindOfClass:[NSNumber class]]) { + return nil; + } + + int32_t port = [portNumber intValue]; + + NSString *usernameString = dict[@"username"]; + NSString *username = nil; + if ([usernameString isKindOfClass:[NSString class]]) { + username = usernameString; + } + + NSString *passwordString = dict[@"password"]; + NSString *password = nil; + if ([passwordString isKindOfClass:[NSString class]]) { + password = passwordString; + } + + NSString *secretString = dict[@"secret"]; + NSData *secret = nil; + if ([secretString isKindOfClass:[NSString class]]) { + secret = [[NSData alloc] initWithBase64EncodedString:secretString options:0]; + } + + return [[AccountProxyConnection alloc] initWithHost:host port:port username:username password:password secret:secret]; +} + +@end + +@implementation StoredAccountInfo + +- (instancetype)initWithAccountId:(int64_t)accountId primaryId:(int32_t)primaryId isTestingEnvironment:(bool)isTestingEnvironment peerName:(NSString *)peerName datacenters:(NSDictionary *)datacenters notificationKey:(AccountNotificationKey *)notificationKey { + self = [super init]; + if (self != nil) { + _accountId = accountId; + _primaryId = primaryId; + _isTestingEnvironment = isTestingEnvironment; + _peerName = peerName; + _datacenters = datacenters; + _notificationKey = notificationKey; + } + return self; +} + ++ (instancetype _Nullable)parse:(NSDictionary *)dict { + NSNumber *idNumber = dict[@"id"]; + if (![idNumber isKindOfClass:[NSNumber class]]) { + return nil; + } + int64_t accountId = [idNumber longLongValue]; + + NSNumber *primaryIdNumber = dict[@"primaryId"]; + if (![primaryIdNumber isKindOfClass:[NSNumber class]]) { + return nil; + } + + int32_t primaryId = [primaryIdNumber intValue]; + + NSNumber *isTestingEnvironmentNumber = dict[@"isTestingEnvironment"]; + if (![isTestingEnvironmentNumber isKindOfClass:[NSNumber class]]) { + return nil; + } + + bool isTestingEnvironment = [isTestingEnvironmentNumber intValue] != 0; + + NSString *peerNameString = dict[@"peerName"]; + if (![peerNameString isKindOfClass:[NSString class]]) { + return nil; + } + + NSString *peerName = peerNameString; + + NSArray *datacentersArray = dict[@"datacenters"]; + if (![datacentersArray isKindOfClass:[NSArray class]]) { + return nil; + } + + NSMutableDictionary *datacenters = [[NSMutableDictionary alloc] init]; + + for (NSInteger i = 0; i < datacentersArray.count; i += 2) { + NSNumber *datacenterKey = datacentersArray[i]; + NSDictionary *datacenterData = datacentersArray[i + 1]; + + if (![datacenterKey isKindOfClass:[NSNumber class]]) { + return nil; + } + if (![datacenterData isKindOfClass:[NSDictionary class]]) { + return nil; + } + AccountDatacenterInfo *parsedDatacenter = [AccountDatacenterInfo parse:datacenterData]; + if (parsedDatacenter != nil) { + datacenters[datacenterKey] = parsedDatacenter; + } + } + + NSDictionary *notificationKeyDict = dict[@"notificationKey"]; + if (![notificationKeyDict isKindOfClass:[NSDictionary class]]) { + return nil; + } + + AccountNotificationKey *notificationKey = [AccountNotificationKey parse:notificationKeyDict]; + if (notificationKey == nil) { + return nil; + } + + return [[StoredAccountInfo alloc] initWithAccountId:accountId primaryId:primaryId isTestingEnvironment:isTestingEnvironment peerName:peerName datacenters:datacenters notificationKey:notificationKey]; +} + +@end + +@implementation StoredAccountInfos + +- (instancetype)initWithProxy:(AccountProxyConnection * _Nullable)proxy accounts:(NSArray *)accounts { + self = [super init]; + if (self != nil) { + _proxy = proxy; + _accounts = accounts; + } + return self; +} + ++ (StoredAccountInfos * _Nullable)loadFromPath:(NSString *)path { + NSData *data = [NSData dataWithContentsOfFile:path]; + if (data == nil) { + return nil; + } + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + if (![dict isKindOfClass:[NSDictionary class]]) { + return nil; + } + + AccountProxyConnection * _Nullable proxy = nil; + NSDictionary *proxyDict = dict[@"proxy"]; + if ([proxyDict isKindOfClass:[NSDictionary class]]) { + proxy = [AccountProxyConnection parse:proxyDict]; + } + + NSMutableArray *accounts = [[NSMutableArray alloc] init]; + + NSArray *accountsObject = dict[@"accounts"]; + if ([accountsObject isKindOfClass:[NSArray class]]) { + for (NSDictionary *object in accountsObject) { + if ([object isKindOfClass:[NSDictionary class]]) { + StoredAccountInfo *account = [StoredAccountInfo parse:object]; + if (account != nil) { + [accounts addObject:account]; + } + } + } + } + + return [[StoredAccountInfos alloc] initWithProxy:proxy accounts:accounts];; +} + +@end + +static NSData *sha256Digest(NSData *data) { + uint8_t digest[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(data.bytes, (CC_LONG)data.length, digest); + + return [[NSData alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; +} + +static NSData *concatData(NSData *data1, NSData *data2) { + NSMutableData *data = [[NSMutableData alloc] initWithCapacity:data1.length + data2.length]; + [data appendData:data1]; + [data appendData:data2]; + return data; +} + +static NSData *concatData3(NSData *data1, NSData *data2, NSData *data3) { + NSMutableData *data = [[NSMutableData alloc] initWithCapacity:data1.length + data2.length + data3.length]; + [data appendData:data1]; + [data appendData:data2]; + [data appendData:data3]; + return data; +} + +NSDictionary * _Nullable decryptedNotificationPayload(NSArray *accounts, NSData *data, int *selectedAccountIndex) { + if (data.length < 8 + 16) { + return nil; + } + + int accountIndex = -1; + for (StoredAccountInfo *account in accounts) { + accountIndex += 1; + + AccountNotificationKey *notificationKey = account.notificationKey; + if (![[data subdataWithRange:NSMakeRange(0, 8)] isEqualToData:notificationKey.keyId]) { + continue; + } + + int x = 8; + NSData *msgKey = [data subdataWithRange:NSMakeRange(8, 16)]; + NSData *rawData = [data subdataWithRange:NSMakeRange(8 + 16, data.length - (8 + 16))]; + + NSData *sha256_a = sha256Digest(concatData(msgKey, [notificationKey.data subdataWithRange:NSMakeRange(x, 36)])); + NSData *sha256_b = sha256Digest(concatData([notificationKey.data subdataWithRange:NSMakeRange(40 + x, 36)], msgKey)); + NSData *aesKey = concatData3([sha256_a subdataWithRange:NSMakeRange(0, 8)], [sha256_b subdataWithRange:NSMakeRange(8, 16)], [sha256_a subdataWithRange:NSMakeRange(24, 8)]); + NSData *aesIv = concatData3([sha256_b subdataWithRange:NSMakeRange(0, 8)], [sha256_a subdataWithRange:NSMakeRange(8, 16)], [sha256_b subdataWithRange:NSMakeRange(24, 8)]); + + NSData *decryptedData = MTAesDecrypt(rawData, aesKey, aesIv); + if (decryptedData.length <= 4) { + return nil; + } + + int32_t dataLength = 0; + [decryptedData getBytes:&dataLength range:NSMakeRange(0, 4)]; + + if (dataLength < 0 || dataLength > decryptedData.length - 4) { + return nil; + } + + NSData *checkMsgKeyLarge = sha256Digest(concatData([notificationKey.data subdataWithRange:NSMakeRange(88 + x, 32)], decryptedData)); + NSData *checkMsgKey = [checkMsgKeyLarge subdataWithRange:NSMakeRange(8, 16)]; + + if (![checkMsgKey isEqualToData:msgKey]) { + return nil; + } + + NSData *contentData = [decryptedData subdataWithRange:NSMakeRange(4, dataLength)]; + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:contentData options:0 error:nil]; + if (![dict isKindOfClass:[NSDictionary class]]) { + return nil; + } + if (selectedAccountIndex != nil) { + *selectedAccountIndex = accountIndex; + } + return dict; + } + return nil; +} diff --git a/Telegram-iOS.xcodeproj/project.pbxproj b/Telegram-iOS.xcodeproj/project.pbxproj index 2f2ccce4f4..889e67f3ad 100644 --- a/Telegram-iOS.xcodeproj/project.pbxproj +++ b/Telegram-iOS.xcodeproj/project.pbxproj @@ -226,13 +226,10 @@ D008185622B579A1008A895F /* BuildConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008185522B579A1008A895F /* BuildConfig.framework */; }; D008185822B579AD008A895F /* BuildConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008185722B579AD008A895F /* BuildConfig.framework */; }; D00818A522B58CCB008A895F /* WatchCommonWatch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00818A422B58CCB008A895F /* WatchCommonWatch.framework */; }; - D00818CF22B595DB008A895F /* LightweightAccountData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00818CE22B595DB008A895F /* LightweightAccountData.framework */; }; D00859A91B28189D00EAF753 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D00859A81B28189D00EAF753 /* Images.xcassets */; }; D00859AC1B28189D00EAF753 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = D00859AA1B28189D00EAF753 /* LaunchScreen.xib */; }; D00ED75A1FE94630001F38BD /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = D00ED7581FE94630001F38BD /* AppIntentVocabulary.plist */; }; D00ED75D1FE95287001F38BD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D00ED75B1FE95287001F38BD /* InfoPlist.strings */; }; - D015E011225CCEB300CB9E8A /* ReadBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D015E010225CCEB300CB9E8A /* ReadBuffer.swift */; }; - D015E01F225CDF5100CB9E8A /* Api0.swift in Sources */ = {isa = PBXBuildFile; fileRef = D015E01E225CDF5000CB9E8A /* Api0.swift */; }; D015E04D225D2D8F00CB9E8A /* WebP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D015E04C225D2D8F00CB9E8A /* WebP.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; D015E050225D303F00CB9E8A /* WebP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D015E04C225D2D8F00CB9E8A /* WebP.framework */; }; D015E051225D303F00CB9E8A /* WebP.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D015E04C225D2D8F00CB9E8A /* WebP.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -302,7 +299,6 @@ D06706611D51185400DED3E3 /* TelegramCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D06706601D51185400DED3E3 /* TelegramCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; D06706621D5118F500DED3E3 /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06706601D51185400DED3E3 /* TelegramCore.framework */; }; D073E52021FF7CE900742DDD /* Crypto.m in Sources */ = {isa = PBXBuildFile; fileRef = D073E51F21FF7CE900742DDD /* Crypto.m */; }; - D073E52222003E1E00742DDD /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = D073E52122003E1E00742DDD /* Data.swift */; }; D08410501FABDD54008FFE92 /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08410511FABDD54008FFE92 /* MtProtoKitDynamic.framework */; }; D08611B21F5711080047111E /* HockeySDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D01A47541F4DBED700383CC1 /* HockeySDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; D08984FE2118B3F100918162 /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08984FD2118B3F100918162 /* MtProtoKitDynamic.framework */; }; @@ -354,6 +350,12 @@ D0B4AF8F1EC122A700D51FF6 /* TelegramUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0400ED81D5B8F97007931CE /* TelegramUI.framework */; }; D0B4AF901EC122A700D51FF6 /* TelegramUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0400ED81D5B8F97007931CE /* TelegramUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; D0B844601DACF561005F29E1 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B8445F1DACF561005F29E1 /* libc++.tbd */; }; + D0BAAA1823100B7A00AFC473 /* Api.m in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA1623100B7A00AFC473 /* Api.m */; }; + D0BAAA1B23100C2700AFC473 /* NotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA1A23100C2700AFC473 /* NotificationService.m */; }; + D0BAAA1E2310117200AFC473 /* StoredAccountInfos.m in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA1D2310117200AFC473 /* StoredAccountInfos.m */; }; + D0BAAA21231026BC00AFC473 /* Attachments.m in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA20231026BC00AFC473 /* Attachments.m */; }; + D0BAAA242310302300AFC473 /* FetchImage.m in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA232310302300AFC473 /* FetchImage.m */; }; + D0BAAA272310326200AFC473 /* Serialization.m in Sources */ = {isa = PBXBuildFile; fileRef = D0BAAA262310326200AFC473 /* Serialization.m */; }; D0C2DFF81CC4D1BA0044FF83 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C2DFF71CC4D1BA0044FF83 /* MobileCoreServices.framework */; }; D0CAD6A421C03BEB001E3055 /* FFMpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CAD6A321C03BEB001E3055 /* FFMpeg.framework */; }; D0CAD6A521C03BEB001E3055 /* FFMpeg.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0CAD6A321C03BEB001E3055 /* FFMpeg.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -389,7 +391,6 @@ D0D17E8A1CAAD66600C4750B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D17E891CAAD66600C4750B /* Accelerate.framework */; }; D0D268791D79A70A00C422DA /* IntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D268781D79A70A00C422DA /* IntentHandler.swift */; }; D0D2688E1D79A70B00C422DA /* SiriIntents.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = D0D268761D79A70A00C422DA /* SiriIntents.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - D0E2CE642227F0680084E3DD /* ManagedFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E2CE632227F0680084E3DD /* ManagedFile.swift */; }; D0E8B8AD2044496C00605593 /* voip_connecting.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = D0E8B8A82044496B00605593 /* voip_connecting.mp3 */; }; D0E8B8AE2044496C00605593 /* voip_end.caf in Resources */ = {isa = PBXBuildFile; fileRef = D0E8B8A92044496C00605593 /* voip_end.caf */; }; D0E8B8AF2044496C00605593 /* voip_fail.caf in Resources */ = {isa = PBXBuildFile; fileRef = D0E8B8AA2044496C00605593 /* voip_fail.caf */; }; @@ -399,10 +400,6 @@ D0E8C2E02285EA6A009F26E8 /* BlackIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0E8C2DF2285EA6A009F26E8 /* BlackIcon@3x.png */; }; D0ECCB7F1FE9C38500609802 /* Telegram_iOS_UITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ECCB7E1FE9C38500609802 /* Telegram_iOS_UITests.swift */; }; D0ECCB8A1FE9C4AC00609802 /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ECCB891FE9C4AC00609802 /* SnapshotHelper.swift */; }; - D0ED633A21FF3EDF001D4648 /* AccountData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED633921FF3EDF001D4648 /* AccountData.swift */; }; - D0ED633D21FF4580001D4648 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0400EE41D5B912E007931CE /* NotificationService.swift */; }; - D0ED633F21FF46E4001D4648 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED633E21FF46E4001D4648 /* ImageData.swift */; }; - D0ED634121FF4786001D4648 /* Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED634021FF4786001D4648 /* Serialization.swift */; }; D0F575132083B96B00F1C1E1 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0F575122083B96B00F1C1E1 /* CloudKit.framework */; }; D0FC1948201D2DA800FEDBB2 /* SFCompactRounded-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = D0FC1947201D2DA700FEDBB2 /* SFCompactRounded-Semibold.otf */; }; /* End PBXBuildFile section */ @@ -1060,6 +1057,18 @@ D0B844591DACF507005F29E1 /* HockeySDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HockeySDK.framework; path = "third-party/HockeySDK.framework"; sourceTree = ""; }; D0B8445A1DACF507005F29E1 /* HockeySDKResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = HockeySDKResources.bundle; path = "third-party/HockeySDKResources.bundle"; sourceTree = ""; }; D0B8445F1DACF561005F29E1 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + D0BAAA1623100B7A00AFC473 /* Api.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Api.m; sourceTree = ""; }; + D0BAAA1723100B7A00AFC473 /* Api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Api.h; sourceTree = ""; }; + D0BAAA1923100C2700AFC473 /* NotificationService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationService.h; sourceTree = ""; }; + D0BAAA1A23100C2700AFC473 /* NotificationService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationService.m; sourceTree = ""; }; + D0BAAA1C2310117200AFC473 /* StoredAccountInfos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StoredAccountInfos.h; sourceTree = ""; }; + D0BAAA1D2310117200AFC473 /* StoredAccountInfos.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StoredAccountInfos.m; sourceTree = ""; }; + D0BAAA1F231026BC00AFC473 /* Attachments.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Attachments.h; sourceTree = ""; }; + D0BAAA20231026BC00AFC473 /* Attachments.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Attachments.m; sourceTree = ""; }; + D0BAAA222310302300AFC473 /* FetchImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FetchImage.h; sourceTree = ""; }; + D0BAAA232310302300AFC473 /* FetchImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FetchImage.m; sourceTree = ""; }; + D0BAAA252310326200AFC473 /* Serialization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Serialization.h; sourceTree = ""; }; + D0BAAA262310326200AFC473 /* Serialization.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Serialization.m; sourceTree = ""; }; D0C2DFF51CC4D1B20044FF83 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; D0C2DFF71CC4D1BA0044FF83 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; D0C2DFF91CC4D1C90044FF83 /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; }; @@ -1148,7 +1157,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D00818CF22B595DB008A895F /* LightweightAccountData.framework in Frameworks */, D008185822B579AD008A895F /* BuildConfig.framework in Frameworks */, D015E04D225D2D8F00CB9E8A /* WebP.framework in Frameworks */, D0CCD61D222EFFB000EE1E08 /* MtProtoKitDynamic.framework in Frameworks */, @@ -2157,6 +2165,18 @@ D0400EE31D5B912E007931CE /* NotificationService */ = { isa = PBXGroup; children = ( + D0BAAA1723100B7A00AFC473 /* Api.h */, + D0BAAA1623100B7A00AFC473 /* Api.m */, + D0BAAA1923100C2700AFC473 /* NotificationService.h */, + D0BAAA1A23100C2700AFC473 /* NotificationService.m */, + D0BAAA1C2310117200AFC473 /* StoredAccountInfos.h */, + D0BAAA1D2310117200AFC473 /* StoredAccountInfos.m */, + D0BAAA1F231026BC00AFC473 /* Attachments.h */, + D0BAAA20231026BC00AFC473 /* Attachments.m */, + D0BAAA222310302300AFC473 /* FetchImage.h */, + D0BAAA232310302300AFC473 /* FetchImage.m */, + D0BAAA252310326200AFC473 /* Serialization.h */, + D0BAAA262310326200AFC473 /* Serialization.m */, D015E01E225CDF5000CB9E8A /* Api0.swift */, D000CAC221FB6E170011B15D /* NotificationService-AppStore.entitlements */, D000CAC321FB6E170011B15D /* NotificationService-AppStoreLLC.entitlements */, @@ -3175,15 +3195,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D073E52222003E1E00742DDD /* Data.swift in Sources */, - D0E2CE642227F0680084E3DD /* ManagedFile.swift in Sources */, - D0ED633D21FF4580001D4648 /* NotificationService.swift in Sources */, - D015E01F225CDF5100CB9E8A /* Api0.swift in Sources */, - D0ED633A21FF3EDF001D4648 /* AccountData.swift in Sources */, - D0ED634121FF4786001D4648 /* Serialization.swift in Sources */, + D0BAAA242310302300AFC473 /* FetchImage.m in Sources */, + D0BAAA1E2310117200AFC473 /* StoredAccountInfos.m in Sources */, + D0BAAA1823100B7A00AFC473 /* Api.m in Sources */, D073E52021FF7CE900742DDD /* Crypto.m in Sources */, - D0ED633F21FF46E4001D4648 /* ImageData.swift in Sources */, - D015E011225CCEB300CB9E8A /* ReadBuffer.swift in Sources */, + D0BAAA1B23100C2700AFC473 /* NotificationService.m in Sources */, + D0BAAA21231026BC00AFC473 /* Attachments.m in Sources */, + D0BAAA272310326200AFC473 /* Serialization.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme b/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme index 837168a96b..85283e68b3 100644 --- a/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme +++ b/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme @@ -57,7 +57,7 @@ TelegramMediaImageRepresentation? { @@ -74,7 +76,18 @@ public func imageRepresentationLargerThan(_ representations: [TelegramMediaImage } public func parseMediaData(data: Data) -> Media? { - if let object = Api.parse(Buffer(data: data)) { + let buffer = BufferReader(Buffer(data: data)) + var parseBuffer: Buffer? + guard let signature = buffer.readInt32() else { + return nil + } + if signature == 0x3072cfa1 { + parseBuffer = parseBytes(buffer).flatMap({ $0.makeData() }).flatMap(MTGzip.decompress).flatMap(Buffer.init(data:)) + } else { + parseBuffer = Buffer(data: data) + } + + if let parseBuffer = parseBuffer, let object = Api.parse(parseBuffer) { if let photo = object as? Api.Photo { return telegramMediaImageFromApiPhoto(photo) } else if let document = object as? Api.Document { diff --git a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift index 55a05c1cbc..05b3e48a3f 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift @@ -151,161 +151,187 @@ public final class NotificationViewControllerImpl { return } - if let accountIdValue = notification.request.content.userInfo["accountId"] as? Int64, let peerIdValue = notification.request.content.userInfo["peerId"] as? Int64, let messageIdNamespace = notification.request.content.userInfo["messageId.namespace"] as? Int32, let messageIdId = notification.request.content.userInfo["messageId.id"] as? Int32, let mediaDataString = notification.request.content.userInfo["media"] as? String, let mediaData = Data(base64Encoded: mediaDataString), let media = parseMediaData(data: mediaData) { - let messageId = MessageId(peerId: PeerId(peerIdValue), namespace: messageIdNamespace, id: messageIdId) + guard let accountIdValue = notification.request.content.userInfo["accountId"] as? Int64 else { + return + } + + guard let peerIdValue = notification.request.content.userInfo["peerId"] as? Int64 else { + return + } + + guard let messageIdNamespace = notification.request.content.userInfo["messageId.namespace"] as? Int32 else { + return + } + + guard let messageIdId = notification.request.content.userInfo["messageId.id"] as? Int32 else { + return + } + + guard let mediaDataString = notification.request.content.userInfo["media"] as? String else { + return + } + + guard let mediaData = Data(base64Encoded: mediaDataString) else { + return + } + + guard let media = parseMediaData(data: mediaData) else { + return + } + + let messageId = MessageId(peerId: PeerId(peerIdValue), namespace: messageIdNamespace, id: messageIdId) + + if let image = media as? TelegramMediaImage, let thumbnailRepresentation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 120.0, height: 120.0)), let largestRepresentation = largestImageRepresentation(image.representations) { + let dimensions = largestRepresentation.dimensions + let fittedSize = dimensions.fitted(CGSize(width: view.bounds.width, height: 1000.0)) + view.frame = CGRect(origin: view.frame.origin, size: fittedSize) + self.setPreferredContentSize(fittedSize) - if let image = media as? TelegramMediaImage, let thumbnailRepresentation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 120.0, height: 120.0)), let largestRepresentation = largestImageRepresentation(image.representations) { - let dimensions = largestRepresentation.dimensions - let fittedSize = dimensions.fitted(CGSize(width: view.bounds.width, height: 1000.0)) - view.frame = CGRect(origin: view.frame.origin, size: fittedSize) - self.setPreferredContentSize(fittedSize) - - self.imageInfo = (false, dimensions) - self.updateImageLayout(boundingSize: view.bounds.size) - - let mediaBoxPath = accountsPath + "/" + accountRecordIdPathName(AccountRecordId(rawValue: accountIdValue)) + "/postbox/media" - - if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(largestRepresentation.resource.id.uniqueId)"), options: .mappedRead) { - self.imageNode.setSignal(chatMessagePhotoInternal(photoData: .single(Tuple(nil, data, true))) - |> map { $0.1 }) - return + self.imageInfo = (false, dimensions) + self.updateImageLayout(boundingSize: view.bounds.size) + + let mediaBoxPath = accountsPath + "/" + accountRecordIdPathName(AccountRecordId(rawValue: accountIdValue)) + "/postbox/media" + + if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(largestRepresentation.resource.id.uniqueId)"), options: .mappedRead) { + self.imageNode.setSignal(chatMessagePhotoInternal(photoData: .single(Tuple(nil, data, true))) + |> map { $0.1 }) + return + } + + if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(thumbnailRepresentation.resource.id.uniqueId)"), options: .mappedRead) { + self.imageNode.setSignal(chatMessagePhotoInternal(photoData: .single(Tuple(data, nil, false))) + |> map { $0.1 }) + } + + guard let sharedAccountContext = sharedAccountContext else { + return + } + + self.applyDisposable.set((sharedAccountContext.activeAccounts + |> map { _, accounts, _ -> Account? in + return accounts.first(where: { $0.0 == AccountRecordId(rawValue: accountIdValue) })?.1 + } + |> filter { account in + return account != nil + } + |> take(1) + |> mapToSignal { account -> Signal<(Account, ImageMediaReference?), NoError> in + guard let account = account else { + return .complete() } - - if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(thumbnailRepresentation.resource.id.uniqueId)"), options: .mappedRead) { - self.imageNode.setSignal(chatMessagePhotoInternal(photoData: .single(Tuple(data, nil, false))) - |> map { $0.1 }) - } - - guard let sharedAccountContext = sharedAccountContext else { - return - } - - self.applyDisposable.set((sharedAccountContext.activeAccounts - |> map { _, accounts, _ -> Account? in - return accounts.first(where: { $0.0 == AccountRecordId(rawValue: accountIdValue) })?.1 - } - |> filter { account in - return account != nil - } - |> take(1) - |> mapToSignal { account -> Signal<(Account, ImageMediaReference?), NoError> in - guard let account = account else { - return .complete() - } - return account.postbox.messageAtId(messageId) - |> take(1) - |> map { message in - var imageReference: ImageMediaReference? - if let message = message { - for media in message.media { - if let image = media as? TelegramMediaImage { - imageReference = .message(message: MessageReference(message), media: image) - } - } - } else { - imageReference = .standalone(media: image) - } - return (account, imageReference) - } - } - |> deliverOnMainQueue).start(next: { [weak self] accountAndImage in - guard let strongSelf = self else { - return - } - if let imageReference = accountAndImage.1 { - strongSelf.imageNode.setSignal(chatMessagePhoto(postbox: accountAndImage.0.postbox, photoReference: imageReference)) - - accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) - strongSelf.fetchedDisposable.set(standaloneChatMessagePhotoInteractiveFetched(account: accountAndImage.0, photoReference: imageReference).start()) - } - })) - } else if let file = media as? TelegramMediaFile, let dimensions = file.dimensions { - guard let sharedAccountContext = sharedAccountContext else { - return - } - - let fittedSize = dimensions.fitted(CGSize(width: min(256.0, view.bounds.width), height: 256.0)) - view.frame = CGRect(origin: view.frame.origin, size: fittedSize) - self.setPreferredContentSize(fittedSize) - - self.imageInfo = (true, dimensions) - self.updateImageLayout(boundingSize: view.bounds.size) - - self.applyDisposable.set((sharedAccountContext.activeAccounts - |> map { _, accounts, _ -> Account? in - return accounts.first(where: { $0.0 == AccountRecordId(rawValue: accountIdValue) })?.1 - } - |> filter { account in - return account != nil - } - |> take(1) - |> mapToSignal { account -> Signal<(Account, FileMediaReference?), NoError> in - guard let account = account else { - return .complete() - } - return account.postbox.messageAtId(messageId) + return account.postbox.messageAtId(messageId) |> take(1) |> map { message in - var fileReference: FileMediaReference? + var imageReference: ImageMediaReference? if let message = message { for media in message.media { - if let file = media as? TelegramMediaFile { - fileReference = .message(message: MessageReference(message), media: file) + if let image = media as? TelegramMediaImage { + imageReference = .message(message: MessageReference(message), media: image) } } } else { - fileReference = .standalone(media: file) + imageReference = .standalone(media: image) } - return (account, fileReference) + return (account, imageReference) + } + } + |> deliverOnMainQueue).start(next: { [weak self] accountAndImage in + guard let strongSelf = self else { + return + } + if let imageReference = accountAndImage.1 { + strongSelf.imageNode.setSignal(chatMessagePhoto(postbox: accountAndImage.0.postbox, photoReference: imageReference)) + + accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) + strongSelf.fetchedDisposable.set(standaloneChatMessagePhotoInteractiveFetched(account: accountAndImage.0, photoReference: imageReference).start()) + } + })) + } else if let file = media as? TelegramMediaFile, let dimensions = file.dimensions { + guard let sharedAccountContext = sharedAccountContext else { + return + } + + let fittedSize = dimensions.fitted(CGSize(width: min(256.0, view.bounds.width), height: 256.0)) + view.frame = CGRect(origin: view.frame.origin, size: fittedSize) + self.setPreferredContentSize(fittedSize) + + self.imageInfo = (true, dimensions) + self.updateImageLayout(boundingSize: view.bounds.size) + + self.applyDisposable.set((sharedAccountContext.activeAccounts + |> map { _, accounts, _ -> Account? in + return accounts.first(where: { $0.0 == AccountRecordId(rawValue: accountIdValue) })?.1 + } + |> filter { account in + return account != nil + } + |> take(1) + |> mapToSignal { account -> Signal<(Account, FileMediaReference?), NoError> in + guard let account = account else { + return .complete() + } + return account.postbox.messageAtId(messageId) + |> take(1) + |> map { message in + var fileReference: FileMediaReference? + if let message = message { + for media in message.media { + if let file = media as? TelegramMediaFile { + fileReference = .message(message: MessageReference(message), media: file) + } + } + } else { + fileReference = .standalone(media: file) + } + return (account, fileReference) + } + } + |> deliverOnMainQueue).start(next: { [weak self, weak view] accountAndImage in + guard let strongSelf = self else { + return + } + if let fileReference = accountAndImage.1 { + if file.isAnimatedSticker { + let animatedStickerNode: AnimatedStickerNode + if let current = strongSelf.animatedStickerNode { + animatedStickerNode = current + } else { + animatedStickerNode = AnimatedStickerNode() + strongSelf.animatedStickerNode = animatedStickerNode + animatedStickerNode.started = { + guard let strongSelf = self else { + return + } + strongSelf.imageNode.isHidden = true + } + if !strongSelf.imageNode.frame.width.isZero { + animatedStickerNode.frame = strongSelf.imageNode.frame + animatedStickerNode.updateLayout(size: strongSelf.imageNode.frame.size) + } + view?.addSubnode(animatedStickerNode) + } + let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0) + let fittedDimensions = dimensions.aspectFitted(CGSize(width: 512.0, height: 512.0)) + strongSelf.imageNode.setSignal(chatMessageAnimatedSticker(postbox: accountAndImage.0.postbox, file: fileReference.media, small: false, size: fittedDimensions)) + animatedStickerNode.setup(account: accountAndImage.0, resource: .resource(fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + animatedStickerNode.visibility = true + + accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) + strongSelf.fetchedDisposable.set(freeMediaFileInteractiveFetched(account: accountAndImage.0, fileReference: fileReference).start()) + } else if file.isSticker { + if let animatedStickerNode = strongSelf.animatedStickerNode { + animatedStickerNode.removeFromSupernode() + strongSelf.animatedStickerNode = nil + } + strongSelf.imageNode.isHidden = false + + strongSelf.imageNode.setSignal(chatMessageSticker(account: accountAndImage.0, file: file, small: false)) + + accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) + strongSelf.fetchedDisposable.set(freeMediaFileInteractiveFetched(account: accountAndImage.0, fileReference: fileReference).start()) } } - |> deliverOnMainQueue).start(next: { [weak self, weak view] accountAndImage in - guard let strongSelf = self else { - return - } - if let fileReference = accountAndImage.1 { - if file.isAnimatedSticker { - let animatedStickerNode: AnimatedStickerNode - if let current = strongSelf.animatedStickerNode { - animatedStickerNode = current - } else { - animatedStickerNode = AnimatedStickerNode() - strongSelf.animatedStickerNode = animatedStickerNode - animatedStickerNode.started = { - guard let strongSelf = self else { - return - } - strongSelf.imageNode.isHidden = true - } - if !strongSelf.imageNode.frame.width.isZero { - animatedStickerNode.frame = strongSelf.imageNode.frame - animatedStickerNode.updateLayout(size: strongSelf.imageNode.frame.size) - } - view?.addSubnode(animatedStickerNode) - } - let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0) - let fittedDimensions = dimensions.aspectFitted(CGSize(width: 512.0, height: 512.0)) - strongSelf.imageNode.setSignal(chatMessageAnimatedSticker(postbox: accountAndImage.0.postbox, file: fileReference.media, small: false, size: fittedDimensions)) - animatedStickerNode.setup(account: accountAndImage.0, resource: .resource(fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) - animatedStickerNode.visibility = true - - accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) - strongSelf.fetchedDisposable.set(freeMediaFileInteractiveFetched(account: accountAndImage.0, fileReference: fileReference).start()) - } else if file.isSticker { - if let animatedStickerNode = strongSelf.animatedStickerNode { - animatedStickerNode.removeFromSupernode() - strongSelf.animatedStickerNode = nil - } - strongSelf.imageNode.isHidden = false - - strongSelf.imageNode.setSignal(chatMessageSticker(account: accountAndImage.0, file: file, small: false)) - - accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) - strongSelf.fetchedDisposable.set(freeMediaFileInteractiveFetched(account: accountAndImage.0, fileReference: fileReference).start()) - } - } - })) - } + })) } } From ddf709ab5bc5980c571d9718f719ab6c0d523afe Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sat, 24 Aug 2019 06:19:55 +0300 Subject: [PATCH 29/86] Cloud themes support --- .../Sources/AccountContext.swift | 1 + .../Sources/ThemedTextAlertController.swift | 2 +- .../Display/NavigationController.swift | 53 +-- submodules/Display/Display/UIKitUtils.swift | 20 +- .../Sources/ItemListAvatarAndNameItem.swift | 2 +- .../Sources/ItemListPeerActionItem.swift | 2 +- .../Sources/ItemListPeerItem.swift | 2 +- .../Sources/ItemListController.swift | 5 + .../Items/ItemListDisclosureItem.swift | 2 +- .../TGAttachmentCarouselItemView.h | 3 +- .../TGAttachmentCarouselItemView.m | 10 +- .../TGMediaAssetsController.h | 5 +- .../TGMediaAssetsController.m | 12 +- .../TGMediaAssetsPickerController.m | 6 +- .../LegacyComponents/TGMediaAssetsUtils.h | 6 - .../TGMediaPickerController.h | 1 + .../TGMediaPickerModernGalleryMixin.h | 4 +- .../TGMediaPickerModernGalleryMixin.m | 32 +- .../TGMediaPickerSendActionSheetController.m | 9 + .../LegacyComponents/TGPassportAttachMenu.m | 2 +- .../Sources/LegacyAttachmentMenu.swift | 11 +- .../Sources/LegacyMediaPickers.swift | 7 +- .../Sources/SecureIdAuthFormFieldNode.swift | 2 +- .../Sources/SecureIdAuthListFieldNode.swift | 2 +- .../Sources/ItemListSecretChatKeyItem.swift | 2 +- .../project.pbxproj | 16 +- .../LanguageSuggestionController.swift | 368 ------------------ .../NotificationExceptionControllerNode.swift | 44 ++- .../Themes/CreateThemeController.swift | 189 +++++++++ .../Themes/ThemePreviewController.swift | 48 ++- .../Themes/ThemePreviewControllerNode.swift | 26 +- .../Themes/ThemeSettingsAppIconItem.swift | 2 +- .../Themes/ThemeSettingsController.swift | 70 +++- .../Themes/ThemeSettingsThemeItem.swift | 73 ++-- submodules/TelegramApi/Sources/Api0.swift | 16 +- submodules/TelegramApi/Sources/Api1.swift | 182 +++++++-- submodules/TelegramApi/Sources/Api3.swift | 273 ++++++++++--- .../TelegramCore/AccountManager.swift | 2 + .../AccountStateManagementUtils.swift | 2 + .../TelegramCore/EnqueueMessage.swift | 1 - .../TelegramCore/Namespaces.swift | 2 + .../TelegramCore/TelegramCore/Theme.swift | 90 +++++ .../TelegramCore/TelegramCore/Themes.swift | 226 +++++++++++ .../TelegramCore/Wallpapers.swift | 18 +- .../project.pbxproj | 8 + .../DefaultDarkPresentationTheme.swift | 12 +- .../Sources/DefaultDayPresentationTheme.swift | 17 +- .../Sources/MakePresentationTheme.swift | 4 + .../Sources/PresentationData.swift | 2 + .../PresentationResourcesItemList.swift | 30 +- .../PresentationResourcesRootController.swift | 19 +- .../Call List/CallIcon.imageset/Contents.json | 12 + .../CallIcon.imageset/ic_addcall.pdf | Bin 0 -> 4939 bytes .../PeerMutedIcon.imageset/Contents.json | 11 +- .../DialogList_Muted@2x.png | Bin 208 -> 0 bytes .../PeerMutedIcon.imageset/ic_mutedchat.pdf | Bin 0 -> 4283 bytes .../Message/ShareIcon.imageset/Contents.json | 12 +- .../ConversationChannelInlineShareIcon@2x.png | Bin 423 -> 0 bytes .../ConversationChannelInlineShareIcon@3x.png | Bin 622 -> 0 bytes .../ShareIcon.imageset/ic_chat_share.pdf | Bin 0 -> 4140 bytes .../AddChannelIcon.imageset/Contents.json | 12 + .../AddChannelIcon.imageset/ic_addchannel.pdf | Bin 0 -> 4747 bytes .../AddExceptionIcon.imageset/Contents.json | 22 -- .../AddExceptionIcon.imageset/plus@2x.png | Bin 1133 -> 0 bytes .../AddExceptionIcon.imageset/plus@3x.png | Bin 927 -> 0 bytes .../DisclosureArrow.imageset/Contents.json | 12 + .../DisclosureArrow.imageset/ic_open.pdf | Bin 0 -> 3972 bytes .../TelegramUI/ChatController.swift | 97 ++++- .../ChatHistoryEntriesForView.swift | 2 +- .../ChatMessageBubbleItemNode.swift | 2 +- .../ChatRecentActionsControllerNode.swift | 2 + .../ChatScheduleTimeController.swift | 6 +- .../ChatScheduleTimeControllerNode.swift | 6 +- .../TelegramUI/TelegramUI/LegacyCamera.swift | 2 +- .../TelegramUI/OpenChatMessage.swift | 6 +- .../TelegramUI/OpenResolvedUrl.swift | 18 + .../TelegramUI/TelegramUI/OpenUrl.swift | 16 + .../Sources/PresentationThemeSettings.swift | 38 ++ .../UrlHandling/Sources/UrlHandling.swift | 5 + 79 files changed, 1475 insertions(+), 749 deletions(-) delete mode 100644 submodules/SettingsUI/Sources/Language Suggestion/LanguageSuggestionController.swift create mode 100644 submodules/SettingsUI/Sources/Themes/CreateThemeController.swift create mode 100644 submodules/TelegramCore/TelegramCore/Theme.swift create mode 100644 submodules/TelegramCore/TelegramCore/Themes.swift create mode 100644 submodules/TelegramUI/Images.xcassets/Call List/CallIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Call List/CallIcon.imageset/ic_addcall.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/DialogList_Muted@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/ic_mutedchat.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/ShareIcon.imageset/ConversationChannelInlineShareIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/ShareIcon.imageset/ConversationChannelInlineShareIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Message/ShareIcon.imageset/ic_chat_share.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/ic_addchannel.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/plus@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/plus@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Item List/DisclosureArrow.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Item List/DisclosureArrow.imageset/ic_open.pdf diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index 6b90a90d48..c3807a7048 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -166,6 +166,7 @@ public enum ResolvedUrl { case cancelAccountReset(phone: String, hash: String) case share(url: String?, text: String?, to: String?) case wallpaper(WallpaperUrlParameter) + case theme(String) } public enum NavigateToChatKeepStack { diff --git a/submodules/AlertUI/Sources/ThemedTextAlertController.swift b/submodules/AlertUI/Sources/ThemedTextAlertController.swift index 5779ac6b09..26f21b0fbd 100644 --- a/submodules/AlertUI/Sources/ThemedTextAlertController.swift +++ b/submodules/AlertUI/Sources/ThemedTextAlertController.swift @@ -6,7 +6,7 @@ import AccountContext public func textAlertController(context: AccountContext, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal) -> AlertController { let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: title, text: text, actions: actions) + let controller = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: title, text: text, actions: actions, actionLayout: actionLayout) let presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak controller] presentationData in controller?.theme = AlertControllerTheme(presentationTheme: presentationData.theme) }) diff --git a/submodules/Display/Display/NavigationController.swift b/submodules/Display/Display/NavigationController.swift index 616e7dc6fa..e5245c5089 100644 --- a/submodules/Display/Display/NavigationController.swift +++ b/submodules/Display/Display/NavigationController.swift @@ -366,44 +366,7 @@ open class NavigationController: UINavigationController, ContainableController, } } - if let _ = self.controllerView.emptyDetailView { -// transition.updateFrame(view: navigationBackgroundView, frame: navigationBackgroundFrame) -// transition.updateFrame(view: navigationSeparatorView, frame: CGRect(origin: CGPoint(x: navigationBackgroundFrame.minX, y: navigationBackgroundFrame.maxY), size: CGSize(width: navigationBackgroundFrame.width, height: UIScreenPixel))) -// if let image = emptyDetailView.image { -// transition.updateFrame(view: emptyDetailView, frame: CGRect(origin: CGPoint(x: masterData.0.maxX + floor((lastControllerFrameAndLayout.0.size.width - image.size.width) / 2.0), y: floor((lastControllerFrameAndLayout.0.size.height - image.size.height) / 2.0)), size: image.size)) -// } - } else { - // let navigationBackgroundView = UIView() -// navigationBackgroundView.backgroundColor = self.theme.navigationBar.c -// let navigationSeparatorView = UIView() -// navigationSeparatorView.backgroundColor = self.theme.navigationBar.separatorColor -// let emptyDetailView = UIImageView() -// emptyDetailView.image = self.theme.emptyDetailIcon -// emptyDetailView.alpha = 0.0 -// -// self.controllerView.navigationBackgroundView = navigationBackgroundView -// self.controllerView.navigationSeparatorView = navigationSeparatorView -// self.controllerView.emptyDetailView = emptyDetailView -// -// self.controllerView.insertSubview(navigationBackgroundView, at: 0) -// self.controllerView.insertSubview(navigationSeparatorView, at: 1) - // self.controllerView.insertSubview(emptyDetailView, at: 0) - -// navigationBackgroundView.frame = navigationBackgroundFrame -// navigationSeparatorView.frame = CGRect(origin: CGPoint(x: navigationBackgroundFrame.minX, y: navigationBackgroundFrame.maxY), size: CGSize(width: navigationBackgroundFrame.width, height: UIScreenPixel)) -// -// transition.animatePositionAdditive(layer: navigationBackgroundView.layer, offset: CGPoint(x: navigationBackgroundFrame.width, y: 0.0)) -// transition.animatePositionAdditive(layer: navigationSeparatorView.layer, offset: CGPoint(x: navigationBackgroundFrame.width, y: 0.0)) - -// if let image = emptyDetailView.image { -// emptyDetailView.frame = CGRect(origin: CGPoint(x: masterData.0.maxX + floor((lastControllerFrameAndLayout.0.size.width - image.size.width) / 2.0), y: floor((lastControllerFrameAndLayout.0.size.height - image.size.height) / 2.0)), size: image.size) -// } -// -// transition.updateAlpha(layer: emptyDetailView.layer, alpha: 1.0) - } - if let blackout = self.masterDetailsBlackout { - let blackoutFrame: CGRect switch blackout { case .details: @@ -493,15 +456,15 @@ open class NavigationController: UINavigationController, ContainableController, } else if case .masterDetail = layoutConfiguration, i == 1 { controller.navigationBar?.previousItem = .close } else { - controller.navigationBar?.previousItem = .item(viewControllers[i - 1].navigationItem) + controller.navigationBar?.previousItem = .item(self.viewControllers[i - 1].navigationItem) } if i < self._viewControllers.count - 1 { - controller.updateNavigationCustomData((viewControllers[i + 1] as? ViewController)?.customData, progress: 1.0, transition: transition) + controller.updateNavigationCustomData((self.viewControllers[i + 1] as? ViewController)?.customData, progress: 1.0, transition: transition) } else { controller.updateNavigationCustomData(nil, progress: 1.0, transition: transition) } } - viewControllers[i].navigation_setNavigationController(self) + self.viewControllers[i].navigation_setNavigationController(self) if i == 0, let (_, layout) = firstControllerFrameAndLayout { controllersAndFrames.append((true, self._viewControllers[i], layout)) @@ -526,7 +489,15 @@ open class NavigationController: UINavigationController, ContainableController, frame = lastControllerFrameAndLayout.0 } let isAppearing = record.controller.view.superview == nil - (record.controller as? ViewController)?.containerLayoutUpdated(layout, transition: isAppearing ? .immediate : transition) + if let controller = record.controller as? ViewController { + let updatedLayout: ContainerViewLayout + if previousControllers.count == self.viewControllers.count + 1, previousControllers[previousControllers.count - 2].controller === controller { + updatedLayout = layout.withUpdatedInputHeight(controller.hasActiveInput ? layout.inputHeight : nil) + } else { + updatedLayout = layout + } + controller.containerLayoutUpdated(updatedLayout, transition: isAppearing ? .immediate : transition) + } if isAppearing { if isMaster { appearingMasterController = record diff --git a/submodules/Display/Display/UIKitUtils.swift b/submodules/Display/Display/UIKitUtils.swift index 3c9f5ac627..9faf783388 100644 --- a/submodules/Display/Display/UIKitUtils.swift +++ b/submodules/Display/Display/UIKitUtils.swift @@ -83,9 +83,13 @@ public extension UIColor { var red: CGFloat = 0.0 var green: CGFloat = 0.0 var blue: CGFloat = 0.0 - self.getRed(&red, green: &green, blue: &blue, alpha: nil) - - return (UInt32(red * 255.0) << 16) | (UInt32(green * 255.0) << 8) | (UInt32(blue * 255.0)) + if self.getRed(&red, green: &green, blue: &blue, alpha: nil) { + return (UInt32(max(0.0, red) * 255.0) << 16) | (UInt32(max(0.0, green) * 255.0) << 8) | (UInt32(max(0.0, blue) * 255.0)) + } else if self.getWhite(&red, alpha: nil) { + return (UInt32(max(0.0, red) * 255.0) << 16) | (UInt32(max(0.0, red) * 255.0) << 8) | (UInt32(max(0.0, red) * 255.0)) + } else { + return 0 + } } var argb: UInt32 { @@ -93,9 +97,13 @@ public extension UIColor { var green: CGFloat = 0.0 var blue: CGFloat = 0.0 var alpha: CGFloat = 0.0 - self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) - - return (UInt32(alpha * 255.0) << 24) | (UInt32(red * 255.0) << 16) | (UInt32(green * 255.0) << 8) | (UInt32(blue * 255.0)) + if self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) { + return (UInt32(alpha * 255.0) << 24) | (UInt32(max(0.0, red) * 255.0) << 16) | (UInt32(max(0.0, green) * 255.0) << 8) | (UInt32(max(0.0, blue) * 255.0)) + } else if self.getWhite(&red, alpha: &alpha) { + return (UInt32(max(0.0, alpha) * 255.0) << 24) | (UInt32(max(0.0, red) * 255.0) << 16) | (UInt32(max(0.0, red) * 255.0) << 8) | (UInt32(max(0.0, red) * 255.0)) + } else { + return 0 + } } var hsv: (CGFloat, CGFloat, CGFloat) { diff --git a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift index 432d266f93..e16ca21c30 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift +++ b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift @@ -927,7 +927,7 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo if strongSelf.arrowNode.supernode == nil { strongSelf.addSubnode(strongSelf.arrowNode) } - strongSelf.arrowNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - 15.0 - arrowImage.size.width, y: floor((layout.contentSize.height - arrowImage.size.height) / 2.0)), size: arrowImage.size) + strongSelf.arrowNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - 7.0 - arrowImage.size.width, y: floor((layout.contentSize.height - arrowImage.size.height) / 2.0)), size: arrowImage.size) } else if strongSelf.arrowNode.supernode != nil { strongSelf.arrowNode.removeFromSupernode() } diff --git a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift index 4d763c81a9..e5b497cfdd 100644 --- a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift +++ b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift @@ -196,7 +196,7 @@ class ItemListPeerActionItemNode: ListViewItemNode { strongSelf.iconNode.image = item.icon if let image = item.icon { - transition.updateFrame(node: strongSelf.iconNode, frame: CGRect(origin: CGPoint(x: params.leftInset + editingOffset + floor((leftInset - params.leftInset - image.size.width) / 2.0), y: floor((contentSize.height - image.size.height) / 2.0)), size: image.size)) + transition.updateFrame(node: strongSelf.iconNode, frame: CGRect(origin: CGPoint(x: params.leftInset + editingOffset + floor((leftInset - params.leftInset - image.size.width) / 2.0) + 3.0, y: floor((contentSize.height - image.size.height) / 2.0)), size: image.size)) } if strongSelf.backgroundNode.supernode == nil { diff --git a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift index a087d6a945..f66a5dfd24 100644 --- a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift +++ b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift @@ -859,7 +859,7 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo if let labelArrowNode = self.labelArrowNode { if let image = labelArrowNode.image { - let labelArrowNodeFrame = CGRect(origin: CGPoint(x: revealOffset + params.width - rightLabelInset - image.size.width, y: labelArrowNode.frame.minY), size: image.size) + let labelArrowNodeFrame = CGRect(origin: CGPoint(x: revealOffset + params.width - rightLabelInset - image.size.width + 8.0, y: labelArrowNode.frame.minY), size: image.size) transition.updateFrame(node: labelArrowNode, frame: labelArrowNodeFrame) rightLabelInset += 19.0 } diff --git a/submodules/ItemListUI/Sources/ItemListController.swift b/submodules/ItemListUI/Sources/ItemListController.swift index 20edf03b49..81344e6c05 100644 --- a/submodules/ItemListUI/Sources/ItemListController.swift +++ b/submodules/ItemListUI/Sources/ItemListController.swift @@ -25,6 +25,7 @@ public enum ItemListNavigationButtonStyle { public enum ItemListNavigationButtonContentIcon { case search case add + case action } public enum ItemListNavigationButtonContent: Equatable { @@ -309,6 +310,8 @@ open class ItemListController: ViewController, KeyShor image = PresentationResourcesRootController.navigationCompactSearchIcon(controllerState.theme) case .add: image = PresentationResourcesRootController.navigationAddIcon(controllerState.theme) + case .action: + image = PresentationResourcesRootController.navigationShareIcon(controllerState.theme) } item = UIBarButtonItem(image: image, style: leftNavigationButton.style.barButtonItemStyle, target: strongSelf, action: #selector(strongSelf.leftNavigationButtonPressed)) } @@ -364,6 +367,8 @@ open class ItemListController: ViewController, KeyShor image = PresentationResourcesRootController.navigationCompactSearchIcon(controllerState.theme) case .add: image = PresentationResourcesRootController.navigationAddIcon(controllerState.theme) + case .action: + image = PresentationResourcesRootController.navigationShareIcon(controllerState.theme) } item = UIBarButtonItem(image: image, style: style.barButtonItemStyle, target: strongSelf, action: action) } diff --git a/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift b/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift index bfcda62617..6986cf2537 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListDisclosureItem.swift @@ -431,7 +431,7 @@ public class ItemListDisclosureItemNode: ListViewItemNode, ItemListItemNode { } if let arrowImage = strongSelf.arrowNode.image { - strongSelf.arrowNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - 15.0 - arrowImage.size.width, y: floorToScreenPixels((height - arrowImage.size.height) / 2.0)), size: arrowImage.size) + strongSelf.arrowNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - 7.0 - arrowImage.size.width, y: floorToScreenPixels((height - arrowImage.size.height) / 2.0)), size: arrowImage.size) } switch item.disclosureStyle { diff --git a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h index 3f218c9302..da42f7f657 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h +++ b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.h @@ -32,12 +32,13 @@ @property (nonatomic) bool disableStickers; @property (nonatomic) bool hasSilentPosting; @property (nonatomic) bool hasSchedule; +@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t)); @property (nonatomic, strong) NSArray *underlyingViews; @property (nonatomic, assign) bool openEditor; @property (nonatomic, copy) void (^cameraPressed)(TGAttachmentCameraView *cameraView); -@property (nonatomic, copy) void (^sendPressed)(TGMediaAsset *currentItem, bool asFiles, TGMediaPickerGalleryCompletionMode mode); +@property (nonatomic, copy) void (^sendPressed)(TGMediaAsset *currentItem, bool asFiles, bool silentPosting, int32_t scheduleTime); @property (nonatomic, copy) void (^avatarCompletionBlock)(UIImage *image); @property (nonatomic, copy) void (^editorOpened)(void); diff --git a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m index 8f78600fb8..17318f32fd 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m +++ b/submodules/LegacyComponents/LegacyComponents/TGAttachmentCarouselItemView.m @@ -264,7 +264,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; { if (strongSelf->_selectionContext.allowGrouping) [[NSUserDefaults standardUserDefaults] setObject:@(!strongSelf->_selectionContext.grouping) forKey:@"TG_mediaGroupingDisabled_v0"]; - strongSelf.sendPressed(nil, false, false); + strongSelf.sendPressed(nil, false, false, 0); } }]; [_sendMediaItemView setHidden:true animated:false]; @@ -276,7 +276,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; { __strong TGAttachmentCarouselItemView *strongSelf = weakSelf; if (strongSelf != nil && strongSelf.sendPressed != nil) - strongSelf.sendPressed(nil, true, false); + strongSelf.sendPressed(nil, true, false, 0); }]; _sendFileItemView.requiresDivider = false; [_sendFileItemView setHidden:true animated:false]; @@ -774,14 +774,14 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; strongSelf->_galleryMixin = nil; }; - mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, TGMediaPickerGalleryCompletionMode mode) + mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, bool silentPosting, int32_t scheduleTime) { __strong TGAttachmentCarouselItemView *strongSelf = weakSelf; if (strongSelf != nil && strongSelf.sendPressed != nil) { if (strongSelf->_selectionContext.allowGrouping) [[NSUserDefaults standardUserDefaults] setObject:@(!strongSelf->_selectionContext.grouping) forKey:@"TG_mediaGroupingDisabled_v0"]; - strongSelf.sendPressed(item.asset, strongSelf.asFile, mode); + strongSelf.sendPressed(item.asset, strongSelf.asFile, silentPosting, scheduleTime); } }; @@ -802,7 +802,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; thumbnailImage = cell.imageView.image; TGMediaPickerModernGalleryMixin *mixin = [[TGMediaPickerModernGalleryMixin alloc] initWithContext:_context item:asset fetchResult:_fetchResult parentController:self.parentController thumbnailImage:thumbnailImage selectionContext:_selectionContext editingContext:_editingContext suggestionContext:self.suggestionContext hasCaptions:(_allowCaptions && !_forProfilePhoto) allowCaptionEntities:self.allowCaptionEntities hasTimer:self.hasTimer onlyCrop:self.onlyCrop inhibitDocumentCaptions:_inhibitDocumentCaptions inhibitMute:self.inhibitMute asFile:self.asFile itemsLimit:TGAttachmentDisplayedAssetLimit recipientName:self.recipientName hasSilentPosting:self.hasSilentPosting hasSchedule:self.hasSchedule]; - + mixin.presentScheduleController = self.presentScheduleController; __weak TGAttachmentCarouselItemView *weakSelf = self; mixin.thumbnailSignalForItem = ^SSignal *(id item) { diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h index 2264bdf0f9..d60bdba4ba 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.h @@ -59,6 +59,7 @@ typedef enum @property (nonatomic, assign) bool inhibitMute; @property (nonatomic, assign) bool hasSilentPosting; @property (nonatomic, assign) bool hasSchedule; +@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t)); @property (nonatomic, assign) bool liveVideoUploadEnabled; @property (nonatomic, assign) bool shouldShowFileTipIfNeeded; @@ -67,7 +68,7 @@ typedef enum @property (nonatomic, copy) NSDictionary *(^descriptionGenerator)(id, NSString *, NSArray *, NSString *); @property (nonatomic, copy) void (^avatarCompletionBlock)(UIImage *image); -@property (nonatomic, copy) void (^completionBlock)(NSArray *signals, TGMediaPickerGalleryCompletionMode mode); +@property (nonatomic, copy) void (^completionBlock)(NSArray *signals, bool silentPosting, int32_t scheduleTime); @property (nonatomic, copy) void (^singleCompletionBlock)(id item, TGMediaEditingContext *editingContext); @property (nonatomic, copy) void (^dismissalBlock)(void); @property (nonatomic, copy) void (^selectionBlock)(TGMediaAsset *asset, UIImage *); @@ -85,7 +86,7 @@ typedef enum - (NSArray *)resultSignalsWithCurrentItem:(TGMediaAsset *)currentItem descriptionGenerator:(id (^)(id, NSString *, NSArray *, NSString *))descriptionGenerator; - (void)completeWithAvatarImage:(UIImage *)image; -- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem mode:(TGMediaPickerGalleryCompletionMode)mode; +- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem silentPosting:(bool)silentPosting scheduleTime:(int32_t)scheduleTime; - (void)dismiss; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m index 36417330bc..a542031965 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsController.m @@ -122,6 +122,7 @@ pickerController.onlyCrop = strongController.onlyCrop; pickerController.hasSilentPosting = strongController.hasSilentPosting; pickerController.hasSchedule = strongController.hasSchedule; + pickerController.presentScheduleController = strongController.presentScheduleController; [strongController pushViewController:pickerController animated:true]; }; [groupsController loadViewIfNeeded]; @@ -213,6 +214,11 @@ self.pickerController.hasSchedule = hasSchedule; } +- (void)setPresentScheduleController:(void (^)(void (^)(int32_t)))presentScheduleController { + _presentScheduleController = [presentScheduleController copy]; + self.pickerController.presentScheduleController = presentScheduleController; +} + - (void)setOnlyCrop:(bool)onlyCrop { _onlyCrop = onlyCrop; @@ -457,7 +463,7 @@ { __strong TGMediaAssetsController *strongSelf = weakSelf; if (strongSelf != nil) - [strongSelf completeWithCurrentItem:nil mode:TGMediaPickerGalleryCompletionModeGeneric]; + [strongSelf completeWithCurrentItem:nil silentPosting:false scheduleTime:0]; }; } @@ -538,12 +544,12 @@ self.avatarCompletionBlock(image); } -- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem mode:(TGMediaPickerGalleryCompletionMode)mode +- (void)completeWithCurrentItem:(TGMediaAsset *)currentItem silentPosting:(bool)silentPosting scheduleTime:(int32_t)scheduleTime { if (self.completionBlock != nil) { NSArray *signals = [self resultSignalsWithCurrentItem:currentItem descriptionGenerator:self.descriptionGenerator]; - self.completionBlock(signals, mode); + self.completionBlock(signals, silentPosting, scheduleTime); } else if (self.singleCompletionBlock != nil) { diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m index acad64e531..2eaa4c328c 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsPickerController.m @@ -311,13 +311,13 @@ strongSelf->_galleryMixin = nil; }; - mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, TGMediaPickerGalleryCompletionMode mode) + mixin.completeWithItem = ^(TGMediaPickerGalleryItem *item, bool silentPosting, int32_t scheduleTime) { __strong TGMediaAssetsPickerController *strongSelf = weakSelf; if (strongSelf == nil) return; - [(TGMediaAssetsController *)strongSelf.navigationController completeWithCurrentItem:item.asset mode:mode]; + [(TGMediaAssetsController *)strongSelf.navigationController completeWithCurrentItem:item.asset silentPosting:silentPosting scheduleTime:scheduleTime]; }; } @@ -341,7 +341,7 @@ bool asFile = (_intent == TGMediaAssetsControllerSendFileIntent); TGMediaPickerModernGalleryMixin *mixin = [self _galleryMixinForContext:_context item:asset thumbnailImage:thumbnailImage selectionContext:self.selectionContext editingContext:self.editingContext suggestionContext:self.suggestionContext hasCaptions:self.captionsEnabled allowCaptionEntities:self.allowCaptionEntities inhibitDocumentCaptions:self.inhibitDocumentCaptions asFile:asFile]; - + mixin.presentScheduleController = self.presentScheduleController; __weak TGMediaAssetsPickerController *weakSelf = self; mixin.thumbnailSignalForItem = ^SSignal *(id item) { diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h index 993fedd8a3..b4d5ed7c8e 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaAssetsUtils.h @@ -4,12 +4,6 @@ @class TGMediaAsset; @class TGMediaSelectionContext; -typedef NS_ENUM(NSUInteger, TGMediaPickerGalleryCompletionMode) { - TGMediaPickerGalleryCompletionModeGeneric, - TGMediaPickerGalleryCompletionModeSilent, - TGMediaPickerGalleryCompletionModeSchedule -}; - @interface TGMediaAssetsPreheatMixin : NSObject @property (nonatomic, copy) NSInteger (^assetCount)(void); diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h index cf734aa4f2..b78e565560 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerController.h @@ -29,6 +29,7 @@ @property (nonatomic, strong) NSString *recipientName; @property (nonatomic, assign) bool hasSilentPosting; @property (nonatomic, assign) bool hasSchedule; +@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t)); @property (nonatomic, strong) TGMediaAssetsPallete *pallete; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h index 8e4401c5c8..d3deb03362 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.h @@ -22,11 +22,13 @@ @property (nonatomic, copy) void (^didTransitionOut)(); @property (nonatomic, copy) UIView *(^referenceViewForItem)(TGMediaPickerGalleryItem *); -@property (nonatomic, copy) void (^completeWithItem)(TGMediaPickerGalleryItem *item, TGMediaPickerGalleryCompletionMode mode); +@property (nonatomic, copy) void (^completeWithItem)(TGMediaPickerGalleryItem *item, bool silentPosting, int32_t scheduleTime); @property (nonatomic, copy) void (^editorOpened)(void); @property (nonatomic, copy) void (^editorClosed)(void); +@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t)); + - (instancetype)initWithContext:(id)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule; - (instancetype)initWithContext:(id)context item:(id)item momentList:(TGMediaAssetMomentList *)momentList parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m index 29960e53d3..1ce2b7b2e8 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m @@ -136,7 +136,7 @@ strongSelf->_galleryModel.dismiss(true, false); if (strongSelf.completeWithItem != nil) - strongSelf.completeWithItem(item, false); + strongSelf.completeWithItem(item, false, 0); }; model.interfaceView.doneLongPressed = ^(TGMediaPickerGalleryItem *item) { @@ -156,27 +156,33 @@ strongSelf->_galleryModel.dismiss(true, false); if (strongSelf.completeWithItem != nil) - strongSelf.completeWithItem(item, TGMediaPickerGalleryCompletionModeGeneric); + strongSelf.completeWithItem(item, false, 0); }; controller.sendSilently = ^{ __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; if (strongSelf == nil) return; - strongSelf->_galleryModel.dismiss(true, TGMediaPickerGalleryCompletionModeSilent); - - if (strongSelf.completeWithItem != nil) - strongSelf.completeWithItem(item, true); - }; - controller.schedule = ^{ - __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; - if (strongSelf == nil) - return; - strongSelf->_galleryModel.dismiss(true, false); if (strongSelf.completeWithItem != nil) - strongSelf.completeWithItem(item, TGMediaPickerGalleryCompletionModeSchedule); + strongSelf.completeWithItem(item, true, 0); + }; + controller.schedule = ^{ + __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; + if (strongSelf == nil) + return; + + strongSelf.presentScheduleController(^(int32_t time) { + __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; + if (strongSelf == nil) + return; + + strongSelf->_galleryModel.dismiss(true, false); + + if (strongSelf.completeWithItem != nil) + strongSelf.completeWithItem(item, false, time); + }); }; TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:[strongSelf->_context makeOverlayWindowManager] parentController:strongSelf->_parentController contentController:controller]; diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m index d27edeb0c4..9d4365a90e 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m @@ -115,12 +115,21 @@ _containerView.layer.cornerRadius = 12.0; [self.view addSubview:_containerView]; + __weak TGMediaPickerSendActionSheetController *weakSelf = self; if (_canSendSilently) { _sendSilentlyButton = [[TGMediaPickerSendActionSheetItemView alloc] initWithTitle:TGLocalized(@"Conversation.SendMessage.SendSilently") icon:TGComponentsImageNamed(@"MediaMute")]; + _sendSilentlyButton.pressed = ^{ + __strong TGMediaPickerSendActionSheetController *strongSelf = weakSelf; + [strongSelf sendSilentlyPressed]; + }; [_containerView addSubview:_sendSilentlyButton]; } _scheduleButton = [[TGMediaPickerSendActionSheetItemView alloc] initWithTitle:TGLocalized(@"Conversation.SendMessage.ScheduleMessage") icon:TGComponentsImageNamed(@"MediaSchedule")]; + _scheduleButton.pressed = ^{ + __strong TGMediaPickerSendActionSheetController *strongSelf = weakSelf; + [strongSelf schedulePressed]; + }; [_containerView addSubview:_scheduleButton]; TGMediaAssetsPallete *pallete = nil; diff --git a/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m b/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m index 606e7184c4..12d35852dc 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m +++ b/submodules/LegacyComponents/LegacyComponents/TGPassportAttachMenu.m @@ -67,7 +67,7 @@ [TGPassportAttachMenu _displayCameraWithView:cameraView menuController:strongController parentController:strongParentController context:context intent:intent uploadAction:uploadAction]; }; - carouselItem.sendPressed = ^(TGMediaAsset *currentItem, __unused bool asFiles, __unused TGMediaPickerGalleryCompletionMode mode) + carouselItem.sendPressed = ^(TGMediaAsset *currentItem, __unused bool asFiles, __unused bool silentPosting, __unused int32_t scheduleTime) { __strong TGMenuSheetController *strongController = weakController; if (strongController == nil) diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift index fce72c2ae6..f2a833798e 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift @@ -20,7 +20,7 @@ public struct LegacyAttachmentMenuMediaEditing: OptionSet { public static let imageOrVideo = LegacyAttachmentMenuMediaEditing(rawValue: 1 << 0) } -public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController { +public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentScheduleController: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController { let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat let controller = TGMenuSheetController(context: parentController.context, dark: false)! @@ -77,7 +77,12 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaO carouselItem.hasSilentPosting = !isSecretChat } carouselItem.hasSchedule = !isSecretChat - carouselItem.sendPressed = { [weak controller, weak carouselItem] currentItem, asFiles, mode in + carouselItem.presentScheduleController = { done in + presentScheduleController { time in + done?(time) + } + } + carouselItem.sendPressed = { [weak controller, weak carouselItem] currentItem, asFiles, silentPosting, scheduleTime in if let controller = controller, let carouselItem = carouselItem { let intent: TGMediaAssetsControllerIntent = asFiles ? TGMediaAssetsControllerSendFileIntent : TGMediaAssetsControllerSendMediaIntent let signals = TGMediaAssetsController.resultSignals(for: carouselItem.selectionContext, editingContext: carouselItem.editingContext, intent: intent, currentItem: currentItem, storeAssets: true, useMediaCache: false, descriptionGenerator: legacyAssetPickerItemGenerator(), saveEditedPhotos: saveEditedPhotos) @@ -85,7 +90,7 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaO presentCantSendMultipleFiles() } else { controller.dismiss(animated: true) - sendMessagesWithSignals(signals, false) + sendMessagesWithSignals(signals, silentPosting, scheduleTime) } } }; diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift index 1bef9419c7..a1ed9bffc6 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift @@ -17,7 +17,7 @@ public func guessMimeTypeByFileExtension(_ ext: String) -> String { return TGMimeTypeMap.mimeType(forExtension: ext) ?? "application/binary" } -public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, context: AccountContext, peer: Peer, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false, initialCaption: String, presentWebSearch: (() -> Void)?, presentSelectionLimitExceeded: @escaping () -> Void) { +public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, context: AccountContext, peer: Peer, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false, initialCaption: String, presentWebSearch: (() -> Void)?, presentSelectionLimitExceeded: @escaping () -> Void, presentScheduleController: @escaping (@escaping (Int32) -> Void) -> Void) { let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat controller.captionsEnabled = captionsEnabled @@ -30,6 +30,11 @@ public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, co controller.hasSilentPosting = !isSecretChat } controller.hasSchedule = !isSecretChat + controller.presentScheduleController = { done in + presentScheduleController { time in + done?(time) + } + } controller.dismissalBlock = { } controller.selectionLimitExceeded = { diff --git a/submodules/PassportUI/Sources/SecureIdAuthFormFieldNode.swift b/submodules/PassportUI/Sources/SecureIdAuthFormFieldNode.swift index 0290391218..438f8eb2c9 100644 --- a/submodules/PassportUI/Sources/SecureIdAuthFormFieldNode.swift +++ b/submodules/PassportUI/Sources/SecureIdAuthFormFieldNode.swift @@ -1005,7 +1005,7 @@ final class SecureIdAuthFormFieldNode: ASDisplayNode { transition.updateFrame(node: self.highlightedBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: -(hasPrevious ? UIScreenPixel : 0.0)), size: CGSize(width: width, height: height + (hasPrevious ? UIScreenPixel : 0.0)))) if let image = self.disclosureNode.image { - self.disclosureNode.frame = CGRect(origin: CGPoint(x: width - 15.0 - image.size.width, y: floor((height - image.size.height) / 2.0)), size: image.size) + self.disclosureNode.frame = CGRect(origin: CGPoint(x: width - 7.0 - image.size.width, y: floor((height - image.size.height) / 2.0)), size: image.size) } if let image = self.checkNode.image { diff --git a/submodules/PassportUI/Sources/SecureIdAuthListFieldNode.swift b/submodules/PassportUI/Sources/SecureIdAuthListFieldNode.swift index 5e7005e5c9..fff18c5755 100644 --- a/submodules/PassportUI/Sources/SecureIdAuthListFieldNode.swift +++ b/submodules/PassportUI/Sources/SecureIdAuthListFieldNode.swift @@ -240,7 +240,7 @@ final class SecureIdAuthListFieldNode: ASDisplayNode { transition.updateFrame(node: self.highlightedBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: -(hasPrevious ? UIScreenPixel : 0.0)), size: CGSize(width: width, height: height + (hasPrevious ? UIScreenPixel : 0.0)))) if let image = self.disclosureNode.image { - self.disclosureNode.frame = CGRect(origin: CGPoint(x: width - 15.0 - image.size.width, y: floor((height - image.size.height) / 2.0)), size: image.size) + self.disclosureNode.frame = CGRect(origin: CGPoint(x: width - 7.0 - image.size.width, y: floor((height - image.size.height) / 2.0)), size: image.size) } return height diff --git a/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift b/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift index 0eec849879..e39bc62ac5 100644 --- a/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift +++ b/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift @@ -273,7 +273,7 @@ class ItemListSecretChatKeyItemNode: ListViewItemNode { } if let arrowImage = strongSelf.arrowNode.image { - strongSelf.arrowNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - 15.0 - arrowImage.size.width, y: 15.0), size: arrowImage.size) + strongSelf.arrowNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - 7.0 - arrowImage.size.width, y: 15.0), size: arrowImage.size) } switch item.disclosureStyle { diff --git a/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj index cc24ab68cd..dd27f05c9a 100644 --- a/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 09B4A9B823102B7A005C2E08 /* CreateThemeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B723102B7A005C2E08 /* CreateThemeController.swift */; }; D03E465223075D930049C28B /* SettingsUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E465023075D930049C28B /* SettingsUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E466823075E660049C28B /* TabBarAccountSwitchControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465C23075E630049C28B /* TabBarAccountSwitchControllerNode.swift */; }; D03E466923075E660049C28B /* LogoutOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465D23075E630049C28B /* LogoutOptionsController.swift */; }; @@ -25,7 +26,6 @@ D03E467F23075EE90049C28B /* NotificationExceptionSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467C23075EE90049C28B /* NotificationExceptionSettingsController.swift */; }; D03E468023075EE90049C28B /* NotificationExceptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467D23075EE90049C28B /* NotificationExceptions.swift */; }; D03E468123075EE90049C28B /* NotificationExceptionControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E467E23075EE90049C28B /* NotificationExceptionControllerNode.swift */; }; - D03E468423075EF60049C28B /* LanguageSuggestionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468323075EF60049C28B /* LanguageSuggestionController.swift */; }; D03E468A23075F010049C28B /* SettingsSearchRecentQueries.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468523075EFF0049C28B /* SettingsSearchRecentQueries.swift */; }; D03E468B23075F010049C28B /* SettingsSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468623075F000049C28B /* SettingsSearchItem.swift */; }; D03E468C23075F010049C28B /* SettingsSearchableItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E468723075F000049C28B /* SettingsSearchableItems.swift */; }; @@ -191,6 +191,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 09B4A9B723102B7A005C2E08 /* CreateThemeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateThemeController.swift; sourceTree = ""; }; D03E464D23075D930049C28B /* SettingsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SettingsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E465023075D930049C28B /* SettingsUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsUI.h; sourceTree = ""; }; D03E465123075D930049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -211,7 +212,6 @@ D03E467C23075EE90049C28B /* NotificationExceptionSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptionSettingsController.swift; sourceTree = ""; }; D03E467D23075EE90049C28B /* NotificationExceptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptions.swift; sourceTree = ""; }; D03E467E23075EE90049C28B /* NotificationExceptionControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptionControllerNode.swift; sourceTree = ""; }; - D03E468323075EF60049C28B /* LanguageSuggestionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageSuggestionController.swift; sourceTree = ""; }; D03E468523075EFF0049C28B /* SettingsSearchRecentQueries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchRecentQueries.swift; sourceTree = ""; }; D03E468623075F000049C28B /* SettingsSearchItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchItem.swift; sourceTree = ""; }; D03E468723075F000049C28B /* SettingsSearchableItems.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSearchableItems.swift; sourceTree = ""; }; @@ -484,7 +484,6 @@ isa = PBXGroup; children = ( D03E467423075E6C0049C28B /* Search */, - D03E467523075E920049C28B /* Language Suggestion */, D03E467623075EA90049C28B /* Notifications */, D03E468223075EEB0049C28B /* Privacy and Security */, D03E46B423075F610049C28B /* Data and Storage */, @@ -527,14 +526,6 @@ path = Search; sourceTree = ""; }; - D03E467523075E920049C28B /* Language Suggestion */ = { - isa = PBXGroup; - children = ( - D03E468323075EF60049C28B /* LanguageSuggestionController.swift */, - ); - path = "Language Suggestion"; - sourceTree = ""; - }; D03E467623075EA90049C28B /* Notifications */ = { isa = PBXGroup; children = ( @@ -658,6 +649,7 @@ D03E46E523075FD40049C28B /* WallpaperGalleryToolbarNode.swift */, D03E46EB23075FD60049C28B /* WallpaperPatternPanelNode.swift */, D03E46EE23075FD60049C28B /* WallpaperSearchRecentQueries.swift */, + 09B4A9B723102B7A005C2E08 /* CreateThemeController.swift */, ); path = Themes; sourceTree = ""; @@ -939,7 +931,7 @@ D03E468E23075F010049C28B /* SettingsSearchRecentItem.swift in Sources */, D03E467223075E660049C28B /* ChangePhoneNumberCodeController.swift in Sources */, D03E466823075E660049C28B /* TabBarAccountSwitchControllerNode.swift in Sources */, - D03E468423075EF60049C28B /* LanguageSuggestionController.swift in Sources */, + 09B4A9B823102B7A005C2E08 /* CreateThemeController.swift in Sources */, D03E471623075FE40049C28B /* WallpaperColorPanelNode.swift in Sources */, D03E470023075FE40049C28B /* ThemeColorsGridControllerItem.swift in Sources */, D03E468B23075F010049C28B /* SettingsSearchItem.swift in Sources */, diff --git a/submodules/SettingsUI/Sources/Language Suggestion/LanguageSuggestionController.swift b/submodules/SettingsUI/Sources/Language Suggestion/LanguageSuggestionController.swift deleted file mode 100644 index e77eb77318..0000000000 --- a/submodules/SettingsUI/Sources/Language Suggestion/LanguageSuggestionController.swift +++ /dev/null @@ -1,368 +0,0 @@ -import Foundation -import UIKit -import SwiftSignalKit -import AsyncDisplayKit -import Display -import TelegramCore -import TelegramPresentationData -import ActivityIndicator -import AccountContext - -struct LanguageSuggestionControllerStrings { - let ChooseLanguage: String - let Other: String - let English: String - - init(localization: SuggestedLocalizationInfo) { - var chooseLanguage = "Choose Your Language" - var other = "Other" - var english = "English" - - for entry in localization.extractedEntries { - switch entry { - case let .string(key, value): - switch key { - case "Localization.ChooseLanguage": - chooseLanguage = value - case "Localization.LanguageOther": - other = value - case "Localization.EnglishLanguageName": - english = value - default: - break - } - default: - break - } - } - - self.ChooseLanguage = chooseLanguage - self.Other = other - self.English = english - } - - init(bundle: Bundle?) { - var chooseLanguage = "Choose Your Language" - var other = "Other" - var english = "English" - - if let bundle = bundle { - for key in LanguageSuggestionControllerStrings.keys { - let value = bundle.localizedString(forKey: key, value: nil, table: nil) - if value != key { - switch key { - case "Localization.ChooseLanguage": - chooseLanguage = value - case "Localization.LanguageOther": - other = value - case "Localization.EnglishLanguageName": - english = value - default: - break - } - } - } - } - - self.ChooseLanguage = chooseLanguage - self.Other = other - self.English = english - } - - static let keys: [String] = ["Localization.ChooseLanguage", - "Localization.LanguageOther", - "Localization.EnglishLanguageName"] -} - -private enum LanguageSuggestionItemType { - case localization(String) - case disclosure - case action -} - -private struct LanguageSuggestionItem { - public let type: LanguageSuggestionItemType - public let title: String - public let subtitle: String? - public let action: () -> Void - - public init(type: LanguageSuggestionItemType, title: String, subtitle: String?, action: @escaping () -> Void) { - self.type = type - self.title = title - self.subtitle = subtitle - self.action = action - } -} - -private final class LanguageSuggestionItemNode: HighlightableButtonNode { - private let backgroundNode: ASDisplayNode - private let separatorNode: ASDisplayNode - private let subtitleNode: ASTextNode - private let iconNode: ASImageNode - - let item: LanguageSuggestionItem - - override var isSelected: Bool { - didSet { - if case .localization = self.item.type { - self.iconNode.isHidden = !self.isSelected - } - } - } - - init(theme: PresentationTheme, item: LanguageSuggestionItem) { - self.item = item - - self.backgroundNode = ASDisplayNode() - self.backgroundNode.isLayerBacked = true - self.backgroundNode.backgroundColor = theme.actionSheet.opaqueItemHighlightedBackgroundColor - self.backgroundNode.alpha = 0.0 - - self.separatorNode = ASDisplayNode() - self.separatorNode.backgroundColor = theme.actionSheet.opaqueItemSeparatorColor - - self.subtitleNode = ASTextNode() - - self.iconNode = ASImageNode() - - super.init() - - self.addSubnode(self.subtitleNode) - self.addSubnode(self.separatorNode) - self.addSubnode(self.iconNode) - - var color: UIColor = theme.actionSheet.primaryTextColor - var alignment: ASHorizontalAlignment = .left - var inset: CGFloat = 19.0 - var icon: UIImage? - switch item.type { - case .action: - alignment = .middle - color = theme.actionSheet.controlAccentColor - inset = 0.0 - case .disclosure: - icon = PresentationResourcesItemList.disclosureArrowImage(theme) - case .localization: - icon = PresentationResourcesItemList.checkIconImage(theme) - } - - self.iconNode.image = icon - self.contentHorizontalAlignment = alignment - self.setTitle(item.title, with: Font.regular(17.0), with: color, for: []) - - var titleVerticalOffset: CGFloat = 0.0 - if let subtitle = item.subtitle { - self.subtitleNode.attributedText = NSAttributedString(string: subtitle, font: Font.regular(14.0), textColor: theme.actionSheet.secondaryTextColor) - titleVerticalOffset = 20.0 - } - self.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: inset, bottom: titleVerticalOffset, right: 0.0) - - self.highligthedChanged = { [weak self] value in - if let strongSelf = self { - if value { - if strongSelf.backgroundNode.supernode == nil { - strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) - } - strongSelf.backgroundNode.layer.removeAnimation(forKey: "opacity") - strongSelf.backgroundNode.alpha = 1.0 - } else if !strongSelf.backgroundNode.alpha.isZero { - strongSelf.backgroundNode.alpha = 0.0 - strongSelf.backgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25) - } - } - } - } - - override func didLoad() { - super.didLoad() - - self.addTarget(self, action: #selector(self.pressed), forControlEvents: .touchUpInside) - } - - @objc func pressed() { - self.item.action() - } - - public func updateLayout(_ constrainedSize: CGSize) -> CGSize { - let bounds = CGRect(origin: CGPoint(), size: CGSize(width: constrainedSize.width, height: self.item.subtitle != nil ? 58.0 : 44.0)) - self.backgroundNode.frame = bounds - - let subtitleSize = self.subtitleNode.measure(bounds.size) - self.subtitleNode.frame = CGRect(origin: CGPoint(x: 19.0, y: 31.0), size: subtitleSize) - self.separatorNode.frame = CGRect(x: 0.0, y: bounds.height - UIScreenPixel, width: bounds.width, height: UIScreenPixel) - if let icon = self.iconNode.image { - self.iconNode.frame = CGRect(origin: CGPoint(x: bounds.width - icon.size.width - 19.0, y: floorToScreenPixels((bounds.height - icon.size.height) / 2.0)), size: icon.size) - } - return bounds.size - } -} - -private final class LanguageSuggestionAlertContentNode: AlertContentNode { - private var validLayout: CGSize? - - private let titleNode: ASTextNode - private let subtitleNode: ASTextNode - private let titleSeparatorNode: ASDisplayNode - private let activityIndicator: ActivityIndicator - - private var nodes: [LanguageSuggestionItemNode] - - private let disposable = MetaDisposable() - - override var dismissOnOutsideTap: Bool { - return self.isUserInteractionEnabled - } - - init(theme: PresentationTheme, strings: LanguageSuggestionControllerStrings, englishStrings: LanguageSuggestionControllerStrings, suggestedLocalization: LocalizationInfo, openSelection: @escaping () -> Void, applyLocalization: @escaping (String, () -> Void) -> Void, dismiss: @escaping () -> Void) { - let selectedLocalization = ValuePromise(suggestedLocalization.languageCode, ignoreRepeated: true) - - self.titleNode = ASTextNode() - self.titleNode.attributedText = NSAttributedString(string: strings.ChooseLanguage, font: Font.bold(17.0), textColor: theme.actionSheet.primaryTextColor, paragraphAlignment: .center) - self.titleNode.maximumNumberOfLines = 2 - - self.subtitleNode = ASTextNode() - self.subtitleNode.attributedText = NSAttributedString(string: englishStrings.ChooseLanguage, font: Font.regular(14.0), textColor: theme.actionSheet.secondaryTextColor, paragraphAlignment: .center) - self.subtitleNode.maximumNumberOfLines = 2 - - self.titleSeparatorNode = ASDisplayNode() - self.titleSeparatorNode.backgroundColor = theme.actionSheet.opaqueItemSeparatorColor - - self.activityIndicator = ActivityIndicator(type: .custom(theme.actionSheet.controlAccentColor, 22.0, 1.0, false)) - self.activityIndicator.isHidden = true - - var items: [LanguageSuggestionItem] = [] - items.append(LanguageSuggestionItem(type: .localization(suggestedLocalization.languageCode), title: suggestedLocalization.localizedTitle, subtitle: suggestedLocalization.title, action: { - selectedLocalization.set(suggestedLocalization.languageCode) - })) - items.append(LanguageSuggestionItem(type: .localization("en"), title: strings.English, subtitle: englishStrings.English, action: { - selectedLocalization.set("en") - })) - items.append(LanguageSuggestionItem(type: .disclosure, title: strings.Other, subtitle: englishStrings.Other != strings.Other ? englishStrings.Other : nil, action: { - openSelection() - })) - - var applyImpl: (() -> Void)? - items.append(LanguageSuggestionItem(type: .action, title: "OK", subtitle: nil, action: { - applyImpl?() - })) - - self.nodes = items.map { LanguageSuggestionItemNode(theme: theme, item: $0) } - - super.init() - - self.addSubnode(self.titleNode) - self.addSubnode(self.subtitleNode) - self.addSubnode(self.titleSeparatorNode) - self.addSubnode(self.activityIndicator) - for node in self.nodes { - self.addSubnode(node) - } - - self.disposable.set(selectedLocalization.get().start(next: { [weak self] selectedCode in - if let strongSelf = self { - for node in strongSelf.nodes { - if case let .localization(code) = node.item.type { - node.isSelected = code == selectedCode - } - } - } - })) - - applyImpl = { [weak self] in - if let strongSelf = self { - strongSelf.isUserInteractionEnabled = false - - _ = (selectedLocalization.get() - |> take(1)).start(next: { selectedCode in - applyLocalization(selectedCode, { [weak self] in - if let strongSelf = self { - strongSelf.activityIndicator.isHidden = false - if let lastNode = strongSelf.nodes.last { - lastNode.isHidden = true - } - } - }) - }) - } - } - } - - deinit { - self.disposable.dispose() - } - - override func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) -> CGSize { - var size = size - size.width = min(size.width, 270.0) - - self.validLayout = size - - var origin: CGPoint = CGPoint(x: 0.0, y: 17.0) - - let titleSize = self.titleNode.measure(size) - transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - titleSize.width) / 2.0), y: origin.y), size: titleSize)) - origin.y += titleSize.height + 3.0 - - let subtitleSize = self.subtitleNode.measure(size) - transition.updateFrame(node: self.subtitleNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - subtitleSize.width) / 2.0), y: origin.y), size: subtitleSize)) - origin.y += subtitleSize.height + 17.0 - transition.updateFrame(node: self.titleSeparatorNode, frame: CGRect(x: 0.0, y: origin.y - UIScreenPixel, width: size.width, height: UIScreenPixel)) - - var lastNodeSize: CGSize? - for node in self.nodes { - let size = node.updateLayout(size) - transition.updateFrame(node: node, frame: CGRect(origin: origin, size: size)) - origin.y += size.height - lastNodeSize = size - } - - if let lastSize = lastNodeSize { - let indicatorSize = self.activityIndicator.measure(CGSize(width: 100.0, height: 100.0)) - transition.updateFrame(node: self.activityIndicator, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - indicatorSize.width) / 2.0), y: origin.y - lastSize.height + floorToScreenPixels((lastSize.height - indicatorSize.height) / 2.0)), size: indicatorSize)) - } - - return CGSize(width: size.width, height: origin.y - UIScreenPixel) - } -} - -func languageSuggestionController(context: AccountContext, suggestedLocalization: SuggestedLocalizationInfo, currentLanguageCode: String, openSelection: @escaping () -> Void) -> AlertController? { - guard let localization = suggestedLocalization.availableLocalizations.filter({ $0.languageCode == suggestedLocalization.languageCode }).first else { - return nil - } - - let theme = context.sharedContext.currentPresentationData.with { $0 }.theme - let strings = LanguageSuggestionControllerStrings(localization: suggestedLocalization) - guard let mainPath = Bundle.main.path(forResource: "en", ofType: "lproj") else { - return nil - } - let englishStrings = LanguageSuggestionControllerStrings(bundle: Bundle(path: mainPath)) - - let disposable = MetaDisposable() - - var dismissImpl: ((Bool) -> Void)? - let contentNode = LanguageSuggestionAlertContentNode(theme: theme, strings: strings, englishStrings: englishStrings, suggestedLocalization: localization, openSelection: { - dismissImpl?(true) - openSelection() - }, applyLocalization: { languageCode, startActivity in - if languageCode == currentLanguageCode { - dismissImpl?(true) - } else { - startActivity() - disposable.set((downloadAndApplyLocalization(accountManager: context.sharedContext.accountManager, postbox: context.account.postbox, network: context.account.network, languageCode: languageCode) - |> deliverOnMainQueue).start(completed: { - dismissImpl?(true) - })) - } - }, dismiss: { - dismissImpl?(true) - }) - let controller = AlertController(theme: AlertControllerTheme(presentationTheme: theme), contentNode: contentNode) - dismissImpl = { [weak controller] animated in - if animated { - controller?.dismissAnimated() - } else { - controller?.dismiss() - } - } - return controller -} diff --git a/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift index a9f4d0df0f..e24985854f 100644 --- a/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift +++ b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift @@ -20,7 +20,7 @@ import ItemListPeerActionItem import TelegramStringFormatting private final class NotificationExceptionState : Equatable { - let mode:NotificationExceptionMode + let mode: NotificationExceptionMode let isSearchMode: Bool let revealedPeerId: PeerId? let editing: Bool @@ -93,7 +93,15 @@ public struct NotificationExceptionWrapper : Equatable { } } + + public enum NotificationExceptionMode : Equatable { + fileprivate enum Mode { + case users + case groups + case channels + } + public static func == (lhs: NotificationExceptionMode, rhs: NotificationExceptionMode) -> Bool { switch lhs { case let .users(lhsValue): @@ -117,6 +125,17 @@ public enum NotificationExceptionMode : Equatable { } } + fileprivate var mode: Mode { + switch self { + case .users: + return .users + case .groups: + return .groups + case .channels: + return .channels + } + } + var isEmpty: Bool { switch self { case let .users(value), let .groups(value), let .channels(value): @@ -271,7 +290,7 @@ private func notificationsExceptionEntries(presentationData: PresentationData, s var entries: [NotificationExceptionEntry] = [] if !state.isSearchMode { - entries.append(.addException(presentationData.theme, presentationData.strings, state.editing)) + entries.append(.addException(presentationData.theme, presentationData.strings, state.mode.mode, state.editing)) } var existingPeerIds = Set() @@ -486,7 +505,7 @@ private enum NotificationExceptionEntry : ItemListNodeEntry { case search(PresentationTheme, PresentationStrings) case peer(index: Int, peer: Peer, theme: PresentationTheme, strings: PresentationStrings, dateFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, description: String, notificationSettings: TelegramPeerNotificationSettings, revealed: Bool, editing: Bool, isSearching: Bool) case addPeer(index: Int, peer: Peer, theme: PresentationTheme, strings: PresentationStrings, dateFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder) - case addException(PresentationTheme, PresentationStrings, Bool) + case addException(PresentationTheme, PresentationStrings, NotificationExceptionMode.Mode, Bool) case removeAll(PresentationTheme, PresentationStrings) func item(_ arguments: NotificationExceptionArguments) -> ListViewItem { @@ -495,8 +514,17 @@ private enum NotificationExceptionEntry : ItemListNodeEntry { return NotificationSearchItem(theme: theme, placeholder: strings.Common_Search, activate: { arguments.activateSearch() }) - case let .addException(theme, strings, editing): - return ItemListPeerActionItem(theme: theme, icon: PresentationResourcesItemList.addExceptionIcon(theme), title: strings.Notification_Exceptions_AddException, alwaysPlain: true, sectionId: self.section, editing: editing, action: { + case let .addException(theme, strings, mode, editing): + let icon: UIImage? + switch mode { + case .users: + icon = PresentationResourcesItemList.addPersonIcon(theme) + case .groups: + icon = PresentationResourcesItemList.createGroupIcon(theme) + case .channels: + icon = PresentationResourcesItemList.addChannelIcon(theme) + } + return ItemListPeerActionItem(theme: theme, icon: icon, title: strings.Notification_Exceptions_AddException, alwaysPlain: true, sectionId: self.section, editing: editing, action: { arguments.selectPeer() }) case let .peer(_, peer, theme, strings, dateTimeFormat, nameDisplayOrder, value, _, revealed, editing, isSearching): @@ -543,10 +571,10 @@ private enum NotificationExceptionEntry : ItemListNodeEntry { default: return false } - case let .addException(lhsTheme, lhsStrings, lhsEditing): + case let .addException(lhsTheme, lhsStrings, lhsMode, lhsEditing): switch rhs { - case let .addException(rhsTheme, rhsStrings, rhsEditing): - return lhsTheme === rhsTheme && lhsStrings === rhsStrings && lhsEditing == rhsEditing + case let .addException(rhsTheme, rhsStrings, rhsMode, rhsEditing): + return lhsTheme === rhsTheme && lhsStrings === rhsStrings && lhsMode == rhsMode && lhsEditing == rhsEditing default: return false } diff --git a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift new file mode 100644 index 0000000000..06c9b2d5c8 --- /dev/null +++ b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift @@ -0,0 +1,189 @@ +import Foundation +import UIKit +import Display +import SwiftSignalKit +import Postbox +import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import ItemListUI +import AlertUI +import AccountContext + +private final class CreateThemeControllerArguments { + let context: AccountContext + let updateState: ((CreateThemeControllerState) -> CreateThemeControllerState) -> Void + + init(context: AccountContext, updateState: @escaping ((CreateThemeControllerState) -> CreateThemeControllerState) -> Void) { + self.context = context + self.updateState = updateState + } +} + +private enum CreateThemeControllerSection: Int32 { + case chatPreview + case info +} + +private enum CreateThemeControllerEntry: ItemListNodeEntry { + case chatPreviewHeader(PresentationTheme, String) + case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder) + case title(PresentationTheme, PresentationStrings, String, String) + case slug(PresentationTheme, PresentationStrings, String, String, Bool) + + var section: ItemListSectionId { + switch self { + case .chatPreviewHeader, .chatPreview: + return CreateThemeControllerSection.chatPreview.rawValue + case .title, .slug: + return CreateThemeControllerSection.info.rawValue + } + } + + var stableId: Int32 { + switch self { + case .chatPreviewHeader: + return 0 + case .chatPreview: + return 1 + case .title: + return 2 + case .slug: + return 3 + } + } + + static func ==(lhs: CreateThemeControllerEntry, rhs: CreateThemeControllerEntry) -> Bool { + switch lhs { + case let .chatPreviewHeader(lhsTheme, lhsText): + if case let .chatPreviewHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .chatPreview(lhsTheme, lhsComponentTheme, lhsWallpaper, lhsFontSize, lhsStrings, lhsTimeFormat, lhsNameOrder): + if case let .chatPreview(rhsTheme, rhsComponentTheme, rhsWallpaper, rhsFontSize, rhsStrings, rhsTimeFormat, rhsNameOrder) = rhs, lhsComponentTheme === rhsComponentTheme, lhsTheme === rhsTheme, lhsWallpaper == rhsWallpaper, lhsFontSize == rhsFontSize, lhsStrings === rhsStrings, lhsTimeFormat == rhsTimeFormat, lhsNameOrder == rhsNameOrder { + return true + } else { + return false + } + case let .title(lhsTheme, lhsStrings, lhsTitle, lhsValue): + if case let .title(rhsTheme, rhsStrings, rhsTitle, rhsValue) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsTitle == rhsTitle, lhsValue == rhsValue { + return true + } else { + return false + } + case let .slug(lhsTheme, lhsStrings, lhsTitle, lhsValue, lhsEnabled): + if case let .slug(rhsTheme, rhsStrings, rhsTitle, rhsValue, rhsEnabled) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsTitle == rhsTitle, lhsValue == rhsValue, lhsEnabled == rhsEnabled { + return true + } else { + return false + } + } + } + + static func <(lhs: CreateThemeControllerEntry, rhs: CreateThemeControllerEntry) -> Bool { + return lhs.stableId < rhs.stableId + } + + func item(_ arguments: CreateThemeControllerArguments) -> ListViewItem { + switch self { + case let .chatPreviewHeader(theme, text): + return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .chatPreview(theme, componentTheme, wallpaper, fontSize, strings, dateTimeFormat, nameDisplayOrder): + return ThemeSettingsChatPreviewItem(context: arguments.context, theme: theme, componentTheme: componentTheme, strings: strings, sectionId: self.section, fontSize: fontSize, wallpaper: wallpaper, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder) + case let .title(theme, strings, title, text): + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(), text: text, placeholder: title, sectionId: self.section, textUpdated: { value in + arguments.updateState { current in + var state = current + state.title = value + return state + } + }, action: {}) + case let .slug(theme, strings, title, text, enabled): + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: "t.me/addtheme/", textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "Short Name", type: .username, enabled: enabled, sectionId: self.section, textUpdated: { value in + arguments.updateState { current in + var state = current + state.slug = value + return state + } + }, action: {}) + } + } +} + +private enum CreateThemeControllerMode { + case create + case update +} + +private struct CreateThemeControllerState: Equatable { + var mode: CreateThemeControllerMode + var title: String + var slug: String + + var isComplete: Bool { + if self.title.isEmpty || self.slug.isEmpty { + return false + } + return true + } +} + +private func createThemeControllerEntries(presentationData: PresentationData, theme: PresentationTheme, state: CreateThemeControllerState) -> [CreateThemeControllerEntry] { + var entries: [CreateThemeControllerEntry] = [] + + entries.append(.chatPreviewHeader(presentationData.theme, "Preview".uppercased())) + entries.append(.chatPreview(presentationData.theme, theme, theme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) + + entries.append(.title(presentationData.theme, presentationData.strings, "Title", state.title)) + entries.append(.slug(presentationData.theme, presentationData.strings, "Slug", state.slug, true)) + + return entries +} + +public func createThemeController(context: AccountContext, theme: PresentationTheme, resource: MediaResource) -> ViewController { + let initialState = CreateThemeControllerState(mode: .create, title: "", slug: "") + let statePromise = ValuePromise(initialState, ignoreRepeated: true) + let stateValue = Atomic(value: initialState) + let updateState: ((CreateThemeControllerState) -> CreateThemeControllerState) -> Void = { f in + statePromise.set(stateValue.modify { f($0) }) + } + + var pushControllerImpl: ((ViewController) -> Void)? + var presentControllerImpl: ((ViewController, Any?) -> Void)? + var dismissImpl: (() -> Void)? + + let arguments = CreateThemeControllerArguments(context: context, updateState: { f in + updateState(f) + }) + + let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get()) + |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, CreateThemeControllerEntry.ItemGenerationArguments)) in + let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { + dismissImpl?() + }) + let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: state.isComplete, action: { + let _ = (createTheme(account: context.account, resource: resource, title: state.title, slug: state.slug) |> deliverOnMainQueue).start(completed: { + dismissImpl?() + }) + }) + + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text("Publish Theme"), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let listState = ItemListNodeState(entries: createThemeControllerEntries(presentationData: presentationData, theme: theme, state: state), style: .blocks, emptyStateItem: nil, animateChanges: false) + + return (controllerState, (listState, arguments)) + } + + let controller = ItemListController(context: context, state: signal) + pushControllerImpl = { [weak controller] c in + (controller?.navigationController as? NavigationController)?.pushViewController(c) + } + presentControllerImpl = { [weak controller] c, a in + controller?.present(c, in: .window(.root), with: a) + } + dismissImpl = { [weak controller] in + let _ = controller?.dismiss() + } + return controller +} diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index 41199e1961..99b8ec862f 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -11,10 +11,15 @@ import AccountContext import ShareController import CounterContollerTitleView +public enum ThemePreviewSource { + case theme(TelegramTheme) + case media(AnyMediaReference) +} + public final class ThemePreviewController: ViewController { private let context: AccountContext private let previewTheme: PresentationTheme - private let media: AnyMediaReference + private let source: ThemePreviewSource private var controllerNode: ThemePreviewControllerNode { return self.displayNode as! ThemePreviewControllerNode @@ -25,21 +30,28 @@ public final class ThemePreviewController: ViewController { private var presentationData: PresentationData private var presentationDataDisposable: Disposable? - public init(context: AccountContext, previewTheme: PresentationTheme, media: AnyMediaReference) { + public init(context: AccountContext, previewTheme: PresentationTheme, source: ThemePreviewSource) { self.context = context self.previewTheme = previewTheme - self.media = media + self.source = source self.presentationData = context.sharedContext.currentPresentationData.with { $0 } super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationTheme: self.previewTheme, presentationStrings: self.presentationData.strings)) + let themeName: String + if case let .theme(theme) = source { + themeName = theme.title + } else { + themeName = previewTheme.name.string + } + if let author = previewTheme.author { let titleView = CounterContollerTitleView(theme: self.previewTheme) - titleView.title = CounterContollerTitle(title: self.previewTheme.name.string, counter: author) + titleView.title = CounterContollerTitle(title: themeName, counter: author) self.navigationItem.titleView = titleView } else { - self.title = previewTheme.name.string + self.title = themeName } self.statusBar.statusBarStyle = self.previewTheme.rootController.statusBarStyle.style self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) @@ -83,6 +95,13 @@ public final class ThemePreviewController: ViewController { } }, apply: { [weak self] in if let strongSelf = self { + let theme: PresentationThemeReference + if case let .theme(info) = strongSelf.source { + theme = .cloud(info) + } else { + theme = .builtin(.day) + } + let _ = (strongSelf.context.sharedContext.accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in let current: PresentationThemeSettings @@ -92,7 +111,7 @@ public final class ThemePreviewController: ViewController { current = PresentationThemeSettings.defaultSettings } - return PresentationThemeSettings(chatWallpaper: .color(0xffffff), theme: .builtin(.day), themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + return PresentationThemeSettings(chatWallpaper: .color(0xffffff), theme: theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) }).start(completed: { [weak self] in if let strongSelf = self { @@ -122,7 +141,22 @@ public final class ThemePreviewController: ViewController { } @objc private func actionPressed() { - let controller = ShareController(context: self.context, subject: .media(self.media)) + let subject: ShareControllerSubject + let preferredAction: ShareControllerPreferredAction + switch self.source { + case let .theme(theme): + subject = .url("https://t.me/addtheme/\(theme.slug)") + preferredAction = .default + case let .media(media): + subject = .media(media) + preferredAction = .custom(action: ShareControllerAction(title: "Publish", action: { [weak self] in + if let strongSelf = self, let file = media.media as? TelegramMediaFile { + let controller = createThemeController(context: strongSelf.context, theme: strongSelf.previewTheme, resource: file.resource) + strongSelf.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet), blockInteraction: true) + } + })) + } + let controller = ShareController(context: self.context, subject: subject, preferredAction: preferredAction) self.present(controller, in: .window(.root), blockInteraction: true) } } diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 1911169468..40ad17ddcb 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -195,22 +195,30 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) - messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) - //let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: self.previewTheme, wallpaper: self.previewTheme.chat.defaultWallpaper), fontSize: self.presentationData.fontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: false, largeEmoji: false) + let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) + let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) + let message3 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 14, title: nil, performer: nil, waveform: MemoryBuffer())] let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: nil, attributes: voiceAttributes) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local))) + let message4 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local))) + + //items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)), controllerInteraction: controllerInteraction, content: .message(message: , read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false)) + + let message5 = Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message5, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let messageNodes = self.messageNodes { @@ -260,8 +268,8 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.scrollNode.frame = bounds let toolbarHeight = 49.0 + layout.intrinsicInsets.bottom - self.chatListBackgroundNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) - self.chatBackgroundNode.frame = CGRect(x: bounds.width, y: 0.0, width: bounds.width, height: bounds.height) + self.chatListBackgroundNode.frame = CGRect(x: bounds.width, y: 0.0, width: bounds.width, height: bounds.height) + self.chatBackgroundNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) self.scrollNode.view.contentSize = CGSize(width: bounds.width * 2.0, height: bounds.height) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift index dbd03cc362..142baa02f8 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift @@ -20,7 +20,7 @@ private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selec let lineWidth: CGFloat if selected { var accentColor = theme.list.itemAccentColor - if accentColor.rgb == UIColor.white.rgb { + if accentColor.rgb == 0xffffff { accentColor = UIColor(rgb: 0x999999) } context.setStrokeColor(accentColor.cgColor) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index f75e3d12e4..85f5b1fc3d 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import AlertUI import AccountContext private final class ThemeSettingsControllerArguments { @@ -294,16 +295,15 @@ private struct ThemeSettingsState: Equatable { } } -private func themeSettingsControllerEntries(presentationData: PresentationData, theme: PresentationTheme, themeReference: PresentationThemeReference, themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], autoNightSettings: AutomaticThemeSwitchSetting, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, dateTimeFormat: PresentationDateTimeFormat, largeEmoji: Bool, disableAnimations: Bool, availableAppIcons: [PresentationAppIcon], currentAppIconName: String?) -> [ThemeSettingsControllerEntry] { +private func themeSettingsControllerEntries(presentationData: PresentationData, theme: PresentationTheme, themeReference: PresentationThemeReference, themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], availableThemes: [PresentationThemeReference], autoNightSettings: AutomaticThemeSwitchSetting, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, dateTimeFormat: PresentationDateTimeFormat, largeEmoji: Bool, disableAnimations: Bool, availableAppIcons: [PresentationAppIcon], currentAppIconName: String?) -> [ThemeSettingsControllerEntry] { var entries: [ThemeSettingsControllerEntry] = [] entries.append(.themeListHeader(presentationData.theme, strings.Appearance_ColorTheme.uppercased())) entries.append(.chatPreview(presentationData.theme, theme, wallpaper, fontSize, presentationData.strings, dateTimeFormat, presentationData.nameDisplayOrder)) - let availableThemes: [PresentationThemeReference] = [.builtin(.dayClassic), .builtin(.day), .builtin(.night), .builtin(.nightAccent)] entries.append(.themeItem(presentationData.theme, presentationData.strings, availableThemes, themeReference, themeSpecificAccentColors, themeSpecificAccentColors[themeReference.index])) - if theme.name != .builtin(.dayClassic) { + if case let .builtin(theme) = themeReference, theme != .dayClassic { entries.append(.accentColor(presentationData.theme, themeReference, strings.Appearance_AccentColor, themeSpecificAccentColors[themeReference.index])) } @@ -349,6 +349,8 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The var pushControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)? + var moreImpl: (() -> Void)? + let _ = telegramWallpapers(postbox: context.account.postbox, network: context.account.network).start() let currentAppIcon: PresentationAppIcon? @@ -426,9 +428,14 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The context.sharedContext.applicationBindings.requestSetAlternateIconName(name, { _ in }) }) - - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]), availableAppIcons, currentAppIconName.get(), statePromise.get()) - |> map { presentationData, sharedData, availableAppIcons, currentAppIconName, state -> (ItemListControllerState, (ItemListNodeState, ThemeSettingsControllerEntry.ItemGenerationArguments)) in + + let savedThemes = telegramThemes(postbox: context.account.postbox, network: context.account.network) + |> map { themes -> [PresentationThemeReference] in + return themes.map { .cloud($0) } + } + + let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]), savedThemes, availableAppIcons, currentAppIconName.get(), statePromise.get()) + |> map { presentationData, sharedData, savedThemes, availableAppIcons, currentAppIconName, state -> (ItemListControllerState, (ItemListNodeState, ThemeSettingsControllerEntry.ItemGenerationArguments)) in let settings = (sharedData.entries[ApplicationSpecificSharedDataKeys.presentationThemeSettings] as? PresentationThemeSettings) ?? PresentationThemeSettings.defaultSettings let fontSize = settings.fontSize @@ -446,8 +453,15 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The wallpaper = settings.chatWallpaper } - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Appearance_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) - let listState = ItemListNodeState(entries: themeSettingsControllerEntries(presentationData: presentationData, theme: theme, themeReference: settings.theme, themeSpecificAccentColors: settings.themeSpecificAccentColors, autoNightSettings: settings.automaticThemeSwitchSetting, strings: presentationData.strings, wallpaper: wallpaper, fontSize: fontSize, dateTimeFormat: dateTimeFormat, largeEmoji: largeEmoji, disableAnimations: disableAnimations, availableAppIcons: availableAppIcons, currentAppIconName: currentAppIconName), style: .blocks, ensureVisibleItemTag: focusOnItemTag, animateChanges: false) + let rightNavigationButton = ItemListNavigationButton(content: .icon(.action), style: .regular, enabled: true, action: { + moreImpl?() + }) + + let defaultThemes: [PresentationThemeReference] = [.builtin(.dayClassic), .builtin(.day), .builtin(.night), .builtin(.nightAccent)] + let availableThemes = defaultThemes + savedThemes + + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Appearance_Title), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) + let listState = ItemListNodeState(entries: themeSettingsControllerEntries(presentationData: presentationData, theme: theme, themeReference: settings.theme, themeSpecificAccentColors: settings.themeSpecificAccentColors, availableThemes: availableThemes, autoNightSettings: settings.automaticThemeSwitchSetting, strings: presentationData.strings, wallpaper: wallpaper, fontSize: fontSize, dateTimeFormat: dateTimeFormat, largeEmoji: largeEmoji, disableAnimations: disableAnimations, availableAppIcons: availableAppIcons, currentAppIconName: currentAppIconName), style: .blocks, ensureVisibleItemTag: focusOnItemTag, animateChanges: false) return (controllerState, (listState, arguments)) } @@ -460,6 +474,46 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The presentControllerImpl = { [weak controller] c, a in controller?.present(c, in: .window(.root), with: a) } + moreImpl = { [weak controller] in + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) + var items: [ActionSheetItem] = [] + items.append(ActionSheetButtonItem(title: "Create New Theme", color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + var randomId: Int64 = 0 + arc4random_buf(&randomId, 8) + let path = NSTemporaryDirectory() + "\(randomId)" + + let encoder = PresentationThemeEncoder() + let theme = presentationData.theme + guard let strings = try? encoder.encode(theme), let _ = try? strings.write(toFile: path, atomically: true, encoding: .utf8) else { + return + } + + let id = arc4random64() + let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: id), partialReference: nil, resource: LocalFileReferenceMediaResource(localFilePath: path, randomId: id), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgtheme-ios", size: nil, attributes: [.FileName(fileName: "\(theme.name.string).tgios-theme")]) + let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: nil, localGroupingKey: nil) + + let _ = enqueueMessages(account: context.account, peerId: context.account.peerId, messages: [message]).start() + + presentControllerImpl?(textAlertController(context: context, title: nil, text: "A new theme template has been added to your Saved Messages.", actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { + if let controller = controller, let navigationController = controller.navigationController as? NavigationController { + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(context.account.peerId))) + } + }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})], actionLayout: .vertical), nil) + })) + items.append(ActionSheetButtonItem(title: "Upload Theme", color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items:items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + presentControllerImpl?(actionSheet, nil) + } return controller } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift index 40b13f8db3..b5845a82ae 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift @@ -21,7 +21,7 @@ private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selec let lineWidth: CGFloat if selected { var accentColor = theme.list.itemAccentColor - if accentColor.rgb == UIColor.white.rgb { + if accentColor.rgb == 0xffffff { accentColor = UIColor(rgb: 0x999999) } context.setStrokeColor(accentColor.cgColor) @@ -40,32 +40,40 @@ private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selec private func generateThemeIconImage(theme: PresentationThemeReference, accentColor: UIColor?) -> UIImage { return generateImage(CGSize(width: 98.0, height: 62.0), rotatedContext: { size, context in - guard case let .builtin(theme) = theme else { - return - } let bounds = CGRect(origin: CGPoint(), size: size) let background: UIColor let incomingFill: UIColor let outgoingFill: UIColor switch theme { - case .dayClassic: + case let .builtin(theme): + switch theme { + case .dayClassic: + background = UIColor(rgb: 0xd6e2ee) + incomingFill = UIColor(rgb: 0xffffff) + outgoingFill = UIColor(rgb: 0xe1ffc7) + case .day: + background = .white + incomingFill = UIColor(rgb: 0xd5dde6) + outgoingFill = accentColor ?? UIColor(rgb: 0x007aff) + case .night: + background = UIColor(rgb: 0x000000) + incomingFill = UIColor(rgb: 0x1f1f1f) + outgoingFill = accentColor ?? UIColor(rgb: 0x313131) + case .nightAccent: + let accentColor = accentColor ?? UIColor(rgb: 0x007aff) + background = accentColor.withMultiplied(hue: 1.024, saturation: 0.573, brightness: 0.18) + incomingFill = accentColor.withMultiplied(hue: 1.024, saturation: 0.585, brightness: 0.25) + outgoingFill = accentColor.withMultiplied(hue: 1.019, saturation: 0.731, brightness: 0.59) + } + case let .cloud(theme): + background = UIColor(rgb: 0xd6e2ee) + incomingFill = UIColor(rgb: 0xffffff) + outgoingFill = UIColor(rgb: 0xe1ffc7) + default: background = UIColor(rgb: 0xd6e2ee) incomingFill = UIColor(rgb: 0xffffff) outgoingFill = UIColor(rgb: 0xe1ffc7) - case .day: - background = .white - incomingFill = UIColor(rgb: 0xd5dde6) - outgoingFill = accentColor ?? UIColor(rgb: 0x007aff) - case .night: - background = UIColor(rgb: 0x000000) - incomingFill = UIColor(rgb: 0x1f1f1f) - outgoingFill = accentColor ?? UIColor(rgb: 0x313131) - case .nightAccent: - let accentColor = accentColor ?? UIColor(rgb: 0x007aff) - background = accentColor.withMultiplied(hue: 1.024, saturation: 0.573, brightness: 0.18) - incomingFill = accentColor.withMultiplied(hue: 1.024, saturation: 0.585, brightness: 0.25) - outgoingFill = accentColor.withMultiplied(hue: 1.019, saturation: 0.731, brightness: 0.59) } context.setFillColor(background.cgColor) @@ -336,19 +344,22 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { } let name: String? - if case let .builtin(theme) = theme { - switch theme { - case .dayClassic: - name = item.strings.Appearance_ThemeCarouselClassic - case .day: - name = item.strings.Appearance_ThemeCarouselDay - case .night: - name = item.strings.Appearance_ThemeCarouselNewNight - case .nightAccent: - name = item.strings.Appearance_ThemeCarouselTintedNight - } - } else { - name = nil + switch theme { + case let .builtin(theme): + switch theme { + case .dayClassic: + name = item.strings.Appearance_ThemeCarouselClassic + case .day: + name = item.strings.Appearance_ThemeCarouselDay + case .night: + name = item.strings.Appearance_ThemeCarouselNewNight + case .nightAccent: + name = item.strings.Appearance_ThemeCarouselTintedNight + } + case let .cloud(theme): + name = theme.title + default: + name = nil } if let name = name { diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index dafa6f5ca6..d8ef0a30d7 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -238,6 +238,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[967122427] = { return Api.Update.parse_updateNewScheduledMessage($0) } dict[-1870238482] = { return Api.Update.parse_updateDeleteScheduledMessages($0) } dict[357013699] = { return Api.Update.parse_updateMessageReactions($0) } + dict[-2112423005] = { return Api.Update.parse_updateTheme($0) } dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) } dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) } dict[367766557] = { return Api.ChannelParticipant.parse_channelParticipant($0) } @@ -263,6 +264,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-748155807] = { return Api.ContactStatus.parse_contactStatus($0) } dict[1679398724] = { return Api.SecureFile.parse_secureFileEmpty($0) } dict[-534283678] = { return Api.SecureFile.parse_secureFile($0) } + dict[-199313886] = { return Api.account.Themes.parse_themesNotModified($0) } + dict[2137482273] = { return Api.account.Themes.parse_themes($0) } dict[236446268] = { return Api.PhotoSize.parse_photoSizeEmpty($0) } dict[2009052699] = { return Api.PhotoSize.parse_photoSize($0) } dict[-374917894] = { return Api.PhotoSize.parse_photoCachedSize($0) } @@ -274,6 +277,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1359533640] = { return Api.messages.FoundStickerSets.parse_foundStickerSets($0) } dict[471437699] = { return Api.account.WallPapers.parse_wallPapersNotModified($0) } dict[1881892265] = { return Api.account.WallPapers.parse_wallPapers($0) } + dict[1012306921] = { return Api.InputTheme.parse_inputTheme($0) } + dict[-175567375] = { return Api.InputTheme.parse_inputThemeSlug($0) } dict[1158290442] = { return Api.messages.FoundGifs.parse_foundGifs($0) } dict[-1199954735] = { return Api.MessageReactions.parse_messageReactions($0) } dict[-1132476723] = { return Api.FileLocation.parse_fileLocationToBeDeprecated($0) } @@ -420,7 +425,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-2128640689] = { return Api.account.SentEmailCode.parse_sentEmailCode($0) } dict[-1038136962] = { return Api.EncryptedFile.parse_encryptedFileEmpty($0) } dict[1248893260] = { return Api.EncryptedFile.parse_encryptedFile($0) } - dict[-557924733] = { return Api.CodeSettings.parse_codeSettings($0) } dict[-391902247] = { return Api.SecureValueError.parse_secureValueErrorData($0) } dict[12467706] = { return Api.SecureValueError.parse_secureValueErrorFrontSide($0) } dict[-2037765467] = { return Api.SecureValueError.parse_secureValueErrorReverseSide($0) } @@ -715,6 +719,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1363483106] = { return Api.DialogPeer.parse_dialogPeerFolder($0) } dict[-104284986] = { return Api.WebDocument.parse_webDocumentNoProxy($0) } dict[475467473] = { return Api.WebDocument.parse_webDocument($0) } + dict[1211967244] = { return Api.Theme.parse_themeDocumentNotModified($0) } + dict[1464749545] = { return Api.Theme.parse_theme($0) } dict[-1290580579] = { return Api.contacts.Found.parse_found($0) } dict[-368018716] = { return Api.ChannelAdminLogEventsFilter.parse_channelAdminLogEventsFilter($0) } dict[1889961234] = { return Api.PeerNotifySettings.parse_peerNotifySettingsEmpty($0) } @@ -944,6 +950,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.SecureFile: _1.serialize(buffer, boxed) + case let _1 as Api.account.Themes: + _1.serialize(buffer, boxed) case let _1 as Api.PhotoSize: _1.serialize(buffer, boxed) case let _1 as Api.messages.Stickers: @@ -954,6 +962,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.account.WallPapers: _1.serialize(buffer, boxed) + case let _1 as Api.InputTheme: + _1.serialize(buffer, boxed) case let _1 as Api.messages.FoundGifs: _1.serialize(buffer, boxed) case let _1 as Api.MessageReactions: @@ -1068,8 +1078,6 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.EncryptedFile: _1.serialize(buffer, boxed) - case let _1 as Api.CodeSettings: - _1.serialize(buffer, boxed) case let _1 as Api.SecureValueError: _1.serialize(buffer, boxed) case let _1 as Api.NotifyPeer: @@ -1302,6 +1310,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.WebDocument: _1.serialize(buffer, boxed) + case let _1 as Api.Theme: + _1.serialize(buffer, boxed) case let _1 as Api.contacts.Found: _1.serialize(buffer, boxed) case let _1 as Api.ChannelAdminLogEventsFilter: diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 6ed0942678..7575cc1f7c 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -4022,6 +4022,7 @@ public extension Api { case updateNewScheduledMessage(message: Api.Message) case updateDeleteScheduledMessages(peer: Api.Peer, messages: [Int32]) case updateMessageReactions(peer: Api.Peer, msgId: Int32, reactions: Api.MessageReactions) + case updateTheme(theme: Api.Theme) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -4648,6 +4649,12 @@ public extension Api { serializeInt32(msgId, buffer: buffer, boxed: false) reactions.serialize(buffer, true) break + case .updateTheme(let theme): + if boxed { + buffer.appendInt32(-2112423005) + } + theme.serialize(buffer, true) + break } } @@ -4801,6 +4808,8 @@ public extension Api { return ("updateDeleteScheduledMessages", [("peer", peer), ("messages", messages)]) case .updateMessageReactions(let peer, let msgId, let reactions): return ("updateMessageReactions", [("peer", peer), ("msgId", msgId), ("reactions", reactions)]) + case .updateTheme(let theme): + return ("updateTheme", [("theme", theme)]) } } @@ -6067,6 +6076,19 @@ public extension Api { return nil } } + public static func parse_updateTheme(_ reader: BufferReader) -> Update? { + var _1: Api.Theme? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.Theme + } + let _c1 = _1 != nil + if _c1 { + return Api.Update.updateTheme(theme: _1!) + } + else { + return nil + } + } } public enum PopularContact: TypeConstructorDescription { @@ -6964,6 +6986,64 @@ public extension Api { } } + } + public enum InputTheme: TypeConstructorDescription { + case inputTheme(id: Int64, accessHash: Int64) + case inputThemeSlug(slug: String) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .inputTheme(let id, let accessHash): + if boxed { + buffer.appendInt32(1012306921) + } + serializeInt64(id, buffer: buffer, boxed: false) + serializeInt64(accessHash, buffer: buffer, boxed: false) + break + case .inputThemeSlug(let slug): + if boxed { + buffer.appendInt32(-175567375) + } + serializeString(slug, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .inputTheme(let id, let accessHash): + return ("inputTheme", [("id", id), ("accessHash", accessHash)]) + case .inputThemeSlug(let slug): + return ("inputThemeSlug", [("slug", slug)]) + } + } + + public static func parse_inputTheme(_ reader: BufferReader) -> InputTheme? { + var _1: Int64? + _1 = reader.readInt64() + var _2: Int64? + _2 = reader.readInt64() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.InputTheme.inputTheme(id: _1!, accessHash: _2!) + } + else { + return nil + } + } + public static func parse_inputThemeSlug(_ reader: BufferReader) -> InputTheme? { + var _1: String? + _1 = parseString(reader) + let _c1 = _1 != nil + if _c1 { + return Api.InputTheme.inputThemeSlug(slug: _1!) + } + else { + return nil + } + } + } public enum MessageReactions: TypeConstructorDescription { case messageReactions(flags: Int32, results: [Api.ReactionCount]) @@ -10430,40 +10510,6 @@ public extension Api { } } - } - public enum CodeSettings: TypeConstructorDescription { - case codeSettings(flags: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .codeSettings(let flags): - if boxed { - buffer.appendInt32(-557924733) - } - serializeInt32(flags, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .codeSettings(let flags): - return ("codeSettings", [("flags", flags)]) - } - } - - public static func parse_codeSettings(_ reader: BufferReader) -> CodeSettings? { - var _1: Int32? - _1 = reader.readInt32() - let _c1 = _1 != nil - if _c1 { - return Api.CodeSettings.codeSettings(flags: _1!) - } - else { - return nil - } - } - } public enum SecureValueError: TypeConstructorDescription { case secureValueErrorData(type: Api.SecureValueType, dataHash: Buffer, field: String, text: String) @@ -18178,6 +18224,74 @@ public extension Api { } } + } + public enum Theme: TypeConstructorDescription { + case themeDocumentNotModified + case theme(flags: Int32, id: Int64, accessHash: Int64, slug: String, title: String, document: Api.Document) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .themeDocumentNotModified: + if boxed { + buffer.appendInt32(1211967244) + } + + break + case .theme(let flags, let id, let accessHash, let slug, let title, let document): + if boxed { + buffer.appendInt32(1464749545) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeInt64(id, buffer: buffer, boxed: false) + serializeInt64(accessHash, buffer: buffer, boxed: false) + serializeString(slug, buffer: buffer, boxed: false) + serializeString(title, buffer: buffer, boxed: false) + document.serialize(buffer, true) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .themeDocumentNotModified: + return ("themeDocumentNotModified", []) + case .theme(let flags, let id, let accessHash, let slug, let title, let document): + return ("theme", [("flags", flags), ("id", id), ("accessHash", accessHash), ("slug", slug), ("title", title), ("document", document)]) + } + } + + public static func parse_themeDocumentNotModified(_ reader: BufferReader) -> Theme? { + return Api.Theme.themeDocumentNotModified + } + public static func parse_theme(_ reader: BufferReader) -> Theme? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int64? + _2 = reader.readInt64() + var _3: Int64? + _3 = reader.readInt64() + var _4: String? + _4 = parseString(reader) + var _5: String? + _5 = parseString(reader) + var _6: Api.Document? + if let signature = reader.readInt32() { + _6 = Api.parse(reader, signature: signature) as? Api.Document + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + let _c5 = _5 != nil + let _c6 = _6 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 { + return Api.Theme.theme(flags: _1!, id: _2!, accessHash: _3!, slug: _4!, title: _5!, document: _6!) + } + else { + return nil + } + } + } public enum ChannelAdminLogEventsFilter: TypeConstructorDescription { case channelAdminLogEventsFilter(flags: Int32) diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index a5b0363284..16344d8e88 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -415,6 +415,62 @@ public struct account { } } + } + public enum Themes: TypeConstructorDescription { + case themesNotModified + case themes(hash: Int32, themes: [Api.Theme]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .themesNotModified: + if boxed { + buffer.appendInt32(-199313886) + } + + break + case .themes(let hash, let themes): + if boxed { + buffer.appendInt32(2137482273) + } + serializeInt32(hash, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(themes.count)) + for item in themes { + item.serialize(buffer, true) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .themesNotModified: + return ("themesNotModified", []) + case .themes(let hash, let themes): + return ("themes", [("hash", hash), ("themes", themes)]) + } + } + + public static func parse_themesNotModified(_ reader: BufferReader) -> Themes? { + return Api.account.Themes.themesNotModified + } + public static func parse_themes(_ reader: BufferReader) -> Themes? { + var _1: Int32? + _1 = reader.readInt32() + var _2: [Api.Theme]? + if let _ = reader.readInt32() { + _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Theme.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.account.Themes.themes(hash: _1!, themes: _2!) + } + else { + return nil + } + } + } public enum WallPapers: TypeConstructorDescription { case wallPapersNotModified @@ -2868,6 +2924,33 @@ public extension Api { }) } + public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-637606386) + serializeInt32(flags, buffer: buffer, boxed: false) + fromPeer.serialize(buffer, true) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(randomId.count)) + for item in randomId { + serializeInt64(item, buffer: buffer, boxed: false) + } + toPeer.serialize(buffer, true) + if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(570955184) @@ -2888,6 +2971,31 @@ public extension Api { }) } + public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1224152952) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt32(id, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} + if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(entities!.count)) + for item in entities! { + item.serialize(buffer, true) + }} + if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia], scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-872345397) @@ -2910,33 +3018,6 @@ public extension Api { }) } - public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-637606386) - serializeInt32(flags, buffer: buffer, boxed: false) - fromPeer.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt32(item, buffer: buffer, boxed: false) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(randomId.count)) - for item in randomId { - serializeInt64(item, buffer: buffer, boxed: false) - } - toPeer.serialize(buffer, true) - if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func getScheduledHistory(peer: Api.InputPeer, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-490575781) @@ -3009,31 +3090,6 @@ public extension Api { }) } - public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1224152952) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - serializeInt32(id, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} - if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} - if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) - buffer.appendInt32(Int32(entities!.count)) - for item in entities! { - item.serialize(buffer, true) - }} - if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func sendReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, reaction: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(627641572) @@ -5628,6 +5684,119 @@ public extension Api { return result }) } + + public static func uploadTheme(flags: Int32, file: Api.InputFile, thumb: Api.InputFile?, fileName: String, mimeType: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(473805619) + serializeInt32(flags, buffer: buffer, boxed: false) + file.serialize(buffer, true) + if Int(flags) & Int(1 << 0) != 0 {thumb!.serialize(buffer, true)} + serializeString(fileName, buffer: buffer, boxed: false) + serializeString(mimeType, buffer: buffer, boxed: false) + return (FunctionDescription(name: "account.uploadTheme", parameters: [("flags", flags), ("file", file), ("thumb", thumb), ("fileName", fileName), ("mimeType", mimeType)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Document? in + let reader = BufferReader(buffer) + var result: Api.Document? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Document + } + return result + }) + } + + public static func createTheme(slug: String, title: String, document: Api.InputDocument) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(729808255) + serializeString(slug, buffer: buffer, boxed: false) + serializeString(title, buffer: buffer, boxed: false) + document.serialize(buffer, true) + return (FunctionDescription(name: "account.createTheme", parameters: [("slug", slug), ("title", title), ("document", document)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Theme? in + let reader = BufferReader(buffer) + var result: Api.Theme? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Theme + } + return result + }) + } + + public static func updateTheme(flags: Int32, theme: Api.InputTheme, slug: String?, title: String?, document: Api.InputDocument?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-124161674) + serializeInt32(flags, buffer: buffer, boxed: false) + theme.serialize(buffer, true) + if Int(flags) & Int(1 << 0) != 0 {serializeString(slug!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {serializeString(title!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 2) != 0 {document!.serialize(buffer, true)} + return (FunctionDescription(name: "account.updateTheme", parameters: [("flags", flags), ("theme", theme), ("slug", slug), ("title", title), ("document", document)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Theme? in + let reader = BufferReader(buffer) + var result: Api.Theme? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Theme + } + return result + }) + } + + public static func saveTheme(theme: Api.InputTheme, unsave: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-229175188) + theme.serialize(buffer, true) + unsave.serialize(buffer, true) + return (FunctionDescription(name: "account.saveTheme", parameters: [("theme", theme), ("unsave", unsave)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + + public static func installTheme(format: String, theme: Api.InputTheme) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-520600676) + serializeString(format, buffer: buffer, boxed: false) + theme.serialize(buffer, true) + return (FunctionDescription(name: "account.installTheme", parameters: [("format", format), ("theme", theme)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + + public static func getTheme(format: String, theme: Api.InputTheme, documentId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1919060949) + serializeString(format, buffer: buffer, boxed: false) + theme.serialize(buffer, true) + serializeInt64(documentId, buffer: buffer, boxed: false) + return (FunctionDescription(name: "account.getTheme", parameters: [("format", format), ("theme", theme), ("documentId", documentId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Theme? in + let reader = BufferReader(buffer) + var result: Api.Theme? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Theme + } + return result + }) + } + + public static func getThemes(format: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(676939512) + serializeString(format, buffer: buffer, boxed: false) + serializeInt32(hash, buffer: buffer, boxed: false) + return (FunctionDescription(name: "account.getThemes", parameters: [("format", format), ("hash", hash)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.account.Themes? in + let reader = BufferReader(buffer) + var result: Api.account.Themes? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.account.Themes + } + return result + }) + } } public struct langpack { public static func getLangPack(langPack: String, langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/TelegramCore/AccountManager.swift b/submodules/TelegramCore/TelegramCore/AccountManager.swift index e7053b31fe..2f37b84baf 100644 --- a/submodules/TelegramCore/TelegramCore/AccountManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountManager.swift @@ -122,12 +122,14 @@ private var declaredEncodables: Void = { declareEncodable(CachedLocalizationInfos.self, f: { CachedLocalizationInfos(decoder: $0) }) declareEncodable(CachedSecureIdConfiguration.self, f: { CachedSecureIdConfiguration(decoder: $0) }) declareEncodable(CachedWallpapersConfiguration.self, f: { CachedWallpapersConfiguration(decoder: $0) }) + declareEncodable(CachedThemesConfiguration.self, f: { CachedThemesConfiguration(decoder: $0) }) declareEncodable(SynchronizeGroupedPeersOperation.self, f: { SynchronizeGroupedPeersOperation(decoder: $0) }) declareEncodable(ContentPrivacySettings.self, f: { ContentPrivacySettings(decoder: $0) }) declareEncodable(TelegramDeviceContactImportedData.self, f: { TelegramDeviceContactImportedData(decoder: $0) }) declareEncodable(SecureFileMediaResource.self, f: { SecureFileMediaResource(decoder: $0) }) declareEncodable(CachedStickerQueryResult.self, f: { CachedStickerQueryResult(decoder: $0) }) declareEncodable(TelegramWallpaper.self, f: { TelegramWallpaper(decoder: $0) }) + declareEncodable(TelegramTheme.self, f: { TelegramTheme(decoder: $0) }) declareEncodable(SynchronizeMarkAllUnseenPersonalMessagesOperation.self, f: { SynchronizeMarkAllUnseenPersonalMessagesOperation(decoder: $0) }) declareEncodable(SynchronizeAppLogEventsOperation.self, f: { SynchronizeAppLogEventsOperation(decoder: $0) }) declareEncodable(CachedRecentPeers.self, f: { CachedRecentPeers(decoder: $0) }) diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index 2539e788bb..9b79249143 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -1314,6 +1314,8 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo messageIds.append(MessageId(peerId: peer.peerId, namespace: Namespaces.Message.ScheduledCloud, id: message)) } updatedState.deleteMessages(messageIds) + case let .updateTheme(theme): + break default: break } diff --git a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift index bddb8cf8f4..5d6bb1e239 100644 --- a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift +++ b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift @@ -398,7 +398,6 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, } } - storeMessages.append(StoreMessage(peerId: peerId, namespace: messageNamespace, globallyUniqueId: randomId, groupingKey: localGroupingKey, timestamp: effectiveTimestamp, flags: flags, tags: tags, globalTags: globalTags, localTags: localTags, forwardInfo: nil, authorId: authorId, text: text, attributes: attributes, media: mediaList)) case let .forward(source, grouping, requestedAttributes): let sourceMessage = transaction.getMessage(source) diff --git a/submodules/TelegramCore/TelegramCore/Namespaces.swift b/submodules/TelegramCore/TelegramCore/Namespaces.swift index 1b6fc51ff3..65af9b9e27 100644 --- a/submodules/TelegramCore/TelegramCore/Namespaces.swift +++ b/submodules/TelegramCore/TelegramCore/Namespaces.swift @@ -59,6 +59,7 @@ public struct Namespaces { public static let CloudWallpapers: Int32 = 6 public static let CloudSavedStickers: Int32 = 7 public static let RecentlyUsedHashtags: Int32 = 8 + public static let CloudThemes: Int32 = 9 } struct CachedItemCollection { @@ -70,6 +71,7 @@ public struct Namespaces { public static let cachedStickerQueryResults: Int8 = 5 public static let cachedSecureIdConfiguration: Int8 = 6 public static let cachedWallpapersConfiguration: Int8 = 7 + public static let cachedThemesConfiguration: Int8 = 7 } struct UnorderedItemList { diff --git a/submodules/TelegramCore/TelegramCore/Theme.swift b/submodules/TelegramCore/TelegramCore/Theme.swift new file mode 100644 index 0000000000..96e936ede8 --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/Theme.swift @@ -0,0 +1,90 @@ +import Foundation +#if os(macOS) +import PostboxMac +import SwiftSignalKitMac +import TelegramApiMac +#else +import Postbox +import SwiftSignalKit +import TelegramApi +#endif + +public final class TelegramTheme: OrderedItemListEntryContents, Equatable { + public let id: Int64 + public let accessHash: Int64 + public let slug: String + public let title: String + public let file: TelegramMediaFile + public let isCreator: Bool + public let isDefault: Bool + + public init(id: Int64, accessHash: Int64, slug: String, title: String, file: TelegramMediaFile, isCreator: Bool, isDefault: Bool) { + self.id = id + self.accessHash = accessHash + self.slug = slug + self.title = title + self.file = file + self.isCreator = isCreator + self.isDefault = isDefault + } + + public init(decoder: PostboxDecoder) { + self.id = decoder.decodeInt64ForKey("id", orElse: 0) + self.accessHash = decoder.decodeInt64ForKey("accessHash", orElse: 0) + self.slug = decoder.decodeStringForKey("slug", orElse: "") + self.title = decoder.decodeStringForKey("title", orElse: "") + self.file = decoder.decodeObjectForKey("file", decoder: { TelegramMediaFile(decoder: $0) }) as! TelegramMediaFile + self.isCreator = decoder.decodeInt32ForKey("isCreator", orElse: 0) != 0 + self.isDefault = decoder.decodeInt32ForKey("isDefault", orElse: 0) != 0 + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeInt64(self.id, forKey: "id") + encoder.encodeInt64(self.accessHash, forKey: "accessHash") + encoder.encodeString(self.slug, forKey: "slug") + encoder.encodeString(self.title, forKey: "title") + encoder.encodeObject(self.file, forKey: "file") + encoder.encodeInt32(self.isCreator ? 1 : 0, forKey: "isCreator") + encoder.encodeInt32(self.isDefault ? 1 : 0, forKey: "isDefault") + } + + public static func ==(lhs: TelegramTheme, rhs: TelegramTheme) -> Bool { + if lhs.id != rhs.id { + return false + } + if lhs.accessHash != rhs.accessHash { + return false + } + if lhs.slug != rhs.slug { + return false + } + if lhs.title != rhs.title { + return false + } + if lhs.file.id != rhs.file.id { + return false + } + if lhs.isCreator != rhs.isCreator { + return false + } + if lhs.isDefault != rhs.isDefault { + return false + } + return true + } +} + +extension TelegramTheme { + convenience init?(apiTheme: Api.Theme) { + switch apiTheme { + case let .theme(flags, id, accessHash, slug, title, document): + if let file = telegramMediaFileFromApiDocument(document) { + self.init(id: id, accessHash: accessHash, slug: slug, title: title, file: file, isCreator: (flags & 1 << 0) != 0, isDefault: (flags & 1 << 1) != 0) + } else { + return nil + } + default: + return nil + } + } +} diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift new file mode 100644 index 0000000000..bfbc5c46fb --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -0,0 +1,226 @@ +import Foundation +#if os(macOS) +import PostboxMac +import SwiftSignalKitMac +import TelegramApiMac +#else +import Postbox +import SwiftSignalKit +import TelegramApi +#endif + +final class CachedThemesConfiguration: PostboxCoding { + let hash: Int32 + + init(hash: Int32) { + self.hash = hash + } + + init(decoder: PostboxDecoder) { + self.hash = decoder.decodeInt32ForKey("hash", orElse: 0) + } + + func encode(_ encoder: PostboxEncoder) { + encoder.encodeInt32(self.hash, forKey: "hash") + } +} + +#if os(macOS) +private let themeFormat = "macos" +private let themeFileExtension = "palette" +#else +private let themeFormat = "ios" +private let themeFileExtension = "tgios-theme" +#endif + +public func telegramThemes(postbox: Postbox, network: Network, forceUpdate: Bool = false) -> Signal<[TelegramTheme], NoError> { + let fetch: ([TelegramTheme]?, Int32?) -> Signal<[TelegramTheme], NoError> = { current, hash in + network.request(Api.functions.account.getThemes(format: themeFormat, hash: hash ?? 0)) + |> retryRequest + |> mapToSignal { result -> Signal<([TelegramTheme], Int32), NoError> in + switch result { + case let .themes(hash, themes): + let result = themes.compactMap { TelegramTheme(apiTheme: $0) } + if result == current { + return .complete() + } else { + return .single((result, hash)) + } + case .themesNotModified: + return .complete() + } + } + |> mapToSignal { items, hash -> Signal<[TelegramTheme], NoError> in + return postbox.transaction { transaction -> [TelegramTheme] in + var entries: [OrderedItemListEntry] = [] + for item in items { + var intValue = Int32(entries.count) + let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) + entries.append(OrderedItemListEntry(id: id, contents: item)) + } + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: entries) + transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedThemesConfiguration, key: ValueBoxKey(length: 0)), entry: CachedThemesConfiguration(hash: hash), collectionSpec: ItemCacheCollectionSpec(lowWaterItemCount: 1, highWaterItemCount: 1)) + return items + } + } + } + + if forceUpdate { + return fetch(nil, nil) + } else { + return postbox.transaction { transaction -> ([TelegramTheme], Int32?) in + let configuration = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedThemesConfiguration, key: ValueBoxKey(length: 0))) as? CachedThemesConfiguration + let items = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) + return (items.map { $0.contents as! TelegramTheme }, configuration?.hash) + } + |> mapToSignal { current, hash -> Signal<[TelegramTheme], NoError> in + return .single(current) + |> then(fetch(current, hash)) + } + } +} + +public enum GetThemeError { + case generic +} + +public func getTheme(account: Account, slug: String) -> Signal { + return account.network.request(Api.functions.account.getTheme(format: themeFormat, theme: .inputThemeSlug(slug: slug), documentId: 0)) + |> mapError { _ -> GetThemeError in return .generic } + |> mapToSignal { theme -> Signal in + if let theme = TelegramTheme(apiTheme: theme) { + return .single(theme) + } else { + return .fail(.generic) + } + } +} + +public func saveTheme(account: Account, theme: TelegramTheme) -> Signal { + return saveUnsaveTheme(account: account, theme: theme, unsave: false) +} + +public func deleteTheme(account: Account, theme: TelegramTheme) -> Signal { + return saveUnsaveTheme(account: account, theme: theme, unsave: true) +} + +private func saveUnsaveTheme(account: Account, theme: TelegramTheme, unsave: Bool) -> Signal { + return account.network.request(Api.functions.account.saveTheme(theme: Api.InputTheme.inputTheme(id: theme.id, accessHash: theme.accessHash), unsave: unsave ? Api.Bool.boolTrue : Api.Bool.boolFalse)) + |> `catch` { _ -> Signal in + return .complete() + } + |> mapToSignal { _ -> Signal in + return .single(Void()) + } +} + +public func installTheme(account: Account, theme: TelegramTheme) -> Signal { + return account.network.request(Api.functions.account.installTheme(format: themeFormat, theme: Api.InputTheme.inputTheme(id: theme.id, accessHash: theme.accessHash))) + |> `catch` { _ -> Signal in + return .complete() + } + |> mapToSignal { _ -> Signal in + return .complete() + } +} + +public enum UploadThemeStatus { + case progress(Float) + case complete(TelegramMediaFile) +} + +public enum UploadThemeError { + case generic +} + +private struct UploadedThemeData { + fileprivate let resource: MediaResource + fileprivate let content: UploadedThemeDataContent +} + +private enum UploadedThemeDataContent { + case result(MultipartUploadResult) + case error +} + +private func uploadedTheme(postbox: Postbox, network: Network, resource: MediaResource) -> Signal { + return multipartUpload(network: network, postbox: postbox, source: .resource(.standalone(resource: resource)), encrypt: false, tag: TelegramMediaResourceFetchTag(statsCategory: .file), hintFileSize: nil, hintFileIsLarge: false) + |> map { result -> UploadedThemeData in + return UploadedThemeData(resource: resource, content: .result(result)) + } + |> `catch` { _ -> Signal in + return .single(UploadedThemeData(resource: resource, content: .error)) + } +} + +private func uploadTheme(account: Account, resource: MediaResource) -> Signal { + let fileName = "theme.\(themeFileExtension)" + let mimeType = "application/x-tgtheme-\(themeFormat)" + + return uploadedTheme(postbox: account.postbox, network: account.network, resource: resource) + |> mapError { _ -> UploadThemeError in return .generic } + |> mapToSignal { result -> Signal<(UploadThemeStatus, MediaResource?), UploadThemeError> in + switch result.content { + case .error: + return .fail(.generic) + case let .result(resultData): + switch resultData { + case let .progress(progress): + return .single((.progress(progress), result.resource)) + case let .inputFile(file): + return account.network.request(Api.functions.account.uploadTheme(flags: 0, file: file, thumb: nil, fileName: fileName, mimeType: mimeType)) + |> mapError { _ in return UploadThemeError.generic } + |> mapToSignal { document -> Signal<(UploadThemeStatus, MediaResource?), UploadThemeError> in + if let file = telegramMediaFileFromApiDocument(document) { + return .single((.complete(file), result.resource)) + } else { + return .fail(.generic) + } + } + default: + return .fail(.generic) + } + } + } + |> map { result, _ -> UploadThemeStatus in + return result + } +} + +public enum CreateThemeError { + case generic +} + +public func createTheme(account: Account, resource: MediaResource, title: String, slug: String) -> Signal { + return uploadTheme(account: account, resource: resource) + |> mapError { _ in return CreateThemeError.generic } + |> mapToSignal { status -> Signal in + switch status { + case let .complete(file): + if let resource = file.resource as? CloudDocumentMediaResource { + return account.network.request(Api.functions.account.createTheme(slug: slug, title: title, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)))) + |> mapError { _ in return CreateThemeError.generic } + |> mapToSignal { apiTheme -> Signal in + if let theme = TelegramTheme(apiTheme: apiTheme) { + return .single(theme) + } else { + return .fail(.generic) + } + } + } + else { + return .fail(.generic) + } + default: + return .complete() + } + } +} + +public func updateTheme(account: Account, theme: TelegramTheme, title: String?, resource: MediaResource?) -> Signal { + guard title != nil || resource != nil else { + return .complete() + } + + return .never() +} diff --git a/submodules/TelegramCore/TelegramCore/Wallpapers.swift b/submodules/TelegramCore/TelegramCore/Wallpapers.swift index a84b61d740..565dce34e7 100644 --- a/submodules/TelegramCore/TelegramCore/Wallpapers.swift +++ b/submodules/TelegramCore/TelegramCore/Wallpapers.swift @@ -26,7 +26,7 @@ final class CachedWallpapersConfiguration: PostboxCoding { } public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: Bool = false) -> Signal<[TelegramWallpaper], NoError> { - let fetch: ([TelegramWallpaper]?, Int32?) -> Signal<[TelegramWallpaper], NoError> = { list, hash in + let fetch: ([TelegramWallpaper]?, Int32?) -> Signal<[TelegramWallpaper], NoError> = { current, hash in network.request(Api.functions.account.getWallPapers(hash: hash ?? 0)) |> retryRequest |> mapToSignal { result -> Signal<([TelegramWallpaper], Int32), NoError> in @@ -49,7 +49,7 @@ public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: items.append(.builtin(WallpaperSettings())) } - if items == list { + if items == current { return .complete() } else { return .single((items, hash)) @@ -85,9 +85,9 @@ public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: return (items.map { $0.contents as! TelegramWallpaper }, configuration?.hash) } } - |> mapToSignal { list, hash -> Signal<[TelegramWallpaper], NoError> in - return .single(list) - |> then(fetch(list, hash)) + |> mapToSignal { current, hash -> Signal<[TelegramWallpaper], NoError> in + return .single(current) + |> then(fetch(current, hash)) } } } @@ -101,7 +101,7 @@ public enum UploadWallpaperError { case generic } -public struct UploadedWallpaperData { +private struct UploadedWallpaperData { fileprivate let resource: MediaResource fileprivate let content: UploadedWallpaperDataContent } @@ -134,9 +134,9 @@ public func uploadWallpaper(account: Account, resource: MediaResource, mimeType: return .single((.progress(progress), result.resource)) case let .inputFile(file): return account.network.request(Api.functions.account.uploadWallPaper(file: file, mimeType: mimeType, settings: apiWallpaperSettings(settings))) - |> mapError {_ in return UploadWallpaperError.generic} - |> mapToSignal { wallpaper -> Signal<(UploadWallpaperStatus, MediaResource?), UploadWallpaperError> in - return .single((.complete(TelegramWallpaper(apiWallpaper: wallpaper)), result.resource)) + |> mapError { _ in return UploadWallpaperError.generic } + |> map { wallpaper -> (UploadWallpaperStatus, MediaResource?) in + return (.complete(TelegramWallpaper(apiWallpaper: wallpaper)), result.resource) } default: return .fail(.generic) diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 93fa992764..3f4ff9c444 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -22,6 +22,8 @@ 0962E66F21B6147600245FD9 /* AppConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E66E21B6147600245FD9 /* AppConfiguration.swift */; }; 0962E67521B6437600245FD9 /* SplitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67421B6437600245FD9 /* SplitTest.swift */; }; 0962E68121BAA20E00245FD9 /* SearchBotsConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E68021BAA20E00245FD9 /* SearchBotsConfiguration.swift */; }; + 09B4A9B4230FB70B005C2E08 /* Themes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B3230FB70B005C2E08 /* Themes.swift */; }; + 09B4A9B6230FBB2B005C2E08 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B5230FBB2B005C2E08 /* Theme.swift */; }; 09EC0DE922C6825D00E7185B /* AppUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EC0DE822C6825D00E7185B /* AppUpdate.swift */; }; 09EDAD382213120C0012A50B /* AutodownloadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD372213120C0012A50B /* AutodownloadSettings.swift */; }; 09EDAD3A22131D010012A50B /* ManagedAutodownloadSettingsUpdates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD3922131D010012A50B /* ManagedAutodownloadSettingsUpdates.swift */; }; @@ -808,6 +810,8 @@ 0962E66E21B6147600245FD9 /* AppConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConfiguration.swift; sourceTree = ""; }; 0962E67421B6437600245FD9 /* SplitTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitTest.swift; sourceTree = ""; }; 0962E68021BAA20E00245FD9 /* SearchBotsConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBotsConfiguration.swift; sourceTree = ""; }; + 09B4A9B3230FB70B005C2E08 /* Themes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Themes.swift; sourceTree = ""; }; + 09B4A9B5230FBB2B005C2E08 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; 09EC0DE822C6825D00E7185B /* AppUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppUpdate.swift; sourceTree = ""; }; 09EDAD372213120C0012A50B /* AutodownloadSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutodownloadSettings.swift; sourceTree = ""; }; 09EDAD3922131D010012A50B /* ManagedAutodownloadSettingsUpdates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedAutodownloadSettingsUpdates.swift; sourceTree = ""; }; @@ -1270,6 +1274,7 @@ 0962E66E21B6147600245FD9 /* AppConfiguration.swift */, 0962E68021BAA20E00245FD9 /* SearchBotsConfiguration.swift */, 09EDAD372213120C0012A50B /* AutodownloadSettings.swift */, + 09B4A9B5230FBB2B005C2E08 /* Theme.swift */, ); name = Settings; sourceTree = ""; @@ -1667,6 +1672,7 @@ D099E221229420D600561B75 /* BlockedPeersContext.swift */, D098907E22942E3B0053F151 /* ActiveSessionsContext.swift */, D069257022D8B526002FC021 /* SecretChatSettings.swift */, + 09B4A9B3230FB70B005C2E08 /* Themes.swift */, ); name = Settings; sourceTree = ""; @@ -2148,6 +2154,7 @@ D03B0CE01D62249100955575 /* StoreMessage_Telegram.swift in Sources */, D03E416C2304D5B30049C28B /* ValidateAddressNameInteractive.swift in Sources */, D08774FE1E3E3A3500A97350 /* GlobalNotificationSettings.swift in Sources */, + 09B4A9B6230FBB2B005C2E08 /* Theme.swift in Sources */, D023E67821540624008C27D1 /* UpdateMessageMedia.swift in Sources */, D0EE7FC420986C5300981319 /* SecureIdPassportRegistrationValue.swift in Sources */, D03B0CB91D62233400955575 /* Either.swift in Sources */, @@ -2155,6 +2162,7 @@ 0962E66D21B5C56F00245FD9 /* JSON.swift in Sources */, D0338740223BD48B007A2CE4 /* ContactsSettings.swift in Sources */, D03B0CBD1D62234300955575 /* Regex.swift in Sources */, + 09B4A9B4230FB70B005C2E08 /* Themes.swift in Sources */, D00BDA191EE593D600C64C5E /* TelegramChannelAdminRights.swift in Sources */, 09EDAD3A22131D010012A50B /* ManagedAutodownloadSettingsUpdates.swift in Sources */, D0EA188220D3D2B1001AEE19 /* RemoteStorageConfiguration.swift in Sources */, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index 2bac77cd0c..d369fb0062 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -9,6 +9,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta let badgeFillColor: UIColor let badgeTextColor: UIColor + let secondaryBadgeTextColor: UIColor let outgoingBubbleFillColor: UIColor let outgoingBubbleHighlightedFillColor: UIColor let outgoingScamColor: UIColor @@ -23,6 +24,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta if accentColor.rgb == UIColor.white.rgb { badgeFillColor = .white badgeTextColor = .black + secondaryBadgeTextColor = .black outgoingBubbleFillColor = UIColor(rgb: 0x313131) outgoingBubbleHighlightedFillColor = UIColor(rgb: 0x464646) outgoingScamColor = destructiveColor @@ -41,6 +43,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta if lightness > 0.7 { outgoingScamColor = .black + secondaryBadgeTextColor = .black outgoingPrimaryTextColor = .black outgoingSecondaryTextColor = UIColor(rgb: 0x000000, alpha: 0.5) outgoingLinkTextColor = .black @@ -48,6 +51,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta } else { outgoingScamColor = .white + secondaryBadgeTextColor = .white outgoingPrimaryTextColor = .white outgoingSecondaryTextColor = UIColor(rgb: 0xffffff, alpha: 0.5) outgoingLinkTextColor = .white @@ -153,7 +157,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta itemCheckColors: PresentationThemeFillStrokeForeground( fillColor: accentColor, strokeColor: UIColor(rgb: 0xffffff, alpha: 0.5), - foregroundColor: badgeTextColor + foregroundColor: secondaryBadgeTextColor ), controlSecondaryColor: UIColor(rgb: 0xffffff, alpha: 0.5), freeInputField: PresentationInputFieldTheme( @@ -188,7 +192,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta failedForegroundColor: .white, muteIconColor: UIColor(rgb: 0x8e8e92), unreadBadgeActiveBackgroundColor: accentColor, - unreadBadgeActiveTextColor: badgeTextColor, + unreadBadgeActiveTextColor: secondaryBadgeTextColor, unreadBadgeInactiveBackgroundColor: UIColor(rgb: 0x666666), unreadBadgeInactiveTextColor:UIColor(rgb: 0x000000), pinnedBadgeColor: UIColor(rgb: 0x767677), @@ -207,7 +211,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta let message = PresentationThemeChatMessage( incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628))), primaryTextColor: .white, secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.4), pendingActivityColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaPlaceholderColor: UIColor(rgb: 0x1f1f1f).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x737373), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0x000000), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff))), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor.white.withAlphaComponent(0.5), scamColor: outgoingScamColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: .white, accentControlColor: .white, mediaActiveControlColor: .white, mediaInactiveControlColor: UIColor(rgb: 0xffffff, alpha: 0.3), pendingActivityColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileTitleColor: .white, fileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaPlaceholderColor: UIColor(rgb: 0x313131).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: .white, radioProgress: .white, highlight: UIColor(white: 1.0, alpha: 0.12), separator: UIColor(white: 1.0, alpha: 0.3), bar: .white), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff))), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor.white.withAlphaComponent(0.5), scamColor: outgoingScamColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: UIColor(rgb: 0x313131).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: outgoingPrimaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff))), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x1f1f1f), highlightedFill: UIColor(rgb: 0x2a2a2a), stroke: UIColor(rgb: 0x1f1f1f)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x1f1f1f), highlightedFill: UIColor(rgb: 0x2a2a2a), stroke: UIColor(rgb: 0x1f1f1f))), infoPrimaryTextColor: .white, infoLinkTextColor: accentColor, @@ -320,7 +324,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta inputPlaceholderColor: UIColor(rgb: 0x8f8f8f), inputTextColor: .white, inputClearButtonColor: UIColor(rgb: 0x8f8f8f), - checkContentColor: .white + checkContentColor: secondaryBadgeTextColor ) let contextMenu = PresentationThemeContextMenu( diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 92adff2cb6..5f62d281b1 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -16,16 +16,22 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let outgoingCheckColor: UIColor let outgoingControlColor: UIColor let outgoingBubbleFillColor: UIColor - if accentColor.lightness > 0.7 { + let outgoingBubbleStrokeColor: UIColor + if accentColor.lightness > 0.705 { outgoingPrimaryTextColor = .black - outgoingSecondaryTextColor = UIColor(rgb: 0x000000, alpha: 0.65) + outgoingSecondaryTextColor = UIColor(rgb: 0x000000, alpha: 0.55) outgoingLinkTextColor = .black outgoingCheckColor = .black outgoingControlColor = outgoingPrimaryTextColor outgoingBubbleFillColor = accentColor + if outgoingBubbleFillColor.rgb == 0xffffff { + outgoingBubbleStrokeColor = UIColor(rgb: 0xc8c7cc) + } else { + outgoingBubbleStrokeColor = outgoingBubbleFillColor + } let hsv = accentColor.hsv - accentColor = UIColor(hue: hsv.0, saturation: hsv.1 * 1.1, brightness: min(hsv.2, 0.7), alpha: 1.0) + accentColor = UIColor(hue: hsv.0, saturation: min(1.0, hsv.1 * 1.1), brightness: min(hsv.2, 0.6), alpha: 1.0) } else { outgoingPrimaryTextColor = .white outgoingSecondaryTextColor = UIColor(rgb: 0xffffff, alpha: 0.65) @@ -33,6 +39,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr outgoingCheckColor = .white outgoingControlColor = outgoingPrimaryTextColor outgoingBubbleFillColor = accentColor + outgoingBubbleStrokeColor = outgoingBubbleFillColor } let rootTabBar = PresentationThemeRootTabBar( @@ -201,8 +208,8 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr ) let messageDay = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleStrokeColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xDADADE), stroke: UIColor(rgb: 0xE5E5EA)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xE5E5EA))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), diff --git a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift index b1d7061085..fb65ef16a7 100644 --- a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift @@ -16,6 +16,10 @@ public func makePresentationTheme(themeReference: PresentationThemeReference, ac case .day: theme = makeDefaultDayPresentationTheme(accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: true, preview: preview) } + case let .local(resource): + theme = makeDefaultDayPresentationTheme(serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: false, preview: preview) + case let .cloud(info): + theme = makeDefaultDayPresentationTheme(serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: false, preview: preview) } return theme } diff --git a/submodules/TelegramPresentationData/Sources/PresentationData.swift b/submodules/TelegramPresentationData/Sources/PresentationData.swift index ae7fa81dfa..bee81a651c 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationData.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationData.swift @@ -338,6 +338,8 @@ private func automaticThemeShouldSwitchNow(_ parameters: AutomaticThemeSwitchPar default: break } + default: + return false } switch parameters.trigger { case .none: diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift index 10be928c5c..84a91cad0f 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift @@ -2,19 +2,6 @@ import Foundation import UIKit import Display -private func generateArrowImage(_ theme: PresentationTheme) -> UIImage? { - return generateImage(CGSize(width: 7.0, height: 13.0), rotatedContext: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setStrokeColor(theme.list.disclosureArrowColor.cgColor) - context.setLineWidth(1.98) - context.setLineCap(.round) - context.setLineJoin(.round) - context.translateBy(x: 1.0, y: 1.0) - - let _ = try? drawSvgPath(context, path: "M0,0 L4.79819816,5.27801798 L4.79819816,5.27801798 C4.91262453,5.40388698 4.91262453,5.59611302 4.79819816,5.72198202 L0,11 S ") - }) -} - public func generateItemListCheckIcon(color: UIColor) -> UIImage? { return generateImage(CGSize(width: 12.0, height: 10.0), rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) @@ -29,19 +16,14 @@ public func generateItemListCheckIcon(color: UIColor) -> UIImage? { } public func generateItemListPlusIcon(_ color: UIColor) -> UIImage? { - return generateImage(CGSize(width: 18.0, height: 18.0), rotatedContext: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(color.cgColor) - context.setLineCap(.round) - let lineWidth: CGFloat = 2.0 - context.fill(CGRect(x: floorToScreenPixels((18.0 - lineWidth) / 2.0), y: 0.0, width: lineWidth, height: 18.0)) - context.fill(CGRect(x: 0.0, y: floorToScreenPixels((18.0 - lineWidth) / 2.0), width: 18.0, height: lineWidth)) - }) + return generateTintedImage(image: UIImage(bundleImageName: "Chat List/AddIcon"), color: color) } public struct PresentationResourcesItemList { public static func disclosureArrowImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.itemListDisclosureArrow.rawValue, generateArrowImage) + return theme.image(PresentationResourceKey.itemListDisclosureArrow.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Item List/DisclosureArrow"), color: theme.list.disclosureArrowColor) + }) } public static func checkIconImage(_ theme: PresentationTheme) -> UIImage? { @@ -113,9 +95,9 @@ public struct PresentationResourcesItemList { }) } - public static func addExceptionIcon(_ theme: PresentationTheme) -> UIImage? { + public static func addChannelIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.itemListAddExceptionIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Item List/AddExceptionIcon"), color: theme.list.itemAccentColor) + return generateTintedImage(image: UIImage(bundleImageName: "Item List/AddChannelIcon"), color: theme.list.itemAccentColor) }) } diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift index 2ef6886592..ba4958757d 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift @@ -48,7 +48,7 @@ public struct PresentationResourcesRootController { public static func navigationCallIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.navigationCallIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Info/CallButton"), color: theme.rootController.navigationBar.accentTextColor) + return generateTintedImage(image: UIImage(bundleImageName: "Call List/CallIcon"), color: theme.rootController.navigationBar.accentTextColor) }) } @@ -66,14 +66,15 @@ public struct PresentationResourcesRootController { public static func navigationCompactSearchIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.navigationCompactSearchIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat List/SearchIcon"), color: theme.rootController.navigationBar.accentTextColor).flatMap({ image in - let factor: CGFloat = 0.8 - let size = CGSize(width: floor(image.size.width * factor), height: floor(image.size.height * factor)) - return generateImage(size, contextGenerator: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.draw(image.cgImage!, in: CGRect(origin: CGPoint(), size: size)) - }) - }) + return generateTintedImage(image: UIImage(bundleImageName: "Chat List/SearchIcon"), color: theme.rootController.navigationBar.accentTextColor) +// return generateTintedImage(image: UIImage(bundleImageName: "Chat List/SearchIcon"), color: theme.rootController.navigationBar.accentTextColor).flatMap({ image in +// let factor: CGFloat = 0.8 +// let size = CGSize(width: floor(image.size.width * factor), height: floor(image.size.height * factor)) +// return generateImage(size, contextGenerator: { size, context in +// context.clear(CGRect(origin: CGPoint(), size: size)) +// context.draw(image.cgImage!, in: CGRect(origin: CGPoint(), size: size)) +// }) +// }) }) } diff --git a/submodules/TelegramUI/Images.xcassets/Call List/CallIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Call List/CallIcon.imageset/Contents.json new file mode 100644 index 0000000000..679a5bed44 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Call List/CallIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_addcall.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Call List/CallIcon.imageset/ic_addcall.pdf b/submodules/TelegramUI/Images.xcassets/Call List/CallIcon.imageset/ic_addcall.pdf new file mode 100644 index 0000000000000000000000000000000000000000..266479298e68f4bd80a02c33985f67953dd7d412 GIT binary patch literal 4939 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 R1%XSzU?5&zH63-({{d)Bvi<-7 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/Contents.json index 0300ffdc7f..65904a6348 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/Contents.json @@ -2,16 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "DialogList_Muted@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "ic_mutedchat.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/DialogList_Muted@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/DialogList_Muted@2x.png deleted file mode 100644 index 06f297b781957d1b4773242e1ca2601212dabe76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqEBNeutY4NNL8^S!d@G~E_u~a{;Q+l zT9yfcb$@ui^)J3=RH0w>(U<-Fr|aQv>LF4s`w~>IFqQ9QJ6q$}#_k4mB7>)^pUXO@ GgeCy1I7}A+ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/ic_mutedchat.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/PeerMutedIcon.imageset/ic_mutedchat.pdf new file mode 100644 index 0000000000000000000000000000000000000000..830c7b25335dca902e26c29d70decebb184d88c0 GIT binary patch literal 4283 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 RRmuPW002ovPDHLkV1mMN!>s@S diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/ShareIcon.imageset/ConversationChannelInlineShareIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Chat/Message/ShareIcon.imageset/ConversationChannelInlineShareIcon@3x.png deleted file mode 100644 index 600f3a10be6565dee609203f7f8c6b52dd1cb11e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmV-!0+IcRP)Px%C`m*?R9Fe+mOU>7Q51%E5i}wZA|zP7_=r{^LZMJltZbq43v{9re?cWt`3(vo z@ll9MA{rsFB%(se5?Rk#vy+|KYv#_*oomBM-ktk-&NFAu-I-MCKUuL@%%O~ldu}k{ z#OFi64ov_i0Vk{jCIFLyGXj_-Tx`Ik;bH;WfU6nM7F6v<#j2=)buzw> zMpW~b#*UPk18x_9SxXSAFr~~@O#rrxe$&)72a){SU!t}uYC8kpwdTAr{O{JadI6JM zxHU)Cdg$Mx7MZYYo{W`aS7vU7!MXtxz*6SOS|ja8)Fp!<_QCu)Iz?CL#gU9lt>(}o z(lKSmJR5$J|rtbK!QIoL1Hy@iso`ZlMjnxgNYzv3lVd zE4$}5?-jRt#+ZCKMl$wJQ9*0Y)M3;$BNVtN;K207*qo IM6N<$f)XthHUIzs diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Message/ShareIcon.imageset/ic_chat_share.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Message/ShareIcon.imageset/ic_chat_share.pdf new file mode 100644 index 0000000000000000000000000000000000000000..156646235388cd03e19f93b68db80891aa41f491 GIT binary patch literal 4140 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json new file mode 100644 index 0000000000..8033bd89cd --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_addchannel.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/ic_addchannel.pdf b/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/ic_addchannel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0eb106737a906a74754ee7d31d74c31073932ba7 GIT binary patch literal 4747 zcmai&2{cr1+{Z0b)==3(xnxN+X0uEo`=rgDeHmu#jO>&(OBmS`g)AjmLkW#NOJeM@ zXWz*ZG08jn*ZZ&Yf6saEx#!;JexKj`&hy;+oA3ENkD!LK>IEnmPA}LvvoW)jv-z~M zv56i5KmeSD9leYUAbuU|WbI}HNRTBhKwQ<$fQ1gDx022k*!0nL^ z=FiYkDJ!oBoD-xHXIb`YX87=0>NGIKLU;6WcZ(xfbhDjK**0^_7+d)|EsFGsDU=CQ5nPCMqQu+AT| zXt-0e)Z^PcX1rku1NNof7x#+!Rz`cmn67MXoqb(pG{AI9aHwxc-fdTI_ErRVe*1Yr zFy2Q`H^#u>^?a9&<@rXZ2VLE?sB5b~s=K2F(wx+_Iwz1tGKOD+(BE{wOf~n+E2pzUXpCm=iaO@?1^{#Evzl_DQFSbyTNE|Tm*|z%A{9>b z>$CuUDeE7Kd(+%?H}%a;vileuV4}s@gKbtjMg2UfPcQhtVtEkf0^i+GL0Lb$iK1W6 zsp9r^*K+V41mxCgZMa+VgUm8<7^_#gkBO=p@m(5em-;eO)vR-$vZ5N_T?D6|hms&# zUsshXBr`~$<4e->$@8gP@p>!TYy>;aEM7>ZXb>b)_hS8-4ZbMJr0$>@g?>`^6}@&a z-x{B5tx8_SP32Pjpvk8j3^z7z2D35L_MPC8x!0wrq|CT(YFu^y$&fFjMEvw7>}b31 z>b)vrf6Uj4`PIpk3Z@Sf3Z9&#+q}`st(%Np5BG<`*{%0Sxkl1W7`c#!Slw}E)SG7l z_eYz}f#6XoJbzHx;N24eAX)kJMfJ7jC6~Y`K{;dOet~itc)y{ z%j~uyuCg|KCdi-``SQxI(I+Pq&{!UsRM6*ZdJ&??PFolKwb?ZC4$3dvzsH~BlGy%r z|AWm|;;8lc^_|_=A461*Gx-^2;aR2LF#}Og)XfHvBa)QWIk*Gr+@;q)=&??iUw>_K z>(CJnZQ$^Zl#)E`JZ!@LFbf@TXDlGDfwum6b-_Bh0q}o}LksJQb9b@Cx&o5_2ue67 zH*&u#aA-DKhbHnX-(ml6^U-j@S!!e503&izWmUig5Ld!E;9Rtw(Uw@?(4CZAp@7t{ z1b^g^{v*dP14I6d62D0vkhsF3i8+xS3=mhwde~ZGwNQ%xzqh46^wiNFWDg?}qzIiS z_yNH!E+0Ce`_dIQkY>1AfCg1)u#kuH5mnaXBDXL)wUnqZeoGZrhI>I419TfK8clVY z$|^IXcze3F0*TGBl>KId@xi(BfkEpv-+@XBjqgFAdN+N_07Qm9>*`XS@rjddjXPAF zER;<8l(iF9Rv^?jWvbrq1li=|7gw4}w^zXdn5tp18Vw=W{saG5ekmn^qZITieUdVM zLL4(x3EHLaPr(jAAGQ)jV4+YLdj?%*KL1o>k;8V*tY}s1qa>l}3@(F?Q|}OI_$rOD z6v2rsJSfBXk>F?Rth+Q=f{t1W#mvsRo}O<{u2Vo*lg&QP31v8h!&F#Lt%h$N*`cU@?in5KYFGZ=SR&KD=JQ)~+u zK0aMqov2Gu=6FBlpcip zP!o#WNp4#u-MaLg<8t6xH8wa_W#)O#^J~fq%h4Xzf^lx8+S7b-w>q6TQ!;%oGgXXS!w~N z%RW@TOGYeE`j+Zo6W0~^wP&{(qcJXmnPR81#)BQ|s7}Pt zxILvu1cD({V&=zq0^rWnV*o{Pz!etiht%LJRJQV<5(T+W6!Z$vPm~__?3^ij1ARI{ zH-jXdj~avYYL7WHFb1IH=|k(TK`6%pZE1tPu&`w+yo_PbW=>Y@XW=%a^;S~QkY=TR zuM{4`5+}dgDfEK#{JobMN*c0TXWh6eX-)3!J*DXc5J&eZeS?obqUu2(`$X|3V6gZS z4=t*`?X$8M+Y=g&+Tn?-Z`tLT%Ii5MxW7<{g_zaH)5^EdQg^B9({isXE5_&xP#)*A zkLAy%%2i2;Van#Nh`JJcdz$)aSO)qLCwtSWsW1clgvBj%zr|HZ-y_RMx2|){N?NhN z19yX-S@gYnt}mQ_*@I5<_~WPxjknCB&5eqaUQvHSFJIzeYOXys$>Z$zmeUyKBvA+| zXCA;;1uQijn-E&}dUt+|buEaw&h?AMUA}61e;)rc(~pYUj3Jk zDpL*B3Cg}#eZ^7n@TAS8sn&w{yjc6hrKCH8>Inl$o=IllbYU|-|EoWqe}7A*Stnno z9hg;oD?@dntX?)mO(i8W(c->Eibc4^y-A7pnu71*0^`b0sOQQr6n6_gcZqSa@ z2hNKk<`6y8h^c0XgX!;Ki^Y}UK5zHzzBVk%F2-}Ea8+}i;?m_xLNrO7N^weQO_@oV zLo}D!7&5#D8O|8ay*7m;Ca-?fu@WqeL}nBeuH;{@zPMSD=30iFW_m$-b`7e=$p1raCop6lsqnb&MMgwM4LS{-HDP)7 zWo%y8`7Fb%OHI<2Z*E7d%S{;x6^Ey)#i>QL-q8NkJEmh^Nh~8W+RxeuA@U@unlp<> z3=HyB`=25kWLoZKc|YD2Wsr^3k4$ABWj7OB5!1e~B*tqXVsJ#?v23w;uVJV$#ooly zw>i{q%CfZM`RMHHg4_$^9yKezmr_iMN7<`xRuQ+Ew)sgyBq)t+m{%BqY3Gxh$GNIt z-@fBZ^Am47*6~v`!gqvU^{C~Hry6vKbR6r*VqoO>!qIzy)1~Y7#9JPhSTF{RH}i7N z=+zxgoHAV6`*>p@YR;q4v2pa1?BM=ek|^^v=2%o@b3#u192b$n^nOy2UaVeGdEAc0 zn%!EC+(o%?xhT1l)gIM(zT)4|`&9cLd!w5JU*`4(Na`SIP(Ix}eKtrHbc;rg0Y-P? zh&!mEj*UQh#6Li5sMOmq_ z>PmD=cMB>qiv1e9r)n$ey-FYIhRPk4B$aDP`eFv9)2etwJn&qWotK;Kj(~?t?oRjU zwXmt>N&2Z(Fx>cI>GF`v>zUj(VquI~ox$z%XSjJ!kFy+vpRCWFxn8(sR^d4V8i=n7 zBgM@%iOxl>n|#B5j|C+KmjrhyCpDUcTdEbRv8hc_sVltx>|SEF5jdTj5R;H40?+Nr zZMO|B`&QPYD2R?I7Bzv(3KPT|5LpnV$`7`EtGXvM<-209pK~>^s(SR`$MvsQ@B)to z?-?+Z+Ler1qp;~8G(R4n-I`9Bc4|A_y4gzdldzKTbhobd_!0WOPGZ%bsUW1k(0I7w zrl(0=<;2(OrD#XM@yg(rHr2K$Ecdum#8|K9Q_bRPbDPq&*(SvbMa>Dqg$^SohxZO_ z4lAQpr3H4wN&Kc=UoF}uBPP`aN8*;o4Se->M?Y={uMnPXKO=d5_Mr6~8C|H{)K9iB zFdghH{A^M%^Km0{qr6IQx%w8`=(ahtZ8Rpj4ECagaJ9$|)t9rFy%@+9oia;Uyi>lC zI@CNoP&4l6-$NNi{hmhd3@gt&|CSvM`vL{W_vn#{{08Du=3-@ywZECa^2(L6 zj_`fCAiSTx{if3}!Z4$Mq(A&kwxsQy>vzT%0(w$UcbvX(`SHQsE&O(JO6dpdYsA7ITYicKNwk>MO+7xmoaD$Az3Qwxg=$JzpuicHrlTylpAr0=>(dDewUlS{s- zzJ!&~{iyykRcQ~+mi=rOUavV47Mx4>A5IlKs6OI5w`W2UAKR|pm)Z34M<3~Zn|;gWsZ3#d_48>jFBk0heH*aKC2TD}9WW=B-nWhp zeXAsXkhoi<-f)DNOB7WtQ(Z(AposWg{HV{Xt@mHr@JT&WAvGdD-s~iH<)!<1k_gro zt&LyoyOxqKUmbfVk|Np_ivbP+Rtqrs9dZcK zznS=7#&!k7Z(uRDXhobCU<4tDzz@%#knBz-Zzv#s%@*TIhUY^>CujQukfDd+e`i!e zyP+L$*8kwU>o0Eq7t5j0U%xo#h_+PM25w-k`fYd z3BU^Yr6FJvJGofAYbR|3@4Q zPA-Gb${$C9SC0Eh!I5!uxtpnEO=MImytq=MAk(WhUI2^fZ z4l9HFBGsI%aO4vDr>#sbA{h)+5+N-GfmvE$rLa&dI0gzwNFlH=h%^Q*A&r!lqyPUy Z{wYFNH*#tG{2&N896~QBsG_b)|35u6RYCv& literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/Contents.json deleted file mode 100644 index ebc5665c79..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "plus@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "plus@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/plus@2x.png b/submodules/TelegramUI/Images.xcassets/Item List/AddExceptionIcon.imageset/plus@2x.png deleted file mode 100644 index 7fd6bbc381fc5f2bc63fb72465283add508cfcfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcmV-z1d{uSP) z1F&pI5IwPN+bG1gokDEePG;uYF2pFrP9e5!JDFa6+xPFO?YjH84|_4EYTkRR+4FmP z`gEUf(mP0OhGFk$z zcr2XU4=W`YAN6QinNeNO!4%HHkjhHP1g>~Ito+cLjQkEOBS-{J4u>o52sdSQxbli{ zm960l2g1qea0LS+pH|nx__I76Cs*U1XsNUa?+GjK#b3zdH*yC__I$6(`Y?sdVEqTJ z_H)Hk5k-q3F_2&!B`L%BtCETkbH4Qn%9C)iJemS8k@b&hL>5%nAm(H`cSbIRk;(cG z_!9jmY=mCHmDh!p&y@5O^eG&JwBcl182_tAz6e*?y%&*I(!6-CusyQEpvkMj`qwn_ z72nd zVY=w)Ux&^R*J)OdKtP4os84{Kv}(tSsC7D#k~etbDq7N-hxKpN$QOpRzYKK|xGJG9 z`-nXWWj}#3xhqqcjT_vA4O^?1%5GwcX#IcO6HYcp5^(ufHSJs2Az0!}XI@b5*{`wOSBADj`ptB4dA5^KC< zUM)KROQZMk#3?X6ApVmQm%03-+X_b+ry}w*Nh~&WPEPE>82POd_Y?UCr|}+Kk`Kf<);?$ps7xOTC2=!n(x`eNq-ICMD#0fg>JX5MvD5u7g=?(jC4$z zJ-sU(iXMTcdfjmRo(5zVIj!lTq>JbG-YuG;8R4&_d{Na$(QHewwYRc6nUt!akwmk}C9gWe|_GlL2@NUt`X)2O_!l?~@`M zCQZBSK?9Or9&Is_Y%tAF%kgcKKlE=V9|N8j=$%o<$I`0@-nm6e_IwL zbmwx?cN^jGcOkZyl`O^05d(=~98Cj0j&p#8tEvssIQfyv3!#WAFUaqSJ( zBCSAy)`!i%xFkyN_a~>n!fXDN^b7A9OSCtczF}Pa(P8-?ss4t0 z0cL8!31-(VKT8_SeWCH4DT1%$UIM4i9e3xj4fkFc%{E=rcf?0*!`v4^lXZ2}HeJf& zy1iGge1Gf90I{iZYt(lgOX0PB&3}*8Y}Yxq7g7H<9tgS~#Z*~anQ<^@K{jvNg;g(t zMcs;H^X-~e*{Nh3T+=-k;QcC=tBUz%WlhzTxsLon@>6v=YHwCOi`@20pk{qtVFrH+ z_k^{M(vNen&}c9UnEcYn5d*5%^GN8e47EK4vxEOqYkx6OaM59a(ofB5&jhhN{GnD_AQ*V^+R y3jUru99kB;|FgmU{Sxn+-h2=8U$}g8^-BB8@zFD^&o!2Sa+;^BpUXO@geCy@)~mq) diff --git a/submodules/TelegramUI/Images.xcassets/Item List/DisclosureArrow.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Item List/DisclosureArrow.imageset/Contents.json new file mode 100644 index 0000000000..73d58c942a --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Item List/DisclosureArrow.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_open.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Item List/DisclosureArrow.imageset/ic_open.pdf b/submodules/TelegramUI/Images.xcassets/Item List/DisclosureArrow.imageset/ic_open.pdf new file mode 100644 index 0000000000000000000000000000000000000000..058efa69b64243ee50dd31f06698fddc3d94c7dd GIT binary patch literal 3972 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 100.0 { + print() + } + self.chatDisplayNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition, listViewTransaction: { updateSizeAndInsets, additionalScrollDistance, scrollToTop in self.chatDisplayNode.historyNode.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: additionalScrollDistance, scrollToTop: scrollToTop) }) @@ -4554,11 +4558,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.chatDisplayNode.updateChatPresentationInterfaceState(updatedChatPresentationInterfaceState, transition: transition, interactive: interactive) } - if let selectionState = self.presentationInterfaceState.interfaceState.selectionState, !selectionState.selectedIds.isEmpty { - self.chatTitleView?.titleContent = .custom(self.presentationData.strings.Conversation_SelectedMessages(Int32(selectionState.selectedIds.count))) - } else { - - } +// if let selectionState = self.presentationInterfaceState.interfaceState.selectionState, !selectionState.selectedIds.isEmpty { +// self.chatTitleView?.titleContent = .custom(self.presentationData.strings.Conversation_SelectedMessages(Int32(selectionState.selectedIds.count))) +// } else { +// +// } if let button = leftNavigationButtonForChatInterfaceState(updatedChatPresentationInterfaceState, strings: updatedChatPresentationInterfaceState.strings, currentButton: self.leftNavigationButton, target: self, selector: #selector(self.leftNavigationButtonAction)) { if self.leftNavigationButton != button { @@ -4892,14 +4896,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return result } let controller = legacyAttachmentMenu(context: strongSelf.context, peer: peer, editMediaOptions: menuEditMediaOptions, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, parentController: legacyController, recentlyUsedInlineBots: strongSelf.recentlyUsedInlineBotsValue, initialCaption: inputText.string, openGallery: { - self?.presentMediaPicker(fileMode: false, editingMedia: editMediaOptions != nil, completion: { signals, silentPosting in + self?.presentMediaPicker(fileMode: false, editingMedia: editMediaOptions != nil, completion: { signals, silentPosting, scheduleTime in if !inputText.string.isEmpty { //strongSelf.clearInputText() } if editMediaOptions != nil { self?.editMessageMediaWithLegacySignals(signals) } else { - self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) + self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil) } }) }, openCamera: { [weak self] cameraView, menuController in @@ -4919,6 +4923,26 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self, let (host, port, username, password, secret) = parseProxyUrl(code) { strongSelf.openResolved(ResolvedUrl.proxy(host: host, port: port, username: username, password: password, secret: secret)) } + }, presentScheduleController: { [weak self] done in + guard let strongSelf = self else { + return + } + let mode: ChatScheduleTimeControllerMode + if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + mode = .reminders + } else { + mode = .scheduledMessages + } + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, completion: { [weak self] time in + if let strongSelf = self { + done(time) + if !strongSelf.presentationInterfaceState.isScheduledMessages { + let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) + (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + } + } + }) + strongSelf.present(controller, in: .window(.root)) }) } }, openFileGallery: { @@ -4941,16 +4965,34 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentMultipleFilesDisabled, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - }, sendMessagesWithSignals: { [weak self] signals, mode in + }, presentScheduleController: { [weak self] done in + guard let strongSelf = self else { + return + } + let mode: ChatScheduleTimeControllerMode + if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + mode = .reminders + } else { + mode = .scheduledMessages + } + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, completion: { [weak self] time in + if let strongSelf = self { + done(time) + if !strongSelf.presentationInterfaceState.isScheduledMessages { + let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) + (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + } + } + }) + strongSelf.present(controller, in: .window(.root)) + }, sendMessagesWithSignals: { [weak self] signals, silentPosting, scheduleTime in if !inputText.string.isEmpty { //strongSelf.clearInputText() } if editMediaOptions != nil { self?.editMessageMediaWithLegacySignals(signals!) } else { - var silentPosting = false - //if mode == - self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) + self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil) } }, selectRecentlyUsedInlineBot: { [weak self] peer in if let strongSelf = self, let addressName = peer.addressName { @@ -4986,11 +5028,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G ActionSheetButtonItem(title: self.presentationData.strings.Conversation_FilePhotoOrVideo, action: { [weak self, weak actionSheet] in actionSheet?.dismissAnimated() if let strongSelf = self { - strongSelf.presentMediaPicker(fileMode: true, editingMedia: editingMessage, completion: { signals, silentPosting in + strongSelf.presentMediaPicker(fileMode: true, editingMedia: editingMessage, completion: { signals, silentPosting, scheduleTime in if editingMessage { self?.editMessageMediaWithLegacySignals(signals) } else { - self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting) + self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil) } }) } @@ -5054,7 +5096,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.present(actionSheet, in: .window(.root)) } - private func presentMediaPicker(fileMode: Bool, editingMedia: Bool, completion: @escaping ([Any], Bool) -> Void) { + private func presentMediaPicker(fileMode: Bool, editingMedia: Bool, completion: @escaping ([Any], Bool, Int32) -> Void) { let postbox = self.context.account.postbox let _ = (self.context.sharedContext.accountManager.transaction { transaction -> Signal<(GeneratedMediaStoreSettings, SearchBotsConfiguration), NoError> in let entry = transaction.getSharedData(ApplicationSpecificSharedDataKeys.generatedMediaStoreSettings) as? GeneratedMediaStoreSettings @@ -5108,13 +5150,32 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentLimitReached, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }, presentScheduleController: { [weak self] done in + guard let strongSelf = self else { + return + } + let mode: ChatScheduleTimeControllerMode + if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + mode = .reminders + } else { + mode = .scheduledMessages + } + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, completion: { [weak self] time in + if let strongSelf = self { + done(time) + if !strongSelf.presentationInterfaceState.isScheduledMessages { + let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) + (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + } + } + }) + strongSelf.present(controller, in: .window(.root)) }) controller.descriptionGenerator = legacyAssetPickerItemGenerator() - controller.completionBlock = { [weak legacyController] signals, mode in + controller.completionBlock = { [weak legacyController] signals, silentPosting, scheduleTime in if let legacyController = legacyController { legacyController.dismiss() - var silentPosting = false - completion(signals!, silentPosting) + completion(signals!, silentPosting, scheduleTime) } } controller.dismissalBlock = { [weak legacyController] in @@ -5381,7 +5442,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } else { mode = .scheduledMessages } - let controller = ChatScheduleTimeController(context: self.context, mode: mode, completion: { [weak self] time in + let controller = ChatScheduleTimeController(context: self.context, mode: mode, dismissByTapOutside: false, completion: { [weak self] time in if let strongSelf = self { strongSelf.sendMessages(strongSelf.transformEnqueueMessages(messages, silentPosting: false, scheduleTime: time), commit: true) } diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift index 35adb0d555..259e46dd23 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift @@ -20,7 +20,7 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView, } } } - + var groupBucket: [(Message, Bool, ChatHistoryMessageSelection, ChatMessageEntryAttributes)] = [] loop: for entry in view.entries { for media in entry.message.media { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index ec7696a61a..a9dc1f3898 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -400,7 +400,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil) self.reactionRecognizer = reactionRecognizer reactionRecognizer.availableReactions = { [weak self] in - guard let strongSelf = self, let item = strongSelf.item, !Namespaces.Message.allScheduled.contains(item.message.id.namespace) else { + guard let strongSelf = self, let item = strongSelf.item, !item.presentationData.isPreview && !Namespaces.Message.allScheduled.contains(item.message.id.namespace) else { return [] } if strongSelf.selectionNode != nil { diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 0e377b5f14..3cdbbaf05d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -817,6 +817,8 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }) case .wallpaper: break + case .theme: + break } } })) diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift index 06bff51447..852511b40d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift @@ -22,14 +22,16 @@ final class ChatScheduleTimeController: ViewController { private let context: AccountContext private let mode: ChatScheduleTimeControllerMode private let currentTime: Int32? + private let dismissByTapOutside: Bool private let completion: (Int32) -> Void private var presentationDataDisposable: Disposable? - init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32? = nil, completion: @escaping (Int32) -> Void) { + init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32? = nil, dismissByTapOutside: Bool = true, completion: @escaping (Int32) -> Void) { self.context = context self.mode = mode self.currentTime = currentTime + self.dismissByTapOutside = dismissByTapOutside self.completion = completion super.init(navigationBarPresentationData: nil) @@ -53,7 +55,7 @@ final class ChatScheduleTimeController: ViewController { } override public func loadDisplayNode() { - self.displayNode = ChatScheduleTimeControllerNode(context: self.context, mode: self.mode, currentTime: self.currentTime) + self.displayNode = ChatScheduleTimeControllerNode(context: self.context, mode: self.mode, currentTime: self.currentTime, dismissByTapOutside: self.dismissByTapOutside) self.controllerNode.completion = { [weak self] time in self?.completion(time + 5) self?.dismiss() diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift index 2f1edf11ca..ee96d48d71 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift @@ -14,6 +14,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel private let context: AccountContext private let mode: ChatScheduleTimeControllerMode private var presentationData: PresentationData + private let dismissByTapOutside: Bool private let dimNode: ASDisplayNode private let wrappingScrollNode: ASScrollNode @@ -32,10 +33,11 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel var dismiss: (() -> Void)? var cancel: (() -> Void)? - init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32?) { + init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32?, dismissByTapOutside: Bool) { self.context = context self.mode = mode self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.dismissByTapOutside = dismissByTapOutside self.wrappingScrollNode = ASScrollNode() self.wrappingScrollNode.view.alwaysBounceVertical = true @@ -208,7 +210,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel } @objc func dimTapGesture(_ recognizer: UITapGestureRecognizer) { - if case .ended = recognizer.state { + if self.dismissByTapOutside, case .ended = recognizer.state { self.cancelButtonPressed() } } diff --git a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift index 0dc3f57023..9becf57ef4 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift @@ -10,7 +10,7 @@ import ShareController import LegacyUI import LegacyMediaPickerUI -func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, sendMessagesWithSignals: @escaping ([Any]?) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }) { +func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, sendMessagesWithSignals: @escaping ([Any]?) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentScheduleController: @escaping (@escaping (Int32) -> Void) -> Void) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme) legacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .portrait, compactSize: .portrait) diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index 83f94dad37..0a16d86dd7 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -138,7 +138,9 @@ private func chatMessageGalleryControllerData(context: AccountContext, message: if let file = galleryMedia as? TelegramMediaFile { if let fileName = file.fileName { let ext = (fileName as NSString).pathExtension.lowercased() - if ext == "wav" || ext == "opus" { + if ext == "tgios-theme" { + return .theme(file) + } else if ext == "wav" || ext == "opus" { return .audio(file) } else if ext == "json", let fileSize = file.size, fileSize < 1024 * 1024 { if let path = context.account.postbox.mediaBox.completedResourcePath(file.resource), let _ = LOTComposition(filePath: path) { @@ -365,7 +367,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool { return nil })) case let .theme(media): - let controller = ThemePreviewController(context: params.context, previewTheme: makeDefaultDayPresentationTheme(accentColor: nil, serviceBackgroundColor: .black, baseColor: nil, day: true, preview: false), media: .message(message: MessageReference(params.message), media: media)) + let controller = ThemePreviewController(context: params.context, previewTheme: makeDefaultDayPresentationTheme(accentColor: nil, serviceBackgroundColor: .black, baseColor: nil, day: true, preview: false), source: .media(.message(message: MessageReference(params.message), media: media))) params.present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) } } diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index c5e09200be..30bc71d58a 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramUIPreferences +import TelegramPresentationData import AccountContext import OverlayStatusController import AlertUI @@ -236,5 +237,22 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur controller?.dismiss() }) dismissInput() + case let .theme(slug): + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let signal = getTheme(account: context.account, slug: slug) + let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + present(controller, nil) + + let _ = (signal + |> deliverOnMainQueue).start(next: { [weak controller] theme in + controller?.dismiss() + let previewTheme = makePresentationTheme(themeReference: .cloud(theme), accentColor: nil, serviceBackgroundColor: .black, baseColor: nil) + let previewController = ThemePreviewController(context: context, previewTheme: previewTheme, source: .theme(theme)) + present(previewController, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + }, error: { [weak controller] error in + controller?.dismiss() + }) + dismissInput() } } diff --git a/submodules/TelegramUI/TelegramUI/OpenUrl.swift b/submodules/TelegramUI/TelegramUI/OpenUrl.swift index 0aba6f1aa2..cee562f1d5 100644 --- a/submodules/TelegramUI/TelegramUI/OpenUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenUrl.swift @@ -538,6 +538,22 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur convertedUrl = "https://t.me/bg/\(parameter)\(mode)" } } + } else if parsedUrl.host == "addtheme" { + if let components = URLComponents(string: "/?" + query) { + var parameter: String? + if let queryItems = components.queryItems { + for queryItem in queryItems { + if let value = queryItem.value { + if queryItem.name == "slug" { + parameter = value + } + } + } + } + if let parameter = parameter { + convertedUrl = "https://t.me/addtheme/\(parameter)" + } + } } if parsedUrl.host == "resolve" { diff --git a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index 482392b2dc..764864694d 100644 --- a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -28,11 +28,17 @@ public struct WallpaperPresentationOptions: OptionSet { public enum PresentationThemeReference: PostboxCoding, Equatable { case builtin(PresentationBuiltinThemeReference) + case local(LocalFileMediaResource) + case cloud(TelegramTheme) public init(decoder: PostboxDecoder) { switch decoder.decodeInt32ForKey("v", orElse: 0) { case 0: self = .builtin(PresentationBuiltinThemeReference(rawValue: decoder.decodeInt32ForKey("t", orElse: 0))!) + case 1: + self = .local(decoder.decodeObjectForKey("resource", decoder: { LocalFileMediaResource(decoder: $0) }) as! LocalFileMediaResource) + case 2: + self = .cloud(decoder.decodeObjectForKey("theme", decoder: { TelegramTheme(decoder: $0) }) as! TelegramTheme) default: assertionFailure() self = .builtin(.dayClassic) @@ -44,6 +50,12 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { case let .builtin(reference): encoder.encodeInt32(0, forKey: "v") encoder.encodeInt32(reference.rawValue, forKey: "t") + case let .local(resource): + encoder.encodeInt32(1, forKey: "v") + encoder.encodeObject(resource, forKey: "resource") + case let .cloud(theme): + encoder.encodeInt32(2, forKey: "v") + encoder.encodeObject(theme, forKey: "theme") } } @@ -55,6 +67,18 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { } else { return false } + case let .local(lhsResource): + if case let .local(rhsResource) = rhs, lhsResource.isEqual(to: rhsResource) { + return true + } else { + return false + } + case let .cloud(lhsTheme): + if case let .cloud(rhsTheme) = rhs, lhsTheme == rhsTheme { + return true + } else { + return false + } } } @@ -65,6 +89,12 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { case let .builtin(reference): namespace = 0 id = reference.rawValue + case let .local(resource): + namespace = 1 + id = 1//1reference.rawValue + case let .cloud(theme): + namespace = 2 + id = Int32(clamping: theme.id) } return (Int64(namespace) << 32) | Int64(bitPattern: UInt64(UInt32(bitPattern: id))) @@ -302,6 +332,14 @@ public struct PresentationThemeSettings: PreferencesEntry { for (_, chatWallpaper) in self.themeSpecificChatWallpapers { resources.append(contentsOf: wallpaperResources(chatWallpaper)) } + switch self.theme { + case .builtin: + break + case let .local(resource): + resources.append(resource.id) + case let .cloud(theme): + resources.append(theme.file.resource.id) + } return resources } diff --git a/submodules/UrlHandling/Sources/UrlHandling.swift b/submodules/UrlHandling/Sources/UrlHandling.swift index 439601002e..e73c413b63 100644 --- a/submodules/UrlHandling/Sources/UrlHandling.swift +++ b/submodules/UrlHandling/Sources/UrlHandling.swift @@ -31,6 +31,7 @@ public enum ParsedInternalUrl { case cancelAccountReset(phone: String, hash: String) case share(url: String?, text: String?, to: String?) case wallpaper(WallpaperUrlParameter) + case theme(String) } private enum ParsedUrl { @@ -202,6 +203,8 @@ public func parseInternalUrl(query: String) -> ParsedInternalUrl? { parameter = .slug(component, options, color, intensity) } return .wallpaper(parameter) + } else if pathComponents[0] == "addtheme" { + return .theme(pathComponents[1]) } else if pathComponents.count == 3 && pathComponents[0] == "c" { if let channelId = Int32(pathComponents[1]), let messageId = Int32(pathComponents[2]) { return .privateMessage(MessageId(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId), namespace: Namespaces.Message.Cloud, id: messageId)) @@ -305,6 +308,8 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig return .single(.share(url: url, text: text, to: to)) case let .wallpaper(parameter): return .single(.wallpaper(parameter)) + case let .theme(slug): + return .single(.theme(slug)) } } From f48ff32091c27e29a6b06fa46a33236cad7caf93 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sun, 25 Aug 2019 17:32:21 +0400 Subject: [PATCH 30/86] Update API --- .../Sources/PlatformRestrictionMatching.swift | 9 +- submodules/TelegramApi/Sources/Api0.swift | 20 +- submodules/TelegramApi/Sources/Api1.swift | 272 +++++++++++++++--- submodules/TelegramApi/Sources/Api3.swift | 123 ++++---- .../TelegramCore/ApiGroupOrChannel.swift | 2 +- .../PeerAccessRestrictionInfo.swift | 68 ++++- .../TelegramCore/TelegramCore/PeerUtils.swift | 18 +- .../RestrictedContentMessageAttribute.swift | 18 +- .../TelegramCore/StoreMessage_Telegram.swift | 10 +- .../TelegramCore/TelegramMediaWebpage.swift | 2 +- .../TelegramCore/TelegramUser.swift | 2 +- .../Sources/MessageContentKind.swift | 4 +- .../TelegramUI/ChatControllerNode.swift | 2 +- .../ChatMessageBubbleItemNode.swift | 2 +- ...atMessageRestrictedBubbleContentNode.swift | 2 +- 15 files changed, 425 insertions(+), 129 deletions(-) diff --git a/submodules/PlatformRestrictionMatching/Sources/PlatformRestrictionMatching.swift b/submodules/PlatformRestrictionMatching/Sources/PlatformRestrictionMatching.swift index c6d500c400..ddd98ece53 100644 --- a/submodules/PlatformRestrictionMatching/Sources/PlatformRestrictionMatching.swift +++ b/submodules/PlatformRestrictionMatching/Sources/PlatformRestrictionMatching.swift @@ -2,7 +2,12 @@ import Foundation import TelegramCore public extension RestrictedContentMessageAttribute { - func matchesPlatform() -> Bool { - return self.platformSelector == "ios" + func platformText(platform: String) -> String? { + for rule in self.rules { + if rule.platform == "all" || rule.platform == "ios" { + return rule.text + } + } + return nil } } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index d8ef0a30d7..421c95d871 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -5,6 +5,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[570911930] = { return $0.readInt64() } dict[571523412] = { return $0.readDouble() } dict[-1255641564] = { return parseString($0) } + dict[-475111160] = { return Api.MessageReactionsList.parse_messageReactionsList($0) } dict[-1240849242] = { return Api.messages.StickerSet.parse_stickerSet($0) } dict[-457104426] = { return Api.InputGeoPoint.parse_inputGeoPointEmpty($0) } dict[-206066487] = { return Api.InputGeoPoint.parse_inputGeoPoint($0) } @@ -64,7 +65,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[120753115] = { return Api.Chat.parse_chatForbidden($0) } dict[681420594] = { return Api.Chat.parse_channelForbidden($0) } dict[1004149726] = { return Api.Chat.parse_chat($0) } - dict[1307772980] = { return Api.Chat.parse_channel($0) } + dict[-753232354] = { return Api.Chat.parse_channel($0) } dict[1202287072] = { return Api.StatsURL.parse_statsURL($0) } dict[1516793212] = { return Api.ChatInvite.parse_chatInviteAlready($0) } dict[-540871282] = { return Api.ChatInvite.parse_chatInvite($0) } @@ -76,6 +77,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1608834311] = { return Api.RecentMeUrl.parse_recentMeUrlChat($0) } dict[-347535331] = { return Api.RecentMeUrl.parse_recentMeUrlChatInvite($0) } dict[-1140172836] = { return Api.RecentMeUrl.parse_recentMeUrlStickerSet($0) } + dict[-797791052] = { return Api.RestrictionReason.parse_restrictionReason($0) } dict[-177282392] = { return Api.channels.ChannelParticipants.parse_channelParticipants($0) } dict[-266911767] = { return Api.channels.ChannelParticipants.parse_channelParticipantsNotModified($0) } dict[-599948721] = { return Api.RichText.parse_textEmpty($0) } @@ -298,8 +300,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[1594340540] = { return Api.WebPage.parse_webPage($0) } dict[-2054908813] = { return Api.WebPage.parse_webPageNotModified($0) } + dict[-94051982] = { return Api.WebPage.parse_webPage($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) } @@ -425,6 +427,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-2128640689] = { return Api.account.SentEmailCode.parse_sentEmailCode($0) } dict[-1038136962] = { return Api.EncryptedFile.parse_encryptedFileEmpty($0) } dict[1248893260] = { return Api.EncryptedFile.parse_encryptedFile($0) } + dict[-557924733] = { return Api.CodeSettings.parse_codeSettings($0) } dict[-391902247] = { return Api.SecureValueError.parse_secureValueErrorData($0) } dict[12467706] = { return Api.SecureValueError.parse_secureValueErrorFrontSide($0) } dict[-2037765467] = { return Api.SecureValueError.parse_secureValueErrorReverseSide($0) } @@ -553,10 +556,10 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[372165663] = { return Api.FoundGif.parse_foundGif($0) } dict[-1670052855] = { return Api.FoundGif.parse_foundGifCached($0) } dict[537022650] = { return Api.User.parse_userEmpty($0) } - dict[773059779] = { return Api.User.parse_user($0) } + dict[-1820043071] = { return Api.User.parse_user($0) } dict[-2082087340] = { return Api.Message.parse_messageEmpty($0) } dict[-1642487306] = { return Api.Message.parse_messageService($0) } - dict[479924263] = { return Api.Message.parse_message($0) } + dict[-1752573244] = { return Api.Message.parse_message($0) } dict[186120336] = { return Api.messages.RecentStickers.parse_recentStickersNotModified($0) } dict[586395571] = { return Api.messages.RecentStickers.parse_recentStickers($0) } dict[-182231723] = { return Api.InputFileLocation.parse_inputEncryptedFileLocation($0) } @@ -637,6 +640,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-290921362] = { return Api.upload.CdnFile.parse_cdnFileReuploadNeeded($0) } dict[-1449145777] = { return Api.upload.CdnFile.parse_cdnFile($0) } dict[415997816] = { return Api.help.InviteText.parse_inviteText($0) } + dict[-764945220] = { return Api.MessageUserReaction.parse_messageUserReaction($0) } dict[-1937807902] = { return Api.BotInlineMessage.parse_botInlineMessageText($0) } dict[982505656] = { return Api.BotInlineMessage.parse_botInlineMessageMediaGeo($0) } dict[1984755728] = { return Api.BotInlineMessage.parse_botInlineMessageMediaAuto($0) } @@ -836,6 +840,8 @@ public struct Api { public static func serializeObject(_ object: Any, buffer: Buffer, boxed: Swift.Bool) { switch object { + case let _1 as Api.MessageReactionsList: + _1.serialize(buffer, boxed) case let _1 as Api.messages.StickerSet: _1.serialize(buffer, boxed) case let _1 as Api.InputGeoPoint: @@ -874,6 +880,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.RecentMeUrl: _1.serialize(buffer, boxed) + case let _1 as Api.RestrictionReason: + _1.serialize(buffer, boxed) case let _1 as Api.channels.ChannelParticipants: _1.serialize(buffer, boxed) case let _1 as Api.RichText: @@ -1078,6 +1086,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.EncryptedFile: _1.serialize(buffer, boxed) + case let _1 as Api.CodeSettings: + _1.serialize(buffer, boxed) case let _1 as Api.SecureValueError: _1.serialize(buffer, boxed) case let _1 as Api.NotifyPeer: @@ -1266,6 +1276,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.help.InviteText: _1.serialize(buffer, boxed) + case let _1 as Api.MessageUserReaction: + _1.serialize(buffer, boxed) case let _1 as Api.BotInlineMessage: _1.serialize(buffer, boxed) case let _1 as Api.InputPeerNotifySettings: diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 7575cc1f7c..b935356ca5 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -1,4 +1,66 @@ public extension Api { + public enum MessageReactionsList: TypeConstructorDescription { + case messageReactionsList(flags: Int32, count: Int32, reactions: [Api.MessageUserReaction], users: [Api.User], nextOffset: String?) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .messageReactionsList(let flags, let count, let reactions, let users, let nextOffset): + if boxed { + buffer.appendInt32(-475111160) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeInt32(count, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(reactions.count)) + for item in reactions { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(users.count)) + for item in users { + item.serialize(buffer, true) + } + if Int(flags) & Int(1 << 0) != 0 {serializeString(nextOffset!, buffer: buffer, boxed: false)} + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .messageReactionsList(let flags, let count, let reactions, let users, let nextOffset): + return ("messageReactionsList", [("flags", flags), ("count", count), ("reactions", reactions), ("users", users), ("nextOffset", nextOffset)]) + } + } + + public static func parse_messageReactionsList(_ reader: BufferReader) -> MessageReactionsList? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + var _3: [Api.MessageUserReaction]? + if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageUserReaction.self) + } + var _4: [Api.User]? + if let _ = reader.readInt32() { + _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) + } + var _5: String? + if Int(_1!) & Int(1 << 0) != 0 {_5 = parseString(reader) } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 { + return Api.MessageReactionsList.messageReactionsList(flags: _1!, count: _2!, reactions: _3!, users: _4!, nextOffset: _5) + } + else { + return nil + } + } + + } public enum InputGeoPoint: TypeConstructorDescription { case inputGeoPointEmpty case inputGeoPoint(lat: Double, long: Double) @@ -1558,7 +1620,7 @@ public extension Api { case chatForbidden(id: Int32, title: String) case channelForbidden(flags: Int32, id: Int32, accessHash: Int64, title: String, untilDate: Int32?) case chat(flags: Int32, id: Int32, title: String, photo: Api.ChatPhoto, participantsCount: Int32, date: Int32, version: Int32, migratedTo: Api.InputChannel?, adminRights: Api.ChatAdminRights?, defaultBannedRights: Api.ChatBannedRights?) - case channel(flags: Int32, id: Int32, accessHash: Int64?, title: String, username: String?, photo: Api.ChatPhoto, date: Int32, version: Int32, restrictionReason: String?, adminRights: Api.ChatAdminRights?, bannedRights: Api.ChatBannedRights?, defaultBannedRights: Api.ChatBannedRights?, participantsCount: Int32?) + case channel(flags: Int32, id: Int32, accessHash: Int64?, title: String, username: String?, photo: Api.ChatPhoto, date: Int32, version: Int32, restrictionReason: [Api.RestrictionReason]?, adminRights: Api.ChatAdminRights?, bannedRights: Api.ChatBannedRights?, defaultBannedRights: Api.ChatBannedRights?, participantsCount: Int32?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -1602,7 +1664,7 @@ public extension Api { break case .channel(let flags, let id, let accessHash, let title, let username, let photo, let date, let version, let restrictionReason, let adminRights, let bannedRights, let defaultBannedRights, let participantsCount): if boxed { - buffer.appendInt32(1307772980) + buffer.appendInt32(-753232354) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -1612,7 +1674,11 @@ public extension Api { photo.serialize(buffer, true) serializeInt32(date, buffer: buffer, boxed: false) serializeInt32(version, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 9) != 0 {serializeString(restrictionReason!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 9) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(restrictionReason!.count)) + for item in restrictionReason! { + item.serialize(buffer, true) + }} if Int(flags) & Int(1 << 14) != 0 {adminRights!.serialize(buffer, true)} if Int(flags) & Int(1 << 15) != 0 {bannedRights!.serialize(buffer, true)} if Int(flags) & Int(1 << 18) != 0 {defaultBannedRights!.serialize(buffer, true)} @@ -1749,8 +1815,10 @@ public extension Api { _7 = reader.readInt32() var _8: Int32? _8 = reader.readInt32() - var _9: String? - if Int(_1!) & Int(1 << 9) != 0 {_9 = parseString(reader) } + var _9: [Api.RestrictionReason]? + if Int(_1!) & Int(1 << 9) != 0 {if let _ = reader.readInt32() { + _9 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self) + } } var _10: Api.ChatAdminRights? if Int(_1!) & Int(1 << 14) != 0 {if let signature = reader.readInt32() { _10 = Api.parse(reader, signature: signature) as? Api.ChatAdminRights @@ -2154,6 +2222,48 @@ public extension Api { } } + } + public enum RestrictionReason: TypeConstructorDescription { + case restrictionReason(platform: String, reason: String, text: String) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .restrictionReason(let platform, let reason, let text): + if boxed { + buffer.appendInt32(-797791052) + } + serializeString(platform, buffer: buffer, boxed: false) + serializeString(reason, buffer: buffer, boxed: false) + serializeString(text, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .restrictionReason(let platform, let reason, let text): + return ("restrictionReason", [("platform", platform), ("reason", reason), ("text", text)]) + } + } + + public static func parse_restrictionReason(_ reader: BufferReader) -> RestrictionReason? { + var _1: String? + _1 = parseString(reader) + var _2: String? + _2 = parseString(reader) + var _3: String? + _3 = parseString(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.RestrictionReason.restrictionReason(platform: _1!, reason: _2!, text: _3!) + } + else { + return nil + } + } + } indirect public enum RichText: TypeConstructorDescription { case textEmpty @@ -7468,8 +7578,8 @@ public extension Api { public enum WebPage: TypeConstructorDescription { case webPageEmpty(id: Int64) case webPagePending(id: Int64, date: Int32) - 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?) 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?, documents: [Api.Document]?, cachedPage: Api.Page?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -7486,9 +7596,15 @@ public extension Api { serializeInt64(id, buffer: buffer, boxed: false) serializeInt32(date, buffer: buffer, boxed: false) 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): + case .webPageNotModified: if boxed { - buffer.appendInt32(1594340540) + 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 documents, let cachedPage): + if boxed { + buffer.appendInt32(-94051982) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt64(id, buffer: buffer, boxed: false) @@ -7507,13 +7623,12 @@ public extension Api { if Int(flags) & Int(1 << 7) != 0 {serializeInt32(duration!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 8) != 0 {serializeString(author!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 9) != 0 {document!.serialize(buffer, true)} + if Int(flags) & Int(1 << 11) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(documents!.count)) + for item in documents! { + item.serialize(buffer, true) + }} if Int(flags) & Int(1 << 10) != 0 {cachedPage!.serialize(buffer, true)} - break - case .webPageNotModified: - if boxed { - buffer.appendInt32(-2054908813) - } - break } } @@ -7524,10 +7639,10 @@ public extension Api { return ("webPageEmpty", [("id", id)]) case .webPagePending(let id, let date): return ("webPagePending", [("id", id), ("date", date)]) - 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): - 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)]) 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 documents, let cachedPage): + 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), ("documents", documents), ("cachedPage", cachedPage)]) } } @@ -7556,6 +7671,9 @@ 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() @@ -7595,9 +7713,13 @@ public extension Api { if Int(_1!) & Int(1 << 9) != 0 {if let signature = reader.readInt32() { _17 = Api.parse(reader, signature: signature) as? Api.Document } } - var _18: Api.Page? + var _18: [Api.Document]? + if Int(_1!) & Int(1 << 11) != 0 {if let _ = reader.readInt32() { + _18 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Document.self) + } } + var _19: Api.Page? if Int(_1!) & Int(1 << 10) != 0 {if let signature = reader.readInt32() { - _18 = Api.parse(reader, signature: signature) as? Api.Page + _19 = Api.parse(reader, signature: signature) as? Api.Page } } let _c1 = _1 != nil let _c2 = _2 != nil @@ -7616,17 +7738,15 @@ public extension Api { let _c15 = (Int(_1!) & Int(1 << 7) == 0) || _15 != nil let _c16 = (Int(_1!) & Int(1 << 8) == 0) || _16 != nil let _c17 = (Int(_1!) & Int(1 << 9) == 0) || _17 != nil - let _c18 = (Int(_1!) & Int(1 << 10) == 0) || _18 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 { - return Api.WebPage.webPage(flags: _1!, id: _2!, url: _3!, displayUrl: _4!, hash: _5!, type: _6, siteName: _7, title: _8, description: _9, photo: _10, embedUrl: _11, embedType: _12, embedWidth: _13, embedHeight: _14, duration: _15, author: _16, document: _17, cachedPage: _18) + let _c18 = (Int(_1!) & Int(1 << 11) == 0) || _18 != nil + let _c19 = (Int(_1!) & Int(1 << 10) == 0) || _19 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 && _c19 { + return Api.WebPage.webPage(flags: _1!, id: _2!, url: _3!, displayUrl: _4!, hash: _5!, type: _6, siteName: _7, title: _8, description: _9, photo: _10, embedUrl: _11, embedType: _12, embedWidth: _13, embedHeight: _14, duration: _15, author: _16, document: _17, documents: _18, cachedPage: _19) } else { return nil } } - public static func parse_webPageNotModified(_ reader: BufferReader) -> WebPage? { - return Api.WebPage.webPageNotModified - } } public enum InputBotInlineMessage: TypeConstructorDescription { @@ -10510,6 +10630,40 @@ public extension Api { } } + } + public enum CodeSettings: TypeConstructorDescription { + case codeSettings(flags: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .codeSettings(let flags): + if boxed { + buffer.appendInt32(-557924733) + } + serializeInt32(flags, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .codeSettings(let flags): + return ("codeSettings", [("flags", flags)]) + } + } + + public static func parse_codeSettings(_ reader: BufferReader) -> CodeSettings? { + var _1: Int32? + _1 = reader.readInt32() + let _c1 = _1 != nil + if _c1 { + return Api.CodeSettings.codeSettings(flags: _1!) + } + else { + return nil + } + } + } public enum SecureValueError: TypeConstructorDescription { case secureValueErrorData(type: Api.SecureValueType, dataHash: Buffer, field: String, text: String) @@ -14031,7 +14185,7 @@ public extension Api { } public enum User: TypeConstructorDescription { case userEmpty(id: Int32) - case user(flags: Int32, id: Int32, accessHash: Int64?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: Api.UserProfilePhoto?, status: Api.UserStatus?, botInfoVersion: Int32?, restrictionReason: String?, botInlinePlaceholder: String?, langCode: String?) + case user(flags: Int32, id: Int32, accessHash: Int64?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: Api.UserProfilePhoto?, status: Api.UserStatus?, botInfoVersion: Int32?, restrictionReason: [Api.RestrictionReason]?, botInlinePlaceholder: String?, langCode: String?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -14043,7 +14197,7 @@ public extension Api { break case .user(let flags, let id, let accessHash, let firstName, let lastName, let username, let phone, let photo, let status, let botInfoVersion, let restrictionReason, let botInlinePlaceholder, let langCode): if boxed { - buffer.appendInt32(773059779) + buffer.appendInt32(-1820043071) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -14055,7 +14209,11 @@ public extension Api { if Int(flags) & Int(1 << 5) != 0 {photo!.serialize(buffer, true)} if Int(flags) & Int(1 << 6) != 0 {status!.serialize(buffer, true)} if Int(flags) & Int(1 << 14) != 0 {serializeInt32(botInfoVersion!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 18) != 0 {serializeString(restrictionReason!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 18) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(restrictionReason!.count)) + for item in restrictionReason! { + item.serialize(buffer, true) + }} if Int(flags) & Int(1 << 19) != 0 {serializeString(botInlinePlaceholder!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 22) != 0 {serializeString(langCode!, buffer: buffer, boxed: false)} break @@ -14107,8 +14265,10 @@ public extension Api { } } var _10: Int32? if Int(_1!) & Int(1 << 14) != 0 {_10 = reader.readInt32() } - var _11: String? - if Int(_1!) & Int(1 << 18) != 0 {_11 = parseString(reader) } + var _11: [Api.RestrictionReason]? + if Int(_1!) & Int(1 << 18) != 0 {if let _ = reader.readInt32() { + _11 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self) + } } var _12: String? if Int(_1!) & Int(1 << 19) != 0 {_12 = parseString(reader) } var _13: String? @@ -14138,7 +14298,7 @@ public extension Api { public enum Message: TypeConstructorDescription { case messageEmpty(id: Int32) case messageService(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, replyToMsgId: Int32?, date: Int32, action: Api.MessageAction) - case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, reactions: Api.MessageReactions?, restrictionReason: String?) + case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, reactions: Api.MessageReactions?, restrictionReason: [Api.RestrictionReason]?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -14162,7 +14322,7 @@ public extension Api { break case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let reactions, let restrictionReason): if boxed { - buffer.appendInt32(479924263) + buffer.appendInt32(-1752573244) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -14185,7 +14345,11 @@ public extension Api { if Int(flags) & Int(1 << 16) != 0 {serializeString(postAuthor!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 17) != 0 {serializeInt64(groupedId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 20) != 0 {reactions!.serialize(buffer, true)} - if Int(flags) & Int(1 << 22) != 0 {serializeString(restrictionReason!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 22) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(restrictionReason!.count)) + for item in restrictionReason! { + item.serialize(buffer, true) + }} break } } @@ -14292,8 +14456,10 @@ public extension Api { if Int(_1!) & Int(1 << 20) != 0 {if let signature = reader.readInt32() { _17 = Api.parse(reader, signature: signature) as? Api.MessageReactions } } - var _18: String? - if Int(_1!) & Int(1 << 22) != 0 {_18 = parseString(reader) } + var _18: [Api.RestrictionReason]? + if Int(_1!) & Int(1 << 22) != 0 {if let _ = reader.readInt32() { + _18 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self) + } } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = (Int(_1!) & Int(1 << 8) == 0) || _3 != nil @@ -16160,6 +16326,44 @@ public extension Api { } } + } + public enum MessageUserReaction: TypeConstructorDescription { + case messageUserReaction(userId: Int32, reaction: String) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .messageUserReaction(let userId, let reaction): + if boxed { + buffer.appendInt32(-764945220) + } + serializeInt32(userId, buffer: buffer, boxed: false) + serializeString(reaction, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .messageUserReaction(let userId, let reaction): + return ("messageUserReaction", [("userId", userId), ("reaction", reaction)]) + } + } + + public static func parse_messageUserReaction(_ reader: BufferReader) -> MessageUserReaction? { + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + _2 = parseString(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.MessageUserReaction.messageUserReaction(userId: _1!, reaction: _2!) + } + else { + return nil + } + } + } public enum BotInlineMessage: TypeConstructorDescription { case botInlineMessageText(flags: Int32, message: String, entities: [Api.MessageEntity]?, replyMarkup: Api.ReplyMarkup?) diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 16344d8e88..47f4660cbc 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -2924,33 +2924,6 @@ public extension Api { }) } - public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-637606386) - serializeInt32(flags, buffer: buffer, boxed: false) - fromPeer.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt32(item, buffer: buffer, boxed: false) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(randomId.count)) - for item in randomId { - serializeInt64(item, buffer: buffer, boxed: false) - } - toPeer.serialize(buffer, true) - if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(570955184) @@ -2971,31 +2944,6 @@ public extension Api { }) } - public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1224152952) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - serializeInt32(id, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} - if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} - if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) - buffer.appendInt32(Int32(entities!.count)) - for item in entities! { - item.serialize(buffer, true) - }} - if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia], scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-872345397) @@ -3018,6 +2966,33 @@ public extension Api { }) } + public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-637606386) + serializeInt32(flags, buffer: buffer, boxed: false) + fromPeer.serialize(buffer, true) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(randomId.count)) + for item in randomId { + serializeInt64(item, buffer: buffer, boxed: false) + } + toPeer.serialize(buffer, true) + if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func getScheduledHistory(peer: Api.InputPeer, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-490575781) @@ -3090,6 +3065,31 @@ public extension Api { }) } + public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1224152952) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt32(id, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} + if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(entities!.count)) + for item in entities! { + item.serialize(buffer, true) + }} + if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func sendReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, reaction: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(627641572) @@ -3125,6 +3125,25 @@ public extension Api { return result }) } + + public static func getMessageReactionsList(flags: Int32, peer: Api.InputPeer, id: Int32, reaction: String?, offset: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(363935594) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt32(id, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeString(reaction!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {serializeString(offset!, buffer: buffer, boxed: false)} + serializeInt32(limit, buffer: buffer, boxed: false) + return (FunctionDescription(name: "messages.getMessageReactionsList", parameters: [("flags", flags), ("peer", peer), ("id", id), ("reaction", reaction), ("offset", offset), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.MessageReactionsList? in + let reader = BufferReader(buffer) + var result: Api.MessageReactionsList? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.MessageReactionsList + } + return result + }) + } } public struct channels { public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift b/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift index 84db8e8128..2aa6d3de04 100644 --- a/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift +++ b/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift @@ -105,7 +105,7 @@ func parseTelegramGroupOrChannel(chat: Api.Chat) -> Peer? { let restrictionInfo: PeerAccessRestrictionInfo? if let restrictionReason = restrictionReason { - restrictionInfo = PeerAccessRestrictionInfo(reason: restrictionReason) + restrictionInfo = PeerAccessRestrictionInfo(apiReasons: restrictionReason) } else { restrictionInfo = nil } diff --git a/submodules/TelegramCore/TelegramCore/PeerAccessRestrictionInfo.swift b/submodules/TelegramCore/TelegramCore/PeerAccessRestrictionInfo.swift index 446fa9850b..965146c0c9 100644 --- a/submodules/TelegramCore/TelegramCore/PeerAccessRestrictionInfo.swift +++ b/submodules/TelegramCore/TelegramCore/PeerAccessRestrictionInfo.swift @@ -1,26 +1,84 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif -public final class PeerAccessRestrictionInfo: PostboxCoding, Equatable { +public final class RestrictionRule: PostboxCoding, Equatable { + public let platform: String public let reason: String + public let text: String - init(reason: String) { + public init(platform: String, reason: String, text: String) { + self.platform = platform self.reason = reason + self.text = text } public init(decoder: PostboxDecoder) { - self.reason = decoder.decodeStringForKey("rsn", orElse: "") + self.platform = decoder.decodeStringForKey("p", orElse: "all") + self.reason = decoder.decodeStringForKey("r", orElse: "") + self.text = decoder.decodeStringForKey("t", orElse: "") } public func encode(_ encoder: PostboxEncoder) { - encoder.encodeString(self.reason, forKey: "rsn") + encoder.encodeString(self.platform, forKey: "p") + encoder.encodeString(self.reason, forKey: "r") + encoder.encodeString(self.text, forKey: "t") + } + + public static func ==(lhs: RestrictionRule, rhs: RestrictionRule) -> Bool { + if lhs.platform != rhs.platform { + return false + } + if lhs.reason != rhs.reason { + return false + } + if lhs.text != rhs.text { + return false + } + return true + } +} + +public final class PeerAccessRestrictionInfo: PostboxCoding, Equatable { + public let rules: [RestrictionRule] + + init(rules: [RestrictionRule]) { + self.rules = rules + } + + public init(decoder: PostboxDecoder) { + if let value = decoder.decodeOptionalStringForKey("rsn") { + self.rules = [RestrictionRule(platform: "all", reason: "", text: value)] + } else { + self.rules = decoder.decodeObjectArrayWithDecoderForKey("rs") + } + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeObjectArray(self.rules, forKey: "rs") } public static func ==(lhs: PeerAccessRestrictionInfo, rhs: PeerAccessRestrictionInfo) -> Bool { - return lhs.reason == rhs.reason + return lhs.rules == rhs.rules + } +} + +extension RestrictionRule { + convenience init(apiReason: Api.RestrictionReason) { + switch apiReason { + case let .restrictionReason(platform, reason, text): + self.init(platform: platform, reason: reason, text: text) + } + } +} + +extension PeerAccessRestrictionInfo { + convenience init(apiReasons: [Api.RestrictionReason]) { + self.init(rules: apiReasons.map(RestrictionRule.init(apiReason:))) } } diff --git a/submodules/TelegramCore/TelegramCore/PeerUtils.swift b/submodules/TelegramCore/TelegramCore/PeerUtils.swift index 136def1d25..20a7762670 100644 --- a/submodules/TelegramCore/TelegramCore/PeerUtils.swift +++ b/submodules/TelegramCore/TelegramCore/PeerUtils.swift @@ -42,13 +42,25 @@ public extension Peer { } } - var restrictionText: String? { + func restrictionText(platform: String) -> String? { + var restrictionInfo: PeerAccessRestrictionInfo? switch self { case let user as TelegramUser: - return user.restrictionInfo?.reason + restrictionInfo = user.restrictionInfo case let channel as TelegramChannel: - return channel.restrictionInfo?.reason + restrictionInfo = channel.restrictionInfo default: + break + } + + if let restrictionInfo = restrictionInfo { + for rule in restrictionInfo.rules { + if rule.platform == "all" || rule.platform == platform { + return rule.text + } + } + return nil + } else { return nil } } diff --git a/submodules/TelegramCore/TelegramCore/RestrictedContentMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/RestrictedContentMessageAttribute.swift index 32013085b7..1da95cc0df 100644 --- a/submodules/TelegramCore/TelegramCore/RestrictedContentMessageAttribute.swift +++ b/submodules/TelegramCore/TelegramCore/RestrictedContentMessageAttribute.swift @@ -6,25 +6,17 @@ import Postbox #endif public class RestrictedContentMessageAttribute: MessageAttribute { - public let platformSelector: String - public let category: String - public let text: String + public let rules: [RestrictionRule] - public init(platformSelector: String, category: String, text: String) { - self.platformSelector = platformSelector - self.category = category - self.text = text + public init(rules: [RestrictionRule]) { + self.rules = rules } required public init(decoder: PostboxDecoder) { - self.platformSelector = decoder.decodeStringForKey("ps", orElse: "") - self.category = decoder.decodeStringForKey("c", orElse: "") - self.text = decoder.decodeStringForKey("t", orElse: "") + self.rules = decoder.decodeObjectArrayWithDecoderForKey("rs") } public func encode(_ encoder: PostboxEncoder) { - encoder.encodeString(self.platformSelector, forKey: "ps") - encoder.encodeString(self.category, forKey: "c") - encoder.encodeString(self.text, forKey: "t") + encoder.encodeObjectArray(self.rules, forKey: "rs") } } diff --git a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift index bf568a19d6..4f08eb87a9 100644 --- a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift @@ -543,14 +543,8 @@ extension StoreMessage { attributes.append(ReactionsMessageAttribute(apiReactions: reactions)) } - if let restrictionReason = restrictionReason, let range = restrictionReason.range(of: ":") { - let space = restrictionReason[restrictionReason.startIndex ..< range.lowerBound] - if let platformRange = space.range(of: "-") { - let category = space[space.startIndex ..< platformRange.lowerBound] - let platformSelector = space[space.endIndex...] - - attributes.append(RestrictedContentMessageAttribute(platformSelector: String(platformSelector), category: String(category), text: String(restrictionReason[range.upperBound...]))) - } + if let restrictionReason = restrictionReason { + attributes.append(RestrictedContentMessageAttribute(rules: restrictionReason.map(RestrictionRule.init(apiReason:)))) } var storeFlags = StoreMessageFlags() diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift index 949d822c87..0f2424d0c6 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift @@ -291,7 +291,7 @@ func telegramMediaWebpageFromApiWebpage(_ webpage: Api.WebPage, url: String?) -> return nil case let .webPagePending(id, date): return TelegramMediaWebpage(webpageId: MediaId(namespace: Namespaces.Media.CloudWebpage, id: id), content: .Pending(date, url)) - case let .webPage(_, id, url, displayUrl, hash, type, siteName, title, description, photo, embedUrl, embedType, embedWidth, embedHeight, duration, author, document, cachedPage): + case let .webPage(_, id, url, displayUrl, hash, type, siteName, title, description, photo, embedUrl, embedType, embedWidth, embedHeight, duration, author, document, documents, cachedPage): var embedSize: CGSize? if let embedWidth = embedWidth, let embedHeight = embedHeight { embedSize = CGSize(width: CGFloat(embedWidth), height: CGFloat(embedHeight)) diff --git a/submodules/TelegramCore/TelegramCore/TelegramUser.swift b/submodules/TelegramCore/TelegramCore/TelegramUser.swift index b91ddc7a27..08e75fe244 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramUser.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramUser.swift @@ -311,7 +311,7 @@ extension TelegramUser { botInfo = BotUserInfo(flags: botFlags, inlinePlaceholder: botInlinePlaceholder) } - let restrictionInfo: PeerAccessRestrictionInfo? = restrictionReason.flatMap(PeerAccessRestrictionInfo.init) + let restrictionInfo: PeerAccessRestrictionInfo? = restrictionReason.flatMap(PeerAccessRestrictionInfo.init(apiReasons:)) self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: accessHashValue, firstName: firstName, lastName: lastName, username: username, phone: phone, photo: representations, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags) case let .userEmpty(id): diff --git a/submodules/TelegramStringFormatting/Sources/MessageContentKind.swift b/submodules/TelegramStringFormatting/Sources/MessageContentKind.swift index 432b0b68fe..fe4df58980 100644 --- a/submodules/TelegramStringFormatting/Sources/MessageContentKind.swift +++ b/submodules/TelegramStringFormatting/Sources/MessageContentKind.swift @@ -83,8 +83,8 @@ public enum MessageContentKind: Equatable { public func messageContentKind(_ message: Message, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, accountPeerId: PeerId) -> MessageContentKind { for attribute in message.attributes { if let attribute = attribute as? RestrictedContentMessageAttribute { - if attribute.matchesPlatform() { - return .restricted(attribute.text) + if let text = attribute.platformText(platform: "ios") { + return .restricted(text) } break } diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index cf3142c490..9a77946636 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -1343,7 +1343,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } var restrictionText: String? - if let peer = chatPresentationInterfaceState.renderedPeer?.peer, let restrictionTextValue = peer.restrictionText, !restrictionTextValue.isEmpty { + if let peer = chatPresentationInterfaceState.renderedPeer?.peer, let restrictionTextValue = peer.restrictionText(platform: "ios"), !restrictionTextValue.isEmpty { restrictionText = restrictionTextValue } else if chatPresentationInterfaceState.isNotAccessible { if let peer = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramChannel, case .broadcast = peer.info { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index a9dc1f3898..5d42a6e92e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -28,7 +28,7 @@ private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [( outer: for message in item.content { for attribute in message.attributes { - if let attribute = attribute as? RestrictedContentMessageAttribute, attribute.matchesPlatform() { + if let attribute = attribute as? RestrictedContentMessageAttribute, attribute.platformText(platform: "ios") != nil { result.append((message, ChatMessageRestrictedBubbleContentNode.self)) break outer } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageRestrictedBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageRestrictedBubbleContentNode.swift index 2e9eb7d99c..744de6bcf4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageRestrictedBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageRestrictedBubbleContentNode.swift @@ -55,7 +55,7 @@ class ChatMessageRestrictedBubbleContentNode: ChatMessageBubbleContentNode { } else if let attribute = attribute as? ViewCountMessageAttribute { viewCount = attribute.count } else if let attribute = attribute as? RestrictedContentMessageAttribute { - rawText = attribute.text + rawText = attribute.platformText(platform: "ios") ?? "" } } From 2442653541223baea50e1bc921c12dbe929bc5e1 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sun, 25 Aug 2019 18:55:45 +0400 Subject: [PATCH 31/86] Fix restrictionText --- submodules/AvatarNode/Sources/AvatarNode.swift | 2 +- submodules/TelegramUI/TelegramUI/ChatController.swift | 4 ++-- .../TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift | 2 +- .../TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift | 2 +- .../TelegramUI/TelegramUI/PeerMediaCollectionController.swift | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/submodules/AvatarNode/Sources/AvatarNode.swift b/submodules/AvatarNode/Sources/AvatarNode.swift index a3f234237b..bbc1e08d3f 100644 --- a/submodules/AvatarNode/Sources/AvatarNode.swift +++ b/submodules/AvatarNode/Sources/AvatarNode.swift @@ -300,7 +300,7 @@ public final class AvatarNode: ASDisplayNode { representation = nil icon = .deletedIcon } - } else if peer?.restrictionText == nil { + } else if peer?.restrictionText(platform: "ios") == nil { representation = peer?.smallProfileImage } let updatedState: AvatarNodeState = .peerAvatar(peer?.id ?? PeerId(namespace: 0, id: 0), peer?.displayLetters ?? [], representation) diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index ab65a9a81f..4a367294dc 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -4771,7 +4771,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.navigationActionDisposable.set((peerView.get() |> take(1) |> deliverOnMainQueue).start(next: { [weak self] peerView in - if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText == nil && !strongSelf.presentationInterfaceState.isNotAccessible { + if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios") == nil && !strongSelf.presentationInterfaceState.isNotAccessible { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) { (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) } @@ -6650,7 +6650,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.navigationActionDisposable.set((strongSelf.context.account.postbox.loadedPeerWithId(peerId) |> take(1) |> deliverOnMainQueue).start(next: { [weak self] peer in - if let strongSelf = self, peer.restrictionText == nil { + if let strongSelf = self, peer.restrictionText(platform: "ios") == nil { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) { (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) } diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift index d3fdf95efa..c96a939a1c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift @@ -5,7 +5,7 @@ import TelegramCore import AccountContext func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, context: AccountContext, currentPanel: ChatInputPanelNode?, textInputPanelNode: ChatTextInputPanelNode?, interfaceInteraction: ChatPanelInterfaceInteraction?) -> ChatInputPanelNode? { - if let renderedPeer = chatPresentationInterfaceState.renderedPeer, renderedPeer.peer?.restrictionText != nil { + if let renderedPeer = chatPresentationInterfaceState.renderedPeer, renderedPeer.peer?.restrictionText(platform: "ios") != nil { return nil } if chatPresentationInterfaceState.isNotAccessible { diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift index 2f1b4de3ba..48885d29c0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift @@ -7,7 +7,7 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat if case .overlay = chatPresentationInterfaceState.mode { return nil } - if chatPresentationInterfaceState.renderedPeer?.peer?.restrictionText != nil { + if chatPresentationInterfaceState.renderedPeer?.peer?.restrictionText(platform: "ios") != nil { return nil } if chatPresentationInterfaceState.search != nil { diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index c964f79ca9..4702f224f8 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -614,7 +614,7 @@ public class PeerMediaCollectionController: TelegramBaseController { strongSelf.navigationActionDisposable.set((strongSelf.context.account.postbox.loadedPeerWithId(peerId) |> take(1) |> deliverOnMainQueue).start(next: { [weak self] peer in - if let strongSelf = self, peer.restrictionText == nil { + if let strongSelf = self, peer.restrictionText(platform: "ios") == nil { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) { (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) } From dd04bdb4e26f9b8c7d141ba641a118c59ccf1793 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 25 Aug 2019 21:46:01 +0300 Subject: [PATCH 32/86] Various UI fixes --- .../AvatarNode/Sources/PeerAvatar.swift | 11 +++-- .../Sources/Node/ChatListItem.swift | 6 +-- submodules/Display/Display/TabBarNode.swift | 4 +- submodules/Display/Display/TextNode.swift | 11 +---- .../Sources/SettingsController.swift | 5 +- .../TelegramCore/ChannelMembers.swift | 1 - .../TelegramPeerNotificationSettings.swift | 6 +-- .../TelegramCore/TelegramCore/Themes.swift | 12 ++--- .../AddChannelIcon.imageset/Contents.json | 2 +- ...c_addchannel.pdf => ic_addchannel (2).pdf} | Bin 4747 -> 4745 bytes .../ChatChannelSubscriberInputPanelNode.swift | 2 +- .../TelegramUI/ChatController.swift | 43 +++++++++++++----- .../TelegramUI/ChatInfoTitlePanelNode.swift | 2 +- .../Sources/ChatTextInputAttributes.swift | 6 ++- 14 files changed, 59 insertions(+), 52 deletions(-) rename submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/{ic_addchannel.pdf => ic_addchannel (2).pdf} (71%) diff --git a/submodules/AvatarNode/Sources/PeerAvatar.swift b/submodules/AvatarNode/Sources/PeerAvatar.swift index 1e74de1103..7550b7367f 100644 --- a/submodules/AvatarNode/Sources/PeerAvatar.swift +++ b/submodules/AvatarNode/Sources/PeerAvatar.swift @@ -63,7 +63,7 @@ public func peerAvatarImageData(account: Account, peer: Peer, authorOfMessage: M } } -public func peerAvatarImage(account: Account, peer: Peer, authorOfMessage: MessageReference?, representation: TelegramMediaImageRepresentation?, displayDimensions: CGSize = CGSize(width: 60.0, height: 60.0), emptyColor: UIColor? = nil, synchronousLoad: Bool = false) -> Signal? { +public func peerAvatarImage(account: Account, peer: Peer, authorOfMessage: MessageReference?, representation: TelegramMediaImageRepresentation?, displayDimensions: CGSize = CGSize(width: 60.0, height: 60.0), inset: CGFloat = 0.0, emptyColor: UIColor? = nil, synchronousLoad: Bool = false) -> Signal? { if let imageData = peerAvatarImageData(account: account, peer: peer, authorOfMessage: authorOfMessage, representation: representation, synchronousLoad: synchronousLoad) { return imageData |> mapToSignal { data -> Signal in @@ -74,21 +74,22 @@ public func peerAvatarImage(account: Account, peer: Peer, authorOfMessage: Messa return .single(generateImage(displayDimensions, contextGenerator: { size, context -> Void in if let data = data { if let imageSource = CGImageSourceCreateWithData(data as CFData, nil), let dataImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) { + context.clear(CGRect(origin: CGPoint(), size: displayDimensions)) context.setBlendMode(.copy) - context.draw(dataImage, in: CGRect(origin: CGPoint(), size: displayDimensions)) + context.draw(dataImage, in: CGRect(origin: CGPoint(), size: displayDimensions).insetBy(dx: inset, dy: inset)) context.setBlendMode(.destinationOut) - context.draw(roundCorners.cgImage!, in: CGRect(origin: CGPoint(), size: displayDimensions)) + context.draw(roundCorners.cgImage!, in: CGRect(origin: CGPoint(), size: displayDimensions).insetBy(dx: inset, dy: inset)) } else { if let emptyColor = emptyColor { context.clear(CGRect(origin: CGPoint(), size: displayDimensions)) context.setFillColor(emptyColor.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: displayDimensions)) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: displayDimensions).insetBy(dx: inset, dy: inset)) } } } else if let emptyColor = emptyColor { context.clear(CGRect(origin: CGPoint(), size: displayDimensions)) context.setFillColor(emptyColor.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: displayDimensions)) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: displayDimensions).insetBy(dx: inset, dy: inset)) } })) } diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index 129717df82..e0fcb1d545 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -915,9 +915,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { if let mutedCount = unreadCount.mutedCount, mutedCount > 0 { let mutedUnreadCountText = compactNumericCountString(Int(mutedCount), decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator) - currentMentionBadgeImage = PresentationResourcesChatList.badgeBackgroundInactive(item.presentationData.theme) - mentionBadgeContent = .text(NSAttributedString(string: mutedUnreadCountText, font: badgeFont, textColor: theme.unreadBadgeInactiveTextColor)) } } @@ -1331,8 +1329,8 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { if let currentMutedIconImage = currentMutedIconImage { strongSelf.mutedIconNode.image = currentMutedIconImage strongSelf.mutedIconNode.isHidden = false - transition.updateFrame(node: strongSelf.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin, y: contentRect.origin.y + 5.0), size: currentMutedIconImage.size)) - nextTitleIconOrigin += currentMutedIconImage.size.width + 3.0 + transition.updateFrame(node: strongSelf.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 4.0, y: contentRect.origin.y - 2.0), size: currentMutedIconImage.size)) + nextTitleIconOrigin += currentMutedIconImage.size.width + 1.0 } else { strongSelf.mutedIconNode.image = nil strongSelf.mutedIconNode.isHidden = true diff --git a/submodules/Display/Display/TabBarNode.swift b/submodules/Display/Display/TabBarNode.swift index deca7413c1..99f37b694f 100644 --- a/submodules/Display/Display/TabBarNode.swift +++ b/submodules/Display/Display/TabBarNode.swift @@ -434,10 +434,10 @@ class TabBarNode: ASDisplayNode { let backgroundSize = CGSize(width: hasSingleLetterValue ? 18.0 : max(18.0, badgeSize.width + 10.0 + 1.0), height: 18.0) let backgroundFrame: CGRect if horizontal { - backgroundFrame = CGRect(origin: CGPoint(x: originX + 8.0, y: 2.0), size: backgroundSize) + backgroundFrame = CGRect(origin: CGPoint(x: originX + 10.0, y: 2.0), size: backgroundSize) } else { let contentWidth = node.contentWidth ?? node.frame.width - backgroundFrame = CGRect(origin: CGPoint(x: floor(originX + node.frame.width / 2.0) - 1.0 + contentWidth - backgroundSize.width - 1.0, y: 2.0), size: backgroundSize) + backgroundFrame = CGRect(origin: CGPoint(x: floor(originX + node.frame.width / 2.0) + contentWidth - backgroundSize.width - 5.0, y: 2.0), size: backgroundSize) } transition.updateFrame(node: container.badgeContainerNode, frame: backgroundFrame) container.badgeBackgroundNode.frame = CGRect(origin: CGPoint(), size: backgroundFrame.size) diff --git a/submodules/Display/Display/TextNode.swift b/submodules/Display/Display/TextNode.swift index 2b5fa41930..77b59c9d30 100644 --- a/submodules/Display/Display/TextNode.swift +++ b/submodules/Display/Display/TextNode.swift @@ -60,9 +60,9 @@ private func displayLineFrame(frame: CGRect, isRTL: Bool, boundingRect: CGRect, return frame } var lineFrame = frame - let intersectionFrame = lineFrame.offsetBy(dx: 0.0, dy: -lineFrame.height) if isRTL { lineFrame.origin.x = max(0.0, floor(boundingRect.width - lineFrame.size.width)) + let intersectionFrame = lineFrame.offsetBy(dx: 0.0, dy: -lineFrame.height / 4.5) if let topRight = cutout?.topRight { let topRightRect = CGRect(origin: CGPoint(x: boundingRect.width - topRight.width, y: 0.0), size: topRight) if intersectionFrame.intersects(topRightRect) { @@ -225,9 +225,6 @@ public final class TextNodeLayout: NSObject { case .center: lineFrame.origin.x = floor((self.size.width - lineFrame.size.width) / 2.0) case .natural: - if line.isRTL { - lineFrame.origin.x = self.size.width - lineFrame.size.width - } lineFrame = displayLineFrame(frame: lineFrame, isRTL: line.isRTL, boundingRect: CGRect(origin: CGPoint(), size: self.size), cutout: self.cutout) default: break @@ -296,9 +293,6 @@ public final class TextNodeLayout: NSObject { case .center: lineFrame.origin.x = floor((self.size.width - lineFrame.size.width) / 2.0) case .natural: - if line.isRTL { - lineFrame.origin.x = self.size.width - lineFrame.size.width - } lineFrame = displayLineFrame(frame: lineFrame, isRTL: line.isRTL, boundingRect: CGRect(origin: CGPoint(), size: self.size), cutout: self.cutout) default: break @@ -374,9 +368,6 @@ public final class TextNodeLayout: NSObject { case .center: lineFrame.origin.x = floor((self.size.width - lineFrame.size.width) / 2.0) case .natural: - if line.isRTL { - lineFrame.origin.x = floor(self.size.width - lineFrame.size.width) - } lineFrame = displayLineFrame(frame: lineFrame, isRTL: line.isRTL, boundingRect: CGRect(origin: CGPoint(), size: self.size), cutout: self.cutout) default: break diff --git a/submodules/SettingsUI/Sources/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift index d7f09ae637..2c17680d08 100644 --- a/submodules/SettingsUI/Sources/SettingsController.swift +++ b/submodules/SettingsUI/Sources/SettingsController.swift @@ -1220,7 +1220,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM |> distinctUntilChanged(isEqual: { $0?.0 === $1?.0 && arePeersEqual($0?.1, $1?.1) }) |> mapToSignal { primary -> Signal in if let primary = primary { - if let signal = peerAvatarImage(account: primary.0, peer: primary.1, authorOfMessage: nil, representation: primary.1.profileImageRepresentations.first, displayDimensions: CGSize(width: 25.0, height: 25.0), emptyColor: nil, synchronousLoad: false) { + if let signal = peerAvatarImage(account: primary.0, peer: primary.1, authorOfMessage: nil, representation: primary.1.profileImageRepresentations.first, displayDimensions: CGSize(width: 31.0, height: 31.0), inset: 3.0, emptyColor: nil, synchronousLoad: false) { return signal |> map { image -> UIImage? in return image.flatMap { image -> UIImage in @@ -1229,9 +1229,10 @@ public func settingsController(context: AccountContext, accountManager: AccountM } } else { return Signal { subscriber in - let size = CGSize(width: 25.0, height: 25.0) + let size = CGSize(width: 31.0, height: 31.0) let image = generateImage(size, rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) + context.translateBy(x: 3.0, y: 3.0) drawPeerAvatarLetters(context: context, size: size, font: avatarFont, letters: primary.1.displayLetters, accountPeerId: primary.1.id, peerId: primary.1.id) })?.withRenderingMode(.alwaysOriginal) subscriber.putNext(image) diff --git a/submodules/TelegramCore/TelegramCore/ChannelMembers.swift b/submodules/TelegramCore/TelegramCore/ChannelMembers.swift index 858abfb1ba..2cc891484f 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelMembers.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelMembers.swift @@ -92,7 +92,6 @@ public func channelMembers(postbox: Postbox, network: Network, accountPeerId: Pe if let peer = peers[participant.peerId] { items.append(RenderedChannelParticipant(participant: participant, peer: peer, peers: peers, presences: presences)) } - } case .channelParticipantsNotModified: return nil diff --git a/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift b/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift index aa6e6fa00a..b61e6a3346 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift @@ -286,11 +286,7 @@ extension PeerMessageSound { case .default: return nil case let .bundledModern(id): - if id == 0 { - return "default" - } else { - return "\(id + 100)" - } + return "\(id + 100)" case let .bundledClassic(id): return "\(id + 2)" } diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index bfbc5c46fb..d41b0a4918 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -1,12 +1,12 @@ import Foundation #if os(macOS) -import PostboxMac -import SwiftSignalKitMac -import TelegramApiMac + import PostboxMac + import SwiftSignalKitMac + import TelegramApiMac #else -import Postbox -import SwiftSignalKit -import TelegramApi + import Postbox + import SwiftSignalKit + import TelegramApi #endif final class CachedThemesConfiguration: PostboxCoding { diff --git a/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json index 8033bd89cd..44f25d3edd 100644 --- a/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "ic_addchannel.pdf" + "filename" : "ic_addchannel (2).pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/ic_addchannel.pdf b/submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/ic_addchannel (2).pdf similarity index 71% rename from submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/ic_addchannel.pdf rename to submodules/TelegramUI/Images.xcassets/Item List/AddChannelIcon.imageset/ic_addchannel (2).pdf index 0eb106737a906a74754ee7d31d74c31073932ba7..aed51ac2c7e85a5ec0d4a1442f203f56990406be 100644 GIT binary patch delta 1297 zcmeBH?Npr*SU=4-PgYT&<$E!go`93H^I;EZt+c>t@k{HIcfuGE#qqJkRg- zdFHTQ*5TB>qebfb88xlVZ=dkt6*ylTxkRq}PT$3uZ!6-fwkkT+vp>BWH2d_al9ca9 z47Y@N_ILlPQ_EMqb!Ye8+ibU92ind&{&K}L>(4u^cR7@$MI_61{_ec(VDD)9U32Mq z79mH|^-9-XoL+cMf4%JL^SM{UkFWERDV2BhdsHaY?DD8keV>BPEUtauy6#6`6mGHF zzHGVdgbQCLz6yMOE4MbNhyuKN)5{OICM*Jg00e7SmY(bH6Cku2H6>I$2= zX3k@u8JV+cr}(>ai+R0a$B)K^2lh-Wv|RgJIw?pxDIn-j&y>*8zZsj%4*vO~bFKb0 z!@?^4uZwct3iF+axN?M@rN?KroOb$UkCEN%ri4@QNvXxtQ0R`|5=ZfWy20l7GrsM28H zJi%Q@EKfgEfBiSzWzKK0<;Q~juD{=GC~}-}(avA-R?m1vZg7h$M{h2ZJHnxSfbSM_ z?d5v^a-VngWlSph`3^tXi}q}Ef4b=G#rJ`MdQEW;o+sq_uub4(oY*EGDYEBXeRcNn z>DfAo^Gvi4>4?wMYz%aXzUiWSCZTer5L4SR9)^_3r>92jjFhin|F!e=tEU|6TQ>G> z=)1eEr(^FlotO!46||2{vzh$9ap{dXiys@OAKaqz;)6fG9#?(1bRNsfj!cQ}qXz^G zc^H5D3S1W9+x_Tg?~1E)58q$7rtnzD%j5^;9U6xXbPaRO-al@h-SuDMx3-U%%p&70 zdVS1oGFuN%zrC%%-onUw8B2r_PozYAsGeR&$YZ|4=?ObzMDMDG-Mx2b%Y;{jXJU@} z_JwFSiO2fh=&(rt9+Q7B=*qr@8^68g+9Pp4j{g*w=BlCa9>-v~_q0dw6 zmae~l?`Ou|Wqxd(e)ZznqsIkF|aU0S7%~q3>D);I1}gx!^!Ui?c$S64a^gb zQvmEGnreN=@T3F*dT` LQdM>JcjE#8wIVJE delta 1299 zcmeBF?N*%-SU)weOV*Od^?$bLy#p0G(c9jlJKIKA=0?{>>cv0trBOs`0 zStd%k*lZu`7EbP z_S7#A*BHzSzG-vl)*Z78^Hx_?*GXKx{rT(*rknFtN?`J%ja zcl32WN!43dZ#k6ww0joTrT607vih|xJyqeM6C!iAzPOl?taT)>@8Ts6ckg%q_Fd{% znV07ubm5`pdYh=PO^MqRSL9Zn)nEC$faTGB8HT+T!T0#L_g=mrR4(R}9W3zqb=1y? zXqTxuuD4a{>-BZ{V-@ciu%ADF_RQWFA^qXg7Bo%TeQw``sBM-d7DjF>Lit0kt? z2d;eUpR)Cnf>F`cw8us4Zn+ztztWCdV|v9l==ZvZ*FsJxT%Gmt)P^hbN<%+KB*ZSc z%AI4Rya8*dkrum|ivkTA1xR~7?b8gl0m`;B3*@*3I?YrjP=dVrp zy7R@mN3(YFonokWESLCQDBu6)gP*9MUt<3%R6xdRL0X zrA3=oX>{3K6%eI%Q+h@{H^_ivT=%d|v-0Bn3YB#LEAo{X6;pGRB*%qeTxlUW}*MkpRz(ds0|aj^gE@wo14 z_qrwZm+Qr?b^iL)|NngQ{M~e|kKcbz{CA5f_vxC2@tun|S5COzJI6o%y5$`+#(m54 z|1+DjUf}I^#aYqH=s;j>n7XTkaMrQy3 diff --git a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift index 9ab304082f..8fff6f82f6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift @@ -198,7 +198,7 @@ final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { guard let strongSelf = self, let interfaceState = strongSelf.presentationInterfaceState, let image = strongSelf.badgeBackground.image else { return } - let text = "\(value ?? 0)" + let text = compactNumericCountString(value ?? 0, decimalSeparator: interfaceState.dateTimeFormat.decimalSeparator) strongSelf.badgeText.attributedText = NSAttributedString(string: text, font: badgeFont, textColor: interfaceState.theme.chatList.unreadBadgeActiveTextColor) let textSize = strongSelf.badgeText.updateLayout(CGSize(width: 100.0, height: 100.0)) diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index ab65a9a81f..3171b30f15 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -1653,24 +1653,35 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var hasScheduledMessages: Signal = .single(false) if peerId.namespace == Namespaces.Peer.CloudChannel { - let recentOnlineSignal: Signal = context.account.viewTracker.peerView(peerId) - |> map { view -> Bool in - if let cachedData = view.cachedData as? CachedChannelData, let memberCount = cachedData.participantsSummary.memberCount, memberCount > 50 { - return true + let recentOnlineSignal: Signal = peerView.get() + |> map { view -> Bool? in + if let cachedData = view.cachedData as? CachedChannelData, let peer = peerViewMainPeer(view) as? TelegramChannel { + if case .broadcast = peer.info { + return nil + } else if let memberCount = cachedData.participantsSummary.memberCount, memberCount > 50 { + return true + } else { + return false + } } else { return false } } |> distinctUntilChanged - |> mapToSignal { isLarge -> Signal in - if isLarge { - return context.peerChannelMemberCategoriesContextsManager.recentOnline(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId) + |> mapToSignal { isLarge -> Signal in + if let isLarge = isLarge { + if isLarge { + return context.peerChannelMemberCategoriesContextsManager.recentOnline(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId) + |> map(Optional.init) + } else { + return context.peerChannelMemberCategoriesContextsManager.recentOnlineSmall(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId) + |> map(Optional.init) + } } else { - return context.peerChannelMemberCategoriesContextsManager.recentOnlineSmall(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId) + return .single(nil) } } onlineMemberCount = recentOnlineSignal - |> map(Optional.init) self.reportIrrelvantGeoNoticePromise.set(context.account.postbox.transaction { transaction -> Bool? in if let _ = transaction.getNoticeEntry(key: ApplicationSpecificNotice.irrelevantPeerGeoReportKey(peerId: peerId)) as? ApplicationSpecificBoolNotice { @@ -1684,9 +1695,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } if !isScheduledMessages && peerId.namespace != Namespaces.Peer.SecretChat { - hasScheduledMessages = context.account.viewTracker.scheduledMessagesViewForLocation(chatLocation) - |> map { view, _, _ in - return !view.entries.isEmpty + hasScheduledMessages = peerView.get() + |> take(1) + |> mapToSignal { view -> Signal in + if let peer = peerViewMainPeer(view) as? TelegramChannel, !peer.hasPermission(.sendMessages) { + return .single(false) + } else { + return context.account.viewTracker.scheduledMessagesViewForLocation(chatLocation) + |> map { view, _, _ in + return !view.entries.isEmpty + } + } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift index 047c31cfd3..2307d269dd 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift @@ -99,7 +99,7 @@ private func peerButtons(_ peer: Peer, interfaceState: ChatPresentationInterface } } -private let buttonFont = Font.regular(10.0) +private let buttonFont = Font.medium(10.0) private final class ChatInfoTitlePanelButtonNode: HighlightableButtonNode { override init() { diff --git a/submodules/TextFormat/Sources/ChatTextInputAttributes.swift b/submodules/TextFormat/Sources/ChatTextInputAttributes.swift index db52c8c553..82cc311a45 100644 --- a/submodules/TextFormat/Sources/ChatTextInputAttributes.swift +++ b/submodules/TextFormat/Sources/ChatTextInputAttributes.swift @@ -510,11 +510,13 @@ private func trimRangesForChatInputText(_ text: NSAttributedString) -> (Int, Int var lower = 0 var upper = 0 + let trimmedCharacters: [UnicodeScalar] = [" ", "\t", "\n", "\u{200C}"] + let nsString: NSString = text.string as NSString for i in 0 ..< nsString.length { if let c = UnicodeScalar(nsString.character(at: i)) { - if c == " " as UnicodeScalar || c == "\t" as UnicodeScalar || c == "\n" as UnicodeScalar { + if trimmedCharacters.contains(c) { lower += 1 } else { break @@ -527,7 +529,7 @@ private func trimRangesForChatInputText(_ text: NSAttributedString) -> (Int, Int if lower != nsString.length { for i in (lower ..< nsString.length).reversed() { if let c = UnicodeScalar(nsString.character(at: i)) { - if c == " " as UnicodeScalar || c == "\t" as UnicodeScalar || c == "\n" as UnicodeScalar { + if trimmedCharacters.contains(c) { upper += 1 } else { break From fd76dcbd46451881e1a46cf3a3e0e5acabc90580 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 27 Aug 2019 05:23:06 +0300 Subject: [PATCH 33/86] Various UI fixes --- .../Sources/Node/ChatListStatusNode.swift | 4 +- .../TGMediaPickerModernGalleryMixin.m | 2 +- .../TGMediaPickerSendActionSheetController.h | 2 +- .../TGMediaPickerSendActionSheetController.m | 20 +- .../Sources/LegacyAttachmentMenu.swift | 8 +- .../Sources/LegacyMediaPickers.swift | 8 +- .../ProxyListSettingsController.swift | 5 +- .../Sources/SettingsController.swift | 5 +- .../TelegramCore/AccountViewTracker.swift | 4 +- .../TelegramUI/ChatController.swift | 181 +++++++++++------- .../TelegramUI/ChatControllerNode.swift | 2 +- .../TelegramUI/ChatHistoryListNode.swift | 14 +- .../ChatHistoryViewForLocation.swift | 2 +- .../ChatRecordingPreviewInputPanelNode.swift | 2 +- .../ChatScheduleTimeController.swift | 6 +- .../ChatScheduleTimeControllerNode.swift | 20 +- .../TelegramUI/ChatSearchInputPanelNode.swift | 8 +- .../ChatTextInputActionButtonsNode.swift | 2 +- .../TelegramUI/ChatTextInputPanelNode.swift | 10 +- .../TelegramUI/TelegramUI/LegacyCamera.swift | 6 +- 20 files changed, 191 insertions(+), 120 deletions(-) diff --git a/submodules/ChatListUI/Sources/Node/ChatListStatusNode.swift b/submodules/ChatListUI/Sources/Node/ChatListStatusNode.swift index 9611158562..fdd9b7d121 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListStatusNode.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListStatusNode.swift @@ -402,7 +402,7 @@ private class ChatListStatusFailedNode: ChatListStatusContentNode { } let diameter: CGFloat = 14.0 - let rect = CGRect(origin: CGPoint(x: floor((bounds.width - diameter) / 2.0), y: floor((bounds.height - diameter) / 2.0)), size: CGSize(width: diameter, height: diameter)).offsetBy(dx: 1.0, dy: 1.0) + let rect = CGRect(origin: CGPoint(x: floor((bounds.width - diameter) / 2.0), y: floor((bounds.height - diameter) / 2.0)), size: CGSize(width: diameter, height: diameter)).offsetBy(dx: 1.0, dy: UIScreenPixel) context.setFillColor(parameters.fill.cgColor) context.fillEllipse(in: rect) @@ -412,7 +412,7 @@ private class ChatListStatusFailedNode: ChatListStatusContentNode { let stringRect = string.boundingRect(with: rect.size, options: .usesLineFragmentOrigin, context: nil) UIGraphicsPushContext(context) - string.draw(at: CGPoint(x: rect.minX + floor((rect.width - stringRect.width) / 2.0), y: 1.0 + rect.minY + floor((rect.height - stringRect.height) / 2.0))) + string.draw(at: CGPoint(x: rect.minX + floor((rect.width - stringRect.width) / 2.0), y: 1.0 - UIScreenPixel + rect.minY + floor((rect.height - stringRect.height) / 2.0))) UIGraphicsPopContext() } diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m index 1ce2b7b2e8..f97b846367 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m @@ -147,7 +147,7 @@ UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium]; [generator impactOccurred]; - TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting]; + TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting canSchedule:hasSchedule]; controller.send = ^{ __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; if (strongSelf == nil) diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h index 3506eb0908..6ad00b1e4c 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.h @@ -8,7 +8,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy) void (^sendSilently)(void); @property (nonatomic, copy) void (^schedule)(void); -- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame canSendSilently:(bool)canSendSilently; +- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame canSendSilently:(bool)canSendSilently canSchedule:(bool)canSchedule; @end diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m index 9d4365a90e..da25e89099 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerSendActionSheetController.m @@ -75,6 +75,7 @@ CGRect _sendButtonFrame; bool _canSendSilently; + bool _canSchedule; bool _autorotationWasEnabled; bool _dismissed; @@ -90,12 +91,13 @@ @implementation TGMediaPickerSendActionSheetController -- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame canSendSilently:(bool)canSendSilently { +- (instancetype)initWithContext:(id)context sendButtonFrame:(CGRect)sendButtonFrame canSendSilently:(bool)canSendSilently canSchedule:(bool)canSchedule { self = [super initWithContext:context]; if (self != nil) { _context = context; _sendButtonFrame = sendButtonFrame; _canSendSilently = canSendSilently; + _canSchedule = canSchedule; } return self; } @@ -125,12 +127,14 @@ [_containerView addSubview:_sendSilentlyButton]; } - _scheduleButton = [[TGMediaPickerSendActionSheetItemView alloc] initWithTitle:TGLocalized(@"Conversation.SendMessage.ScheduleMessage") icon:TGComponentsImageNamed(@"MediaSchedule")]; - _scheduleButton.pressed = ^{ - __strong TGMediaPickerSendActionSheetController *strongSelf = weakSelf; - [strongSelf schedulePressed]; - }; - [_containerView addSubview:_scheduleButton]; + if (_canSchedule) { + _scheduleButton = [[TGMediaPickerSendActionSheetItemView alloc] initWithTitle:TGLocalized(@"Conversation.SendMessage.ScheduleMessage") icon:TGComponentsImageNamed(@"MediaSchedule")]; + _scheduleButton.pressed = ^{ + __strong TGMediaPickerSendActionSheetController *strongSelf = weakSelf; + [strongSelf schedulePressed]; + }; + [_containerView addSubview:_scheduleButton]; + } TGMediaAssetsPallete *pallete = nil; if ([[LegacyComponentsGlobals provider] respondsToSelector:@selector(mediaAssetsPallete)]) @@ -238,7 +242,7 @@ CGFloat itemHeight = 44.0; CGFloat containerWidth = 240.0; - CGFloat containerHeight = _canSendSilently ? itemHeight * 2.0 : itemHeight; + CGFloat containerHeight = _canSendSilently && _canSchedule ? itemHeight * 2.0 : itemHeight; containerWidth = MAX(containerWidth, MAX(_sendSilentlyButton.buttonLabel.frame.size.width, _scheduleButton.buttonLabel.frame.size.width) + 84.0); if (!_dismissed) { _containerView.frame = CGRectMake(CGRectGetMaxX(_sendButtonFrame) - containerWidth - 8.0, _sendButtonFrame.origin.y - containerHeight - 4.0, containerWidth, containerHeight); diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift index f2a833798e..5a669986a9 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift @@ -20,7 +20,7 @@ public struct LegacyAttachmentMenuMediaEditing: OptionSet { public static let imageOrVideo = LegacyAttachmentMenuMediaEditing(rawValue: 1 << 0) } -public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentScheduleController: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController { +public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController { let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat let controller = TGMenuSheetController(context: parentController.context, dark: false)! @@ -72,13 +72,13 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaO } if peer.id != context.account.peerId { if peer is TelegramUser { - carouselItem.hasTimer = true + carouselItem.hasTimer = !hasSchedule } carouselItem.hasSilentPosting = !isSecretChat } - carouselItem.hasSchedule = !isSecretChat + carouselItem.hasSchedule = hasSchedule carouselItem.presentScheduleController = { done in - presentScheduleController { time in + presentSchedulePicker { time in done?(time) } } diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift index a1ed9bffc6..c697596896 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift @@ -17,7 +17,7 @@ public func guessMimeTypeByFileExtension(_ ext: String) -> String { return TGMimeTypeMap.mimeType(forExtension: ext) ?? "application/binary" } -public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, context: AccountContext, peer: Peer, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false, initialCaption: String, presentWebSearch: (() -> Void)?, presentSelectionLimitExceeded: @escaping () -> Void, presentScheduleController: @escaping (@escaping (Int32) -> Void) -> Void) { +public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, context: AccountContext, peer: Peer, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false, initialCaption: String, hasSchedule: Bool, presentWebSearch: (() -> Void)?, presentSelectionLimitExceeded: @escaping () -> Void, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void) { let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat controller.captionsEnabled = captionsEnabled @@ -25,13 +25,13 @@ public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, co controller.suggestionContext = legacySuggestionContext(account: context.account, peerId: peer.id) if peer.id != context.account.peerId { if peer is TelegramUser { - controller.hasTimer = true + controller.hasTimer = !hasSchedule } controller.hasSilentPosting = !isSecretChat } - controller.hasSchedule = !isSecretChat + controller.hasSchedule = hasSchedule controller.presentScheduleController = { done in - presentScheduleController { time in + presentSchedulePicker { time in done?(time) } } diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift index 52490f215b..fb9794136a 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift @@ -35,6 +35,7 @@ private final class ProxySettingsControllerArguments { private enum ProxySettingsControllerSection: Int32 { case enabled case servers + case share case calls } @@ -68,8 +69,10 @@ private enum ProxySettingsControllerEntry: ItemListNodeEntry { switch self { case .enabled: return ProxySettingsControllerSection.enabled.rawValue - case .serversHeader, .addServer, .server, .shareProxyList: + case .serversHeader, .addServer, .server: return ProxySettingsControllerSection.servers.rawValue + case .shareProxyList: + return ProxySettingsControllerSection.share.rawValue case .useForCalls, .useForCallsInfo: return ProxySettingsControllerSection.calls.rawValue } diff --git a/submodules/SettingsUI/Sources/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift index 2c17680d08..0117d3c335 100644 --- a/submodules/SettingsUI/Sources/SettingsController.swift +++ b/submodules/SettingsUI/Sources/SettingsController.swift @@ -1230,10 +1230,11 @@ public func settingsController(context: AccountContext, accountManager: AccountM } else { return Signal { subscriber in let size = CGSize(width: 31.0, height: 31.0) + let inset: CGFloat = 3.0 let image = generateImage(size, rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) - context.translateBy(x: 3.0, y: 3.0) - drawPeerAvatarLetters(context: context, size: size, font: avatarFont, letters: primary.1.displayLetters, accountPeerId: primary.1.id, peerId: primary.1.id) + context.translateBy(x: inset, y: inset) + drawPeerAvatarLetters(context: context, size: CGSize(width: size.width - inset * 2.0, height: size.height - inset * 2.0), font: avatarFont, letters: primary.1.displayLetters, accountPeerId: primary.1.id, peerId: primary.1.id) })?.withRenderingMode(.alwaysOriginal) subscriber.putNext(image) subscriber.putCompletion() diff --git a/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift b/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift index c5d4863036..81f1949c73 100644 --- a/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift +++ b/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift @@ -919,9 +919,9 @@ public final class AccountViewTracker { } } - public func scheduledMessagesViewForLocation(_ chatLocation: ChatLocation) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { + public func scheduledMessagesViewForLocation(_ chatLocation: ChatLocation, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> { if let account = self.account { - let signal = account.postbox.aroundMessageHistoryViewForLocation(chatLocation, anchor: .upperBound, count: 200, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: nil, namespaces: .just(Namespaces.Message.allScheduled), orderStatistics: [], additionalData: []) + let signal = account.postbox.aroundMessageHistoryViewForLocation(chatLocation, anchor: .upperBound, count: 200, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: nil, namespaces: .just(Namespaces.Message.allScheduled), orderStatistics: [], additionalData: additionalData) return withState(signal, { [weak self] () -> Int32 in if let strongSelf = self { return OSAtomicIncrement32(&strongSelf.nextViewId) diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index e741786c43..57c555c1c1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -632,7 +632,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return false } - if let _ = strongSelf.presentationInterfaceState.slowmodeState { + if let _ = strongSelf.presentationInterfaceState.slowmodeState, !strongSelf.presentationInterfaceState.isScheduledMessages { strongSelf.interfaceInteraction?.displaySlowmodeTooltip(sourceNode, sourceRect) return false } @@ -663,7 +663,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return true }, sendGif: { [weak self] fileReference, sourceNode, sourceRect in if let strongSelf = self { - if let _ = strongSelf.presentationInterfaceState.slowmodeState { + if let _ = strongSelf.presentationInterfaceState.slowmodeState, !strongSelf.presentationInterfaceState.isScheduledMessages { strongSelf.interfaceInteraction?.displaySlowmodeTooltip(sourceNode, sourceRect) return false } @@ -1342,45 +1342,83 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - let _ = (strongSelf.context.account.postbox.transaction { transaction -> [Message] in - return transaction.getMessageFailedGroup(id) ?? [] - } |> deliverOnMainQueue).start(next: { messages in - guard let strongSelf = self, !messages.isEmpty else { - return - } - let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme) - var items: [ActionSheetItem] = [] - items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_MessageDialogRetry, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - guard let strongSelf = self else { + if id.namespace == Namespaces.Message.ScheduledCloud { + let _ = (strongSelf.context.account.postbox.transaction { transaction -> [Message] in + return transaction.getMessageGroup(id) ?? [] + } |> deliverOnMainQueue).start(next: { messages in + guard let strongSelf = self, let message = messages.filter({ $0.id == id }).first else { return } - let _ = resendMessages(account: strongSelf.context.account, messageIds: [id]).start() - })) - if messages.count != 1 { - items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_MessageDialogRetryAll(messages.count).0, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - guard let strongSelf = self else { - return + + var actions: [ContextMenuItem] = [] + actions.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.ScheduledMessages_SendNow, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.actionSheet.primaryTextColor) + }, action: { [weak self] _, f in + if let strongSelf = self { + strongSelf.controllerInteraction?.sendScheduledMessagesNow(messages.map { $0.id }) } - let _ = resendMessages(account: strongSelf.context.account, messageIds: messages.map({ $0.id })).start() - })) - } - items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_MessageDialogDelete, color: .destructive, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - guard let strongSelf = self else { + f(.dismissWithoutContent) + }))) + actions.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.ScheduledMessages_EditTime, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Schedule"), color: theme.actionSheet.primaryTextColor) + }, action: { [weak self] _, f in + if let strongSelf = self { + strongSelf.controllerInteraction?.editScheduledMessagesTime(messages.map { $0.id }) + } + f(.dismissWithoutContent) + }))) + actions.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_ContextMenuDelete, textColor: .destructive, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor) + }, action: { [weak self] controller, f in + if let strongSelf = self { + strongSelf.interfaceInteraction?.deleteMessages(messages, controller, f) + } + }))) + + let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil) + strongSelf.currentContextController = controller + strongSelf.window?.presentInGlobalOverlay(controller) + }) + } else { + let _ = (strongSelf.context.account.postbox.transaction { transaction -> [Message] in + return transaction.getMessageFailedGroup(id) ?? [] + } |> deliverOnMainQueue).start(next: { messages in + guard let strongSelf = self, let message = messages.filter({ $0.id == id }).first else { return } - let _ = deleteMessagesInteractively(postbox: strongSelf.context.account.postbox, messageIds: [id], type: .forLocalPeer).start() - })) - actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - }) - ])]) - strongSelf.chatDisplayNode.dismissInput() - strongSelf.present(actionSheet, in: .window(.root)) - }) + + var actions: [ContextMenuItem] = [] + actions.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_MessageDialogRetry, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.actionSheet.primaryTextColor) + }, action: { [weak self] _, f in + if let strongSelf = self { + let _ = resendMessages(account: strongSelf.context.account, messageIds: [id]).start() + } + f(.dismissWithoutContent) + }))) + if messages.count != 1 { + actions.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_MessageDialogRetryAll(messages.count).0, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.actionSheet.primaryTextColor) + }, action: { [weak self] _, f in + if let strongSelf = self { + let _ = resendMessages(account: strongSelf.context.account, messageIds: messages.map({ $0.id })).start() + } + f(.dismissWithoutContent) + }))) + } + actions.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_ContextMenuDelete, textColor: .destructive, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor) + }, action: { [weak self] controller, f in + if let strongSelf = self { + let _ = deleteMessagesInteractively(postbox: strongSelf.context.account.postbox, messageIds: [id], type: .forLocalPeer).start() + } + }))) + + let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil) + strongSelf.currentContextController = controller + strongSelf.window?.presentInGlobalOverlay(controller) + }) + } }, addContact: { [weak self] phoneNumber in if let strongSelf = self { strongSelf.context.sharedContext.openAddContact(context: strongSelf.context, firstName: "", lastName: "", phoneNumber: phoneNumber, label: defaultContactLabel, present: { [weak self] controller, arguments in @@ -1488,14 +1526,15 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } }, scheduleCurrentMessage: { [weak self] in - if let strongSelf = self { + if let strongSelf = self, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer { let mode: ChatScheduleTimeControllerMode - if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + if peer.id == strongSelf.context.account.peerId { mode = .reminders } else { mode = .scheduledMessages } - let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, completion: { [weak self] scheduleTime in + + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, minimalTime: strongSelf.presentationInterfaceState.slowmodeState?.timeout, completion: { [weak self] scheduleTime in if let strongSelf = self { strongSelf.chatDisplayNode.sendCurrentMessage(scheduleTime: scheduleTime) if !strongSelf.presentationInterfaceState.isScheduledMessages { @@ -1509,12 +1548,19 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, sendScheduledMessagesNow: { [weak self] messageIds in if let strongSelf = self { - let _ = sendScheduledMessageNowInteractively(postbox: strongSelf.context.account.postbox, messageId: messageIds.first!).start() + if let _ = strongSelf.presentationInterfaceState.slowmodeState { + if let rect = strongSelf.chatDisplayNode.frameForInputActionButton() { + strongSelf.interfaceInteraction?.displaySlowmodeTooltip(strongSelf.chatDisplayNode, rect) + } + return + } else { + let _ = sendScheduledMessageNowInteractively(postbox: strongSelf.context.account.postbox, messageId: messageIds.first!).start() + } } }, editScheduledMessagesTime: { [weak self] messageIds in - if let strongSelf = self, let messageId = messageIds.first { + if let strongSelf = self, let messageId = messageIds.first, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer { let mode: ChatScheduleTimeControllerMode - if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + if peer.id == strongSelf.context.account.peerId { mode = .reminders } else { mode = .scheduledMessages @@ -1526,7 +1572,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self, let message = message else { return } - let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, currentTime: message.timestamp, completion: { [weak self] scheduleTime in + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, currentTime: message.timestamp, minimalTime: strongSelf.presentationInterfaceState.slowmodeState?.timeout, completion: { [weak self] scheduleTime in if let strongSelf = self { var entities: TextEntitiesMessageAttribute? for attribute in message.attributes { @@ -2253,7 +2299,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var slowmodeState: ChatSlowmodeState? if let cachedData = combinedInitialData.cachedData as? CachedChannelData { pinnedMessageId = cachedData.pinnedMessageId - if let channel = combinedInitialData.initialData?.peer as? TelegramChannel, channel.isRestrictedBySlowmode, let timeout = cachedData.slowModeTimeout, !strongSelf.presentationInterfaceState.isScheduledMessages { + if let channel = combinedInitialData.initialData?.peer as? TelegramChannel, channel.isRestrictedBySlowmode, let timeout = cachedData.slowModeTimeout { if let slowmodeUntilTimestamp = calculateSlowmodeActiveUntilTimestamp(account: strongSelf.context.account, untilTimestamp: cachedData.slowModeValidUntilTimestamp) { slowmodeState = ChatSlowmodeState(timeout: timeout, variant: .timestamp(slowmodeUntilTimestamp)) } @@ -2659,7 +2705,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - if strongSelf.presentationInterfaceState.interfaceState.editMessage == nil, let _ = strongSelf.presentationInterfaceState.slowmodeState { + if strongSelf.presentationInterfaceState.interfaceState.editMessage == nil, let _ = strongSelf.presentationInterfaceState.slowmodeState, !strongSelf.presentationInterfaceState.isScheduledMessages { if let rect = strongSelf.chatDisplayNode.frameForAttachmentButton() { strongSelf.interfaceInteraction?.displaySlowmodeTooltip(strongSelf.chatDisplayNode, rect) } @@ -3168,7 +3214,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return false } - if let _ = strongSelf.presentationInterfaceState.slowmodeState { + if let _ = strongSelf.presentationInterfaceState.slowmodeState, !strongSelf.presentationInterfaceState.isScheduledMessages { strongSelf.interfaceInteraction?.displaySlowmodeTooltip(node, rect) return false } @@ -4921,7 +4967,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } return result } - let controller = legacyAttachmentMenu(context: strongSelf.context, peer: peer, editMediaOptions: menuEditMediaOptions, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, parentController: legacyController, recentlyUsedInlineBots: strongSelf.recentlyUsedInlineBotsValue, initialCaption: inputText.string, openGallery: { + + let controller = legacyAttachmentMenu(context: strongSelf.context, peer: peer, editMediaOptions: menuEditMediaOptions, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, hasSchedule: !strongSelf.presentationInterfaceState.isScheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, parentController: legacyController, recentlyUsedInlineBots: strongSelf.recentlyUsedInlineBotsValue, initialCaption: inputText.string, openGallery: { self?.presentMediaPicker(fileMode: false, editingMedia: editMediaOptions != nil, completion: { signals, silentPosting, scheduleTime in if !inputText.string.isEmpty { //strongSelf.clearInputText() @@ -4934,7 +4981,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) }, openCamera: { [weak self] cameraView, menuController in if let strongSelf = self, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer { - presentedLegacyCamera(context: strongSelf.context, peer: peer, cameraView: cameraView, menuController: menuController, parentController: strongSelf, editingMedia: editMediaOptions != nil, saveCapturedPhotos: settings.storeEditedPhotos, mediaGrouping: true, initialCaption: inputText.string, sendMessagesWithSignals: { [weak self] signals in + presentedLegacyCamera(context: strongSelf.context, peer: peer, cameraView: cameraView, menuController: menuController, parentController: strongSelf, editingMedia: editMediaOptions != nil, saveCapturedPhotos: settings.storeEditedPhotos, mediaGrouping: true, initialCaption: inputText.string, hasSchedule: !strongSelf.presentationInterfaceState.isScheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, sendMessagesWithSignals: { [weak self] signals in if let strongSelf = self { if editMediaOptions != nil { strongSelf.editMessageMediaWithLegacySignals(signals!) @@ -4949,17 +4996,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self, let (host, port, username, password, secret) = parseProxyUrl(code) { strongSelf.openResolved(ResolvedUrl.proxy(host: host, port: port, username: username, password: password, secret: secret)) } - }, presentScheduleController: { [weak self] done in + }, presentSchedulePicker: { [weak self] done in guard let strongSelf = self else { return } let mode: ChatScheduleTimeControllerMode - if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + if peer.id == strongSelf.context.account.peerId { mode = .reminders } else { mode = .scheduledMessages } - let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, completion: { [weak self] time in + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, minimalTime: strongSelf.presentationInterfaceState.slowmodeState?.timeout, completion: { [weak self] time in if let strongSelf = self { done(time) if !strongSelf.presentationInterfaceState.isScheduledMessages { @@ -4991,17 +5038,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentMultipleFilesDisabled, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - }, presentScheduleController: { [weak self] done in - guard let strongSelf = self else { + }, presentSchedulePicker: { [weak self] done in + guard let strongSelf = self, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer else { return } let mode: ChatScheduleTimeControllerMode - if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + if peer.id == strongSelf.context.account.peerId { mode = .reminders } else { mode = .scheduledMessages } - let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, completion: { [weak self] time in + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, minimalTime: strongSelf.presentationInterfaceState.slowmodeState?.timeout, completion: { [weak self] time in if let strongSelf = self { done(time) if !strongSelf.presentationInterfaceState.isScheduledMessages { @@ -5153,7 +5200,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G legacyController.bind(controller: controller) legacyController.deferScreenEdgeGestures = [.top] - configureLegacyAssetPicker(controller, context: strongSelf.context, peer: peer, initialCaption: inputText.string, presentWebSearch: { [weak self, weak legacyController] in + configureLegacyAssetPicker(controller, context: strongSelf.context, peer: peer, initialCaption: inputText.string, hasSchedule: !strongSelf.presentationInterfaceState.isScheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, presentWebSearch: { [weak self, weak legacyController] in if let strongSelf = self { let controller = WebSearchController(context: strongSelf.context, peer: peer, configuration: searchBotsConfiguration, mode: .media(completion: { results, selectionState, editingState, silentPosting in if let legacyController = legacyController { @@ -5176,17 +5223,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Chat_AttachmentLimitReached, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - }, presentScheduleController: { [weak self] done in - guard let strongSelf = self else { + }, presentSchedulePicker: { [weak self] done in + guard let strongSelf = self, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer else { return } let mode: ChatScheduleTimeControllerMode - if case let .peer(peerId) = strongSelf.presentationInterfaceState.chatLocation, peerId == strongSelf.context.account.peerId { + if peer.id == strongSelf.context.account.peerId { mode = .reminders } else { mode = .scheduledMessages } - let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, completion: { [weak self] time in + let controller = ChatScheduleTimeController(context: strongSelf.context, mode: mode, minimalTime: strongSelf.presentationInterfaceState.slowmodeState?.timeout, completion: { [weak self] time in if let strongSelf = self { done(time) if !strongSelf.presentationInterfaceState.isScheduledMessages { @@ -5245,9 +5292,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }) } - - - + private func presentMapPicker(editingMessage: Bool) { guard let peer = self.presentationInterfaceState.renderedPeer?.peer else { return @@ -5468,7 +5513,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } else { mode = .scheduledMessages } - let controller = ChatScheduleTimeController(context: self.context, mode: mode, dismissByTapOutside: false, completion: { [weak self] time in + let controller = ChatScheduleTimeController(context: self.context, mode: mode, minimalTime: self.presentationInterfaceState.slowmodeState?.timeout, dismissByTapOutside: false, completion: { [weak self] time in if let strongSelf = self { strongSelf.sendMessages(strongSelf.transformEnqueueMessages(messages, silentPosting: false, scheduleTime: time), commit: true) } @@ -5640,7 +5685,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.recorderFeedback?.prepareImpact(.light) } - self.videoRecorder.set(.single(legacyInstantVideoController(theme: self.presentationData.theme, panelFrame: currentInputPanelFrame, context: self.context, peerId: peerId, slowmodeState: self.presentationInterfaceState.slowmodeState, send: { [weak self] message in + self.videoRecorder.set(.single(legacyInstantVideoController(theme: self.presentationData.theme, panelFrame: currentInputPanelFrame, context: self.context, peerId: peerId, slowmodeState: !self.presentationInterfaceState.isScheduledMessages ? self.presentationInterfaceState.slowmodeState : nil, send: { [weak self] message in if let strongSelf = self { let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({ @@ -5662,7 +5707,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private func dismissMediaRecorder(_ action: ChatFinishMediaRecordingAction) { var updatedAction = action - if let _ = self.presentationInterfaceState.slowmodeState { + if let _ = self.presentationInterfaceState.slowmodeState, !self.presentationInterfaceState.isScheduledMessages { updatedAction = .preview } @@ -5786,7 +5831,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private func sendMediaRecording() { if let recordedMediaPreview = self.presentationInterfaceState.recordedMediaPreview { - if let _ = self.presentationInterfaceState.slowmodeState { + if let _ = self.presentationInterfaceState.slowmodeState, !self.presentationInterfaceState.isScheduledMessages { if let rect = self.chatDisplayNode.frameForInputActionButton() { self.interfaceInteraction?.displaySlowmodeTooltip(self.chatDisplayNode, rect) } @@ -7157,7 +7202,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if options.contains(.deleteLocally) { var localOptionText = self.presentationData.strings.Conversation_DeleteMessagesForMe if self.presentationInterfaceState.isScheduledMessages { - localOptionText = self.presentationData.strings.ScheduledMessages_Delete + localOptionText = messageIds.count > 1 ? self.presentationData.strings.ScheduledMessages_DeleteMany : self.presentationData.strings.ScheduledMessages_Delete } else { if options.contains(.unsendPersonal) { localOptionText = self.presentationData.strings.Chat_DeleteMessagesConfirmation(Int32(messageIds.count)) diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 9a77946636..16abf68359 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -2041,7 +2041,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { if let _ = effectivePresentationInterfaceState.interfaceState.editMessage { self.interfaceInteraction?.editMessage() } else { - if let _ = effectivePresentationInterfaceState.slowmodeState { + if let _ = effectivePresentationInterfaceState.slowmodeState, !effectivePresentationInterfaceState.isScheduledMessages && scheduleTime == nil { if let rect = self.frameForInputActionButton() { self.interfaceInteraction?.displaySlowmodeTooltip(self, rect) } diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index 733d040d61..90d36c02c4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -490,6 +490,11 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { let fixedCombinedReadStates = Atomic(value: nil) + var scheduled = false + if let subject = subject, case .scheduledMessages = subject { + scheduled = true + } + var additionalData: [AdditionalMessageHistoryViewData] = [] if case let .peer(peerId) = chatLocation { additionalData.append(.cachedPeerData(peerId)) @@ -503,13 +508,10 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { additionalData.append(.peerIsContact(peerId)) } } - additionalData.append(.totalUnreadState) - - var scheduled = false - if let subject = subject, case .scheduledMessages = subject { - scheduled = true + if !scheduled { + additionalData.append(.totalUnreadState) } - + let currentViewVersion = Atomic(value: nil) let historyViewUpdate = self.chatHistoryLocationPromise.get() diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift index ceb3afdf85..8913fed713 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift @@ -33,7 +33,7 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, account: A let directionHint: ListViewScrollToItemDirectionHint = sourceIndex > index ? .Down : .Up chatScrollPosition = .index(index: index, position: position, directionHint: directionHint, animated: animated) } - return account.viewTracker.scheduledMessagesViewForLocation(chatLocation) + return account.viewTracker.scheduledMessagesViewForLocation(chatLocation, additionalData: additionalData) |> map { view, updateType, initialData -> ChatHistoryViewUpdate in let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation) diff --git a/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift index f9bead5dd8..8d3e9efee5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift @@ -149,7 +149,7 @@ final class ChatRecordingPreviewInputPanelNode: ChatInputPanelNode { transition.updateFrame(node: self.deleteButton, frame: CGRect(origin: CGPoint(x: leftInset, y: -1.0), size: CGSize(width: 48.0, height: panelHeight))) transition.updateFrame(node: self.sendButton, frame: CGRect(origin: CGPoint(x: width - rightInset - 43.0 - UIScreenPixel, y: -UIScreenPixel), size: CGSize(width: 44.0, height: panelHeight))) - if let slowmodeState = interfaceState.slowmodeState { + if let slowmodeState = interfaceState.slowmodeState, !interfaceState.isScheduledMessages { let sendButtonRadialStatusNode: ChatSendButtonRadialStatusNode if let current = self.sendButtonRadialStatusNode { sendButtonRadialStatusNode = current diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift index 852511b40d..869dafb583 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeController.swift @@ -22,15 +22,17 @@ final class ChatScheduleTimeController: ViewController { private let context: AccountContext private let mode: ChatScheduleTimeControllerMode private let currentTime: Int32? + private let minimalTime: Int32? private let dismissByTapOutside: Bool private let completion: (Int32) -> Void private var presentationDataDisposable: Disposable? - init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32? = nil, dismissByTapOutside: Bool = true, completion: @escaping (Int32) -> Void) { + init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32? = nil, minimalTime: Int32? = nil, dismissByTapOutside: Bool = true, completion: @escaping (Int32) -> Void) { self.context = context self.mode = mode self.currentTime = currentTime + self.minimalTime = minimalTime self.dismissByTapOutside = dismissByTapOutside self.completion = completion @@ -55,7 +57,7 @@ final class ChatScheduleTimeController: ViewController { } override public func loadDisplayNode() { - self.displayNode = ChatScheduleTimeControllerNode(context: self.context, mode: self.mode, currentTime: self.currentTime, dismissByTapOutside: self.dismissByTapOutside) + self.displayNode = ChatScheduleTimeControllerNode(context: self.context, mode: self.mode, currentTime: self.currentTime, minimalTime: self.minimalTime, dismissByTapOutside: self.dismissByTapOutside) self.controllerNode.completion = { [weak self] time in self?.completion(time + 5) self?.dismiss() diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift index ee96d48d71..1102bcffc8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift @@ -15,6 +15,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel private let mode: ChatScheduleTimeControllerMode private var presentationData: PresentationData private let dismissByTapOutside: Bool + private let minimalTime: Int32? private let dimNode: ASDisplayNode private let wrappingScrollNode: ASScrollNode @@ -33,11 +34,12 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel var dismiss: (() -> Void)? var cancel: (() -> Void)? - init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32?, dismissByTapOutside: Bool) { + init(context: AccountContext, mode: ChatScheduleTimeControllerMode, currentTime: Int32?, minimalTime: Int32?, dismissByTapOutside: Bool) { self.context = context self.mode = mode self.presentationData = context.sharedContext.currentPresentationData.with { $0 } self.dismissByTapOutside = dismissByTapOutside + self.minimalTime = minimalTime self.wrappingScrollNode = ASScrollNode() self.wrappingScrollNode.view.alwaysBounceVertical = true @@ -131,6 +133,17 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.titleNode.attributedText = NSAttributedString(string: self.titleNode.attributedText?.string ?? "", font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor) self.pickerView.setValue(self.presentationData.theme.actionSheet.primaryTextColor, forKey: "textColor") + func updatePickerViewSubviews(_ subviews: [UIView]) { + for view in subviews { + if let label = view as? UILabel { + label.textColor = self.presentationData.theme.actionSheet.primaryTextColor + } else { + updatePickerViewSubviews(view.subviews) + } + } + } + updatePickerViewSubviews(self.pickerView.subviews) + self.cancelButton.setTitle(self.presentationData.strings.Common_Cancel, with: Font.regular(17.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal) self.doneButton.updateTheme(self.presentationData.theme) } @@ -152,8 +165,9 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel } if let next1MinDate = next1MinDate, let next5MinDate = next5MinDate { - self.pickerView.minimumDate = next1MinDate - if let currentTime = currentTime, Double(currentTime) > currentDate.timeIntervalSince1970 { + let minimalTime = self.minimalTime.flatMap(Double.init) ?? 0.0 + self.pickerView.minimumDate = max(next1MinDate, Date(timeIntervalSince1970: minimalTime)) + if let currentTime = currentTime, Double(currentTime) > max(currentDate.timeIntervalSince1970, minimalTime) { self.pickerView.date = Date(timeIntervalSince1970: Double(currentTime)) } else { self.pickerView.date = next5MinDate diff --git a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift index ef1a4309ec..118f25b338 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift @@ -114,10 +114,10 @@ final class ChatSearchInputPanelNode: ChatInputPanelNode { panelHeight = 45.0 } - transition.updateFrame(node: self.downButton, frame: CGRect(origin: CGPoint(x: leftInset + 12.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight))) - transition.updateFrame(node: self.upButton, frame: CGRect(origin: CGPoint(x: leftInset + 12.0 + 43.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight))) - transition.updateFrame(node: self.calendarButton, frame: CGRect(origin: CGPoint(x: width - rightInset - 60.0, y: 0.0), size: CGSize(width: 60.0, height: panelHeight))) - transition.updateFrame(node: self.membersButton, frame: CGRect(origin: CGPoint(x: width - rightInset - 60.0 * 2.0, y: 0.0), size: CGSize(width: 60.0, height: panelHeight))) + transition.updateFrame(node: self.downButton, frame: CGRect(origin: CGPoint(x: width - rightInset - 48.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight))) + transition.updateFrame(node: self.upButton, frame: CGRect(origin: CGPoint(x: width - rightInset - 48.0 - 43.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight))) + transition.updateFrame(node: self.calendarButton, frame: CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: 60.0, height: panelHeight))) + transition.updateFrame(node: self.membersButton, frame: CGRect(origin: CGPoint(x: leftInset + 43.0, y: 0.0), size: CGSize(width: 60.0, height: panelHeight))) var resultIndex: Int? var resultCount: Int? diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift index 66b9ce1c4c..9aebf3c921 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift @@ -89,7 +89,7 @@ final class ChatTextInputActionButtonsNode: ASDisplayNode { transition.updateFrame(layer: self.sendButton.layer, frame: CGRect(origin: CGPoint(), size: size)) - if let slowmodeState = interfaceState.slowmodeState, interfaceState.editMessageState == nil { + if let slowmodeState = interfaceState.slowmodeState, !interfaceState.isScheduledMessages && interfaceState.editMessageState == nil { let sendButtonRadialStatusNode: ChatSendButtonRadialStatusNode if let current = self.sendButtonRadialStatusNode { sendButtonRadialStatusNode = current diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift index 50742df05a..dafb21b260 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift @@ -654,7 +654,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } } var isSlowmodeActive = false - if interfaceState.slowmodeState != nil { + if interfaceState.slowmodeState != nil && !interfaceState.isScheduledMessages { isSlowmodeActive = true if !isEditingMedia { isMediaEnabled = false @@ -1098,7 +1098,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } } - if interfaceState.slowmodeState == nil, let contextPlaceholder = interfaceState.inputTextPanelState.contextPlaceholder { + if interfaceState.slowmodeState == nil || interfaceState.isScheduledMessages, let contextPlaceholder = interfaceState.inputTextPanelState.contextPlaceholder { let placeholderLayout = TextNode.asyncLayout(self.contextPlaceholderNode) let (placeholderSize, placeholderApply) = placeholderLayout(TextNodeLayoutArguments(attributedString: contextPlaceholder, backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: width - leftInset - rightInset - textFieldInsets.left - textFieldInsets.right - self.textInputViewInternalInsets.left - self.textInputViewInternalInsets.right - accessoryButtonsWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let contextPlaceholderNode = placeholderApply() @@ -1123,7 +1123,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { self.textPlaceholderNode.alpha = 1.0 } - if let slowmodeState = interfaceState.slowmodeState { + if let slowmodeState = interfaceState.slowmodeState, !interfaceState.isScheduledMessages { let slowmodePlaceholderNode: ChatTextInputSlowmodePlaceholderNode if let current = self.slowmodePlaceholderNode { slowmodePlaceholderNode = current @@ -1146,7 +1146,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { inputHasText = true } - if (interfaceState.slowmodeState != nil && interfaceState.editMessageState == nil) || interfaceState.inputTextPanelState.contextPlaceholder != nil { + if (interfaceState.slowmodeState != nil && !interfaceState.isScheduledMessages && interfaceState.editMessageState == nil) || interfaceState.inputTextPanelState.contextPlaceholder != nil { self.textPlaceholderNode.isHidden = true self.slowmodePlaceholderNode?.isHidden = inputHasText } else { @@ -1237,7 +1237,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } if let interfaceState = self.presentationInterfaceState { - if (interfaceState.slowmodeState != nil && interfaceState.editMessageState == nil) || interfaceState.inputTextPanelState.contextPlaceholder != nil { + if (interfaceState.slowmodeState != nil && !interfaceState.isScheduledMessages && interfaceState.editMessageState == nil) || interfaceState.inputTextPanelState.contextPlaceholder != nil { self.textPlaceholderNode.isHidden = true self.slowmodePlaceholderNode?.isHidden = inputHasText } else { diff --git a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift index 9becf57ef4..d8a5455a8b 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift @@ -10,7 +10,7 @@ import ShareController import LegacyUI import LegacyMediaPickerUI -func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, sendMessagesWithSignals: @escaping ([Any]?) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentScheduleController: @escaping (@escaping (Int32) -> Void) -> Void) { +func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, hasSchedule: Bool, sendMessagesWithSignals: @escaping ([Any]?) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme) legacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .portrait, compactSize: .portrait) @@ -61,11 +61,11 @@ func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAt controller.recipientName = peer.displayTitle if peer.id != context.account.peerId { if peer is TelegramUser { - controller.hasTimer = true + controller.hasTimer = !hasSchedule } controller.hasSilentPosting = !isSecretChat } - controller.hasSchedule = !isSecretChat + controller.hasSchedule = hasSchedule let screenSize = parentController.view.bounds.size var startFrame = CGRect(x: 0, y: screenSize.height, width: screenSize.width, height: screenSize.height) From 6784f1bc02fe03b35a3feac5833c2738dd6d2744 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 27 Aug 2019 18:36:11 +0400 Subject: [PATCH 34/86] Reaction list --- .../contents.xcworkspacedata | 3 + .../Sources/CreatePollController.swift | 1 + .../Display/ContainableController.swift | 3 + .../Display/NavigationController.swift | 37 +- .../Display/Display/PresentationContext.swift | 105 +++- .../Display/Display/StatusBarHost.swift | 4 +- .../Display/Display/StatusBarManager.swift | 31 +- .../Display/Display/ViewController.swift | 30 +- .../Display/Display/WindowContent.swift | 160 ++++- .../Sources/ItemListController.swift | 3 + submodules/MessageReactionListUI/Info.plist | 22 + .../project.pbxproj | 571 ++++++++++++++++++ .../Sources/MessageReactionCategoryNode.swift | 103 ++++ .../MessageReactionListController.swift | 418 +++++++++++++ .../Sources/MessageReactionListUI.h | 19 + .../TelegramCore/MessageReactionList.swift | 216 +++++++ .../project.pbxproj | 6 + .../TelegramUI/TelegramUI/AppDelegate.swift | 15 +- .../TelegramUI/ChatController.swift | 267 ++++---- .../ChatControllerInteraction.swift | 5 +- .../TelegramUI/ChatControllerNode.swift | 12 + .../ChatInterfaceStateNavigationButtons.swift | 11 +- .../ChatMessageDateAndStatusNode.swift | 42 +- .../ChatMessageTextBubbleContentNode.swift | 7 + .../ChatRecentActionsControllerNode.swift | 1 + .../OverlayPlayerControllerNode.swift | 1 + .../PeerMediaCollectionController.swift | 1 + .../project.pbxproj | 4 + 28 files changed, 1901 insertions(+), 197 deletions(-) create mode 100644 submodules/MessageReactionListUI/Info.plist create mode 100644 submodules/MessageReactionListUI/MessageReactionListUI_Xcode.xcodeproj/project.pbxproj create mode 100644 submodules/MessageReactionListUI/Sources/MessageReactionCategoryNode.swift create mode 100644 submodules/MessageReactionListUI/Sources/MessageReactionListController.swift create mode 100644 submodules/MessageReactionListUI/Sources/MessageReactionListUI.h create mode 100644 submodules/TelegramCore/TelegramCore/MessageReactionList.swift diff --git a/Telegram-iOS.xcworkspace/contents.xcworkspacedata b/Telegram-iOS.xcworkspace/contents.xcworkspacedata index b294c9cb24..176a24b7fc 100644 --- a/Telegram-iOS.xcworkspace/contents.xcworkspacedata +++ b/Telegram-iOS.xcworkspace/contents.xcworkspacedata @@ -551,6 +551,9 @@ + + { get } + var updateTransitionWhenPresentedAsModal: ((CGFloat, ContainedViewLayoutTransition) -> Void)? { get set } func combinedSupportedOrientations(currentOrientationToLock: UIInterfaceOrientationMask) -> ViewControllerSupportedOrientations var deferScreenEdgeGestures: UIRectEdge { get } func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) func updateToInterfaceOrientation(_ orientation: UIInterfaceOrientation) + func updateModalTransition(_ value: CGFloat, transition: ContainedViewLayoutTransition) func viewWillAppear(_ animated: Bool) func viewWillDisappear(_ animated: Bool) diff --git a/submodules/Display/Display/NavigationController.swift b/submodules/Display/Display/NavigationController.swift index e5245c5089..92ec8f82e5 100644 --- a/submodules/Display/Display/NavigationController.swift +++ b/submodules/Display/Display/NavigationController.swift @@ -124,6 +124,8 @@ public enum MasterDetailLayoutBlackout : Equatable { open class NavigationController: UINavigationController, ContainableController, UIGestureRecognizerDelegate { public var isOpaqueWhenInOverlay: Bool = true public var blocksBackgroundWhenInOverlay: Bool = true + public var isModalWhenInOverlay: Bool = false + public var updateTransitionWhenPresentedAsModal: ((CGFloat, ContainedViewLayoutTransition) -> Void)? private let _ready = Promise(true) open var ready: Promise { @@ -551,7 +553,7 @@ open class NavigationController: UINavigationController, ContainableController, self.controllerView.containerView.addSubview(record.controller.view) record.controller.setIgnoreAppearanceMethodInvocations(false) - if let _ = previousControllers.index(where: { $0.controller === record.controller }) { + if let _ = previousControllers.firstIndex(where: { $0.controller === record.controller }) { //previousControllers[index].transition = .appearance let navigationTransitionCoordinator = NavigationTransitionCoordinator(transition: .Pop, container: self.controllerView.containerView, topView: previousController.view, topNavigationBar: (previousController as? ViewController)?.navigationBar, bottomView: record.controller.view, bottomNavigationBar: (record.controller as? ViewController)?.navigationBar) self.navigationTransitionCoordinator = navigationTransitionCoordinator @@ -571,7 +573,7 @@ open class NavigationController: UINavigationController, ContainableController, } }) } else { - if let index = self._viewControllers.index(where: { $0.controller === previousController }) { + if let index = self._viewControllers.firstIndex(where: { $0.controller === previousController }) { self._viewControllers[index].transition = .appearance } let navigationTransitionCoordinator = NavigationTransitionCoordinator(transition: .Push, container: self.controllerView.containerView, topView: record.controller.view, topNavigationBar: (record.controller as? ViewController)?.navigationBar, bottomView: previousController.view, bottomNavigationBar: (previousController as? ViewController)?.navigationBar) @@ -580,7 +582,7 @@ open class NavigationController: UINavigationController, ContainableController, self.controllerView.inTransition = true navigationTransitionCoordinator.animateCompletion(0.0, completion: { [weak self] in if let strongSelf = self { - if let index = strongSelf._viewControllers.index(where: { $0.controller === previousController }) { + if let index = strongSelf._viewControllers.firstIndex(where: { $0.controller === previousController }) { strongSelf._viewControllers[index].transition = .none } strongSelf.navigationTransitionCoordinator = nil @@ -713,7 +715,7 @@ open class NavigationController: UINavigationController, ContainableController, self.loadView() } self.validLayout = layout - transition.updateFrame(view: self.view, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) + //transition.updateFrame(view: self.view, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) self.updateControllerLayouts(previousControllers: self._viewControllers, layout: layout, transition: transition) @@ -732,6 +734,33 @@ open class NavigationController: UINavigationController, ContainableController, } } + private var modalTransition: CGFloat = 0.0 + + public func updateModalTransition(_ value: CGFloat, transition: ContainedViewLayoutTransition) { + if self.modalTransition == value { + return + } + let scale = (self.view.bounds.width - 20.0 * 2.0) / self.view.bounds.width + let cornerRadius = value * 10.0 / scale + switch transition { + case let .animated(duration, curve): + let previous = self.displayNode.layer.cornerRadius + self.displayNode.layer.cornerRadius = cornerRadius + if !cornerRadius.isZero { + self.displayNode.clipsToBounds = true + } + self.displayNode.layer.animate(from: previous as NSNumber, to: cornerRadius as NSNumber, keyPath: "cornerRadius", timingFunction: curve.timingFunction, duration: duration, completion: { [weak self] _ in + if cornerRadius.isZero { + self?.displayNode.clipsToBounds = false + } + }) + case .immediate: + self.displayNode.layer.cornerRadius = cornerRadius + self.displayNode.clipsToBounds = !cornerRadius.isZero + } + self.modalTransition = value + } + public func updateToInterfaceOrientation(_ orientation: UIInterfaceOrientation) { for record in self._viewControllers { if let controller = record.controller as? ContainableController { diff --git a/submodules/Display/Display/PresentationContext.swift b/submodules/Display/Display/PresentationContext.swift index 6421425520..3f81254d34 100644 --- a/submodules/Display/Display/PresentationContext.swift +++ b/submodules/Display/Display/PresentationContext.swift @@ -34,9 +34,8 @@ public final class PresentationContext { } } - weak var volumeControlStatusBarNodeView: UIView? - var updateIsInteractionBlocked: ((Bool) -> Void)? + var updateHasBlocked: ((Bool) -> Void)? var updateHasOpaqueOverlay: ((Bool) -> Void)? private(set) var hasOpaqueOverlay: Bool = false { @@ -47,6 +46,9 @@ public final class PresentationContext { } } + private var modalPresentationValue: CGFloat = 0.0 + var updateModalTransition: ((CGFloat, ContainedViewLayoutTransition) -> Void)? + private var layout: ContainerViewLayout? private var ready: Bool { @@ -120,6 +122,18 @@ public final class PresentationContext { } } + private func layoutForController(containerLayout: ContainerViewLayout, controller: ContainableController) -> (ContainerViewLayout, CGRect) { + if controller.isModalWhenInOverlay { + let topInset = (containerLayout.statusBarHeight ?? 0.0) + 20.0 + var updatedLayout = containerLayout + updatedLayout.statusBarHeight = nil + updatedLayout.size.height -= topInset + return (updatedLayout, CGRect(origin: CGPoint(x: 0.0, y: topInset), size: updatedLayout.size)) + } else { + return (containerLayout, CGRect(origin: CGPoint(), size: containerLayout.size)) + } + } + public func present(_ controller: ContainableController, on level: PresentationSurfaceLevel, blockInteraction: Bool = false, completion: @escaping () -> Void) { let controllerReady = controller.ready.get() |> filter({ $0 }) @@ -140,8 +154,9 @@ public final class PresentationContext { controller.supportedOrientations = ViewControllerSupportedOrientations(regularSize: orientations, compactSize: orientations) } } - controller.view.frame = CGRect(origin: CGPoint(), size: initialLayout.size) - controller.containerLayoutUpdated(initialLayout, transition: .immediate) + let (controllerLayout, controllerFrame) = self.layoutForController(containerLayout: initialLayout, controller: controller) + controller.view.frame = controllerFrame + controller.containerLayoutUpdated(controllerLayout, transition: .immediate) var blockInteractionToken: Int? if blockInteraction { blockInteractionToken = self.addBlockInteraction() @@ -170,37 +185,32 @@ public final class PresentationContext { } strongSelf.controllers.insert((controller, level), at: insertIndex ?? strongSelf.controllers.count) if let view = strongSelf.view, let layout = strongSelf.layout { + let (updatedControllerLayout, updatedControllerFrame) = strongSelf.layoutForController(containerLayout: layout, controller: controller) + (controller as? UIViewController)?.navigation_setDismiss({ [weak controller] in if let strongSelf = self, let controller = controller { strongSelf.dismiss(controller) } }, rootController: nil) (controller as? UIViewController)?.setIgnoreAppearanceMethodInvocations(true) - if layout != initialLayout { - controller.view.frame = CGRect(origin: CGPoint(), size: layout.size) + if updatedControllerLayout != controllerLayout { + controller.view.frame = updatedControllerFrame if let topLevelSubview = strongSelf.topLevelSubview(for: level) { view.insertSubview(controller.view, belowSubview: topLevelSubview) } else { - if let volumeControlStatusBarNodeView = strongSelf.volumeControlStatusBarNodeView { - view.insertSubview(controller.view, belowSubview: volumeControlStatusBarNodeView) - } else { - view.addSubview(controller.view) - } + view.addSubview(controller.view) } - controller.containerLayoutUpdated(layout, transition: .immediate) + controller.containerLayoutUpdated(updatedControllerLayout, transition: .immediate) } else { if let topLevelSubview = strongSelf.topLevelSubview(for: level) { view.insertSubview(controller.view, belowSubview: topLevelSubview) } else { - if let volumeControlStatusBarNodeView = strongSelf.volumeControlStatusBarNodeView { - view.insertSubview(controller.view, belowSubview: volumeControlStatusBarNodeView) - } else { - view.addSubview(controller.view) - } + view.addSubview(controller.view) } } (controller as? UIViewController)?.setIgnoreAppearanceMethodInvocations(false) view.layer.invalidateUpTheTree() + strongSelf.updateViews() controller.viewWillAppear(false) if let controller = controller as? PresentableController { controller.viewDidAppear(completion: { [weak self] in @@ -211,7 +221,6 @@ public final class PresentationContext { strongSelf.notifyAccessibilityScreenChanged() } } - strongSelf.updateViews() } })) } else { @@ -225,7 +234,7 @@ public final class PresentationContext { } private func dismiss(_ controller: ContainableController) { - if let index = self.controllers.index(where: { $0.0 === controller }) { + if let index = self.controllers.firstIndex(where: { $0.0 === controller }) { self.controllers.remove(at: index) controller.viewWillDisappear(false) controller.view.removeFromSuperview() @@ -242,7 +251,9 @@ public final class PresentationContext { self.readyChanged(wasReady: wasReady) } else if self.ready { for (controller, _) in self.controllers { - controller.containerLayoutUpdated(layout, transition: transition) + let (controllerLayout, controllerFrame) = self.layoutForController(containerLayout: layout, controller: controller) + controller.view.frame = controllerFrame + controller.containerLayoutUpdated(controllerLayout, transition: transition) } } } @@ -262,14 +273,11 @@ public final class PresentationContext { if let topLevelSubview = self.topLevelSubview { view.insertSubview(controller.view, belowSubview: topLevelSubview) } else { - if let volumeControlStatusBarNodeView = self.volumeControlStatusBarNodeView { - view.insertSubview(controller.view, belowSubview: volumeControlStatusBarNodeView) - } else { - view.addSubview(controller.view) - } + view.addSubview(controller.view) } - controller.view.frame = CGRect(origin: CGPoint(), size: layout.size) - controller.containerLayoutUpdated(layout, transition: .immediate) + let (controllerLayout, controllerFrame) = self.layoutForController(containerLayout: layout, controller: controller) + controller.view.frame = controllerFrame + controller.containerLayoutUpdated(controllerLayout, transition: .immediate) if let controller = controller as? PresentableController { controller.viewDidAppear(completion: { [weak self] in self?.notifyAccessibilityScreenChanged() @@ -291,10 +299,18 @@ public final class PresentationContext { } } + private weak var currentModalController: ContainableController? + private func updateViews() { self.hasOpaqueOverlay = self.currentlyBlocksBackgroundWhenInOverlay + var modalController: ContainableController? var topHasOpaque = false for (controller, _) in self.controllers.reversed() { + if controller.isModalWhenInOverlay { + if modalController == nil { + modalController = controller + } + } if topHasOpaque { controller.displayNode.accessibilityElementsHidden = true } else { @@ -304,16 +320,47 @@ public final class PresentationContext { controller.displayNode.accessibilityElementsHidden = false } } + + if self.currentModalController !== modalController { + if let currentModalController = self.currentModalController { + currentModalController.updateTransitionWhenPresentedAsModal = nil + if #available(iOSApplicationExtension 11.0, *) { + currentModalController.displayNode.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner] + } + currentModalController.displayNode.layer.cornerRadius = 0.0 + } + self.currentModalController = modalController + if let modalController = modalController { + if #available(iOSApplicationExtension 11.0, *) { + modalController.displayNode.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + } + modalController.displayNode.layer.cornerRadius = 10.0 + modalController.updateTransitionWhenPresentedAsModal = { [weak self, weak modalController] value, transition in + guard let strongSelf = self, let modalController = modalController, modalController === strongSelf.currentModalController else { + return + } + if strongSelf.modalPresentationValue != value { + strongSelf.modalPresentationValue = value + strongSelf.updateModalTransition?(value, transition) + } + } + } else { + if self.modalPresentationValue != 0.0 { + self.modalPresentationValue = 0.0 + self.updateModalTransition?(0.0, .animated(duration: 0.3, curve: .spring)) + } + } + } } private func notifyAccessibilityScreenChanged() { UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: nil) } - func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + func hitTest(view: UIView, point: CGPoint, with event: UIEvent?) -> UIView? { for (controller, _) in self.controllers.reversed() { if controller.isViewLoaded { - if let result = controller.view.hitTest(point, with: event) { + if let result = controller.view.hitTest(view.convert(point, to: controller.view), with: event) { return result } } diff --git a/submodules/Display/Display/StatusBarHost.swift b/submodules/Display/Display/StatusBarHost.swift index 35a7299d4e..a6653246e3 100644 --- a/submodules/Display/Display/StatusBarHost.swift +++ b/submodules/Display/Display/StatusBarHost.swift @@ -3,7 +3,7 @@ import SwiftSignalKit public protocol StatusBarHost { var statusBarFrame: CGRect { get } - var statusBarStyle: UIStatusBarStyle { get set } + var statusBarStyle: UIStatusBarStyle { get } var statusBarWindow: UIView? { get } var statusBarView: UIView? { get } @@ -11,4 +11,6 @@ public protocol StatusBarHost { var keyboardView: UIView? { get } var handleVolumeControl: Signal { get } + + func setStatusBarStyle(_ style: UIStatusBarStyle, animated: Bool) } diff --git a/submodules/Display/Display/StatusBarManager.swift b/submodules/Display/Display/StatusBarManager.swift index b051951bfd..1bcb1efe08 100644 --- a/submodules/Display/Display/StatusBarManager.swift +++ b/submodules/Display/Display/StatusBarManager.swift @@ -76,7 +76,7 @@ class StatusBarManager { private let volumeControlStatusBarNode: VolumeControlStatusBarNode private var surfaces: [StatusBarSurface] = [] - private var validParams: (withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool)? + private var validParams: (withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, UIStatusBarStyle?)? var inCallNavigate: (() -> Void)? @@ -111,8 +111,8 @@ class StatusBarManager { self?.volumeControlStatusBarNode.allowsGroupOpacity = false }) } - if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows) = self.validParams { - self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) + if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows, forceAppearance) = self.validParams { + self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, forceAppearance: forceAppearance, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) } } @@ -126,24 +126,24 @@ class StatusBarManager { } }) self.volumeTimer = nil - if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows) = self.validParams { - self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) + if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows, forceAppearance) = self.validParams { + self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, forceAppearance: forceAppearance, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) } } - func updateState(surfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, animated: Bool) { + func updateState(surfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, forceAppearance: UIStatusBarStyle?, animated: Bool) { let previousSurfaces = self.surfaces self.surfaces = surfaces - self.updateSurfaces(previousSurfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: animated, alphaTransition: .immediate) + self.updateSurfaces(previousSurfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: animated, forceAppearance: forceAppearance, alphaTransition: .immediate) } - private func updateSurfaces(_ previousSurfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, animated: Bool, alphaTransition: ContainedViewLayoutTransition) { + private func updateSurfaces(_ previousSurfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, animated: Bool, forceAppearance: UIStatusBarStyle?, alphaTransition: ContainedViewLayoutTransition) { let statusBarFrame = self.host.statusBarFrame guard let statusBarView = self.host.statusBarView else { return } - self.validParams = (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows) + self.validParams = (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows, forceAppearance) if self.host.statusBarWindow?.isUserInteractionEnabled != (forceInCallStatusBarText == nil) { self.host.statusBarWindow?.isUserInteractionEnabled = (forceInCallStatusBarText == nil) @@ -278,6 +278,17 @@ class StatusBarManager { } self.volumeControlStatusBarNode.isDark = isDark + if let forceAppearance = forceAppearance { + let style: StatusBarStyle + switch forceAppearance { + case .lightContent: + style = .White + default: + style = .Black + } + globalStatusBar = (style, 1.0, 0.0) + } + if let globalStatusBar = globalStatusBar, !forceHiddenBySystemWindows { let statusBarStyle: UIStatusBarStyle if forceInCallStatusBarText != nil { @@ -286,7 +297,7 @@ class StatusBarManager { statusBarStyle = globalStatusBar.0 == .Black ? .default : .lightContent } if self.host.statusBarStyle != statusBarStyle { - self.host.statusBarStyle = statusBarStyle + self.host.setStatusBarStyle(statusBarStyle, animated: animated) } if let statusBarWindow = self.host.statusBarWindow { alphaTransition.updateAlpha(layer: statusBarView.layer, alpha: globalStatusBar.1) diff --git a/submodules/Display/Display/ViewController.swift b/submodules/Display/Display/ViewController.swift index 3d7dc74efb..f2a54e65a8 100644 --- a/submodules/Display/Display/ViewController.swift +++ b/submodules/Display/Display/ViewController.swift @@ -88,6 +88,14 @@ open class ViewControllerPresentationArguments { public final var isOpaqueWhenInOverlay: Bool = false public final var blocksBackgroundWhenInOverlay: Bool = false public final var automaticallyControlPresentationContextLayout: Bool = true + public final var isModalWhenInOverlay: Bool = false { + didSet { + if self.isNodeLoaded { + self.displayNode.clipsToBounds = true + } + } + } + public var updateTransitionWhenPresentedAsModal: ((CGFloat, ContainedViewLayoutTransition) -> Void)? public func combinedSupportedOrientations(currentOrientationToLock: UIInterfaceOrientationMask) -> ViewControllerSupportedOrientations { return self.supportedOrientations @@ -190,7 +198,7 @@ open class ViewControllerPresentationArguments { open var visualNavigationInsetHeight: CGFloat { if let navigationBar = self.navigationBar { - var height = navigationBar.frame.maxY + let height = navigationBar.frame.maxY if let contentNode = navigationBar.contentNode, case .expansion = contentNode.mode { //height += contentNode.height } @@ -233,7 +241,7 @@ open class ViewControllerPresentationArguments { private func updateScrollToTopView() { if self.scrollToTop != nil { if let displayNode = self._displayNode , self.scrollToTopView == nil { - let scrollToTopView = ScrollToTopView(frame: CGRect(x: 0.0, y: -1.0, width: displayNode.frame.size.width, height: 1.0)) + let scrollToTopView = ScrollToTopView(frame: CGRect(x: 0.0, y: -1.0, width: displayNode.bounds.size.width, height: 1.0)) scrollToTopView.action = { [weak self] in if let scrollToTop = self?.scrollToTop { scrollToTop() @@ -293,16 +301,16 @@ open class ViewControllerPresentationArguments { private func updateNavigationBarLayout(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { let statusBarHeight: CGFloat = layout.statusBarHeight ?? 0.0 - let navigationBarHeight: CGFloat = max(20.0, statusBarHeight) + (self.navigationBar?.contentHeight ?? 44.0) + let navigationBarHeight: CGFloat = statusBarHeight + (self.navigationBar?.contentHeight ?? 44.0) let navigationBarOffset: CGFloat if statusBarHeight.isZero { - navigationBarOffset = -20.0 + navigationBarOffset = 0.0 } else { navigationBarOffset = 0.0 } var navigationBarFrame = CGRect(origin: CGPoint(x: 0.0, y: navigationBarOffset), size: CGSize(width: layout.size.width, height: navigationBarHeight)) if layout.statusBarHeight == nil { - navigationBarFrame.size.height = (self.navigationBar?.contentHeight ?? 44.0) + 20.0 + //navigationBarFrame.size.height = (self.navigationBar?.contentHeight ?? 44.0) + 20.0 } if !self.displayNavigationBar { @@ -332,7 +340,7 @@ open class ViewControllerPresentationArguments { if !self.isViewLoaded { self.loadView() } - transition.updateFrame(node: self.displayNode, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) + //transition.updateFrame(node: self.displayNode, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) if let _ = layout.statusBarHeight { self.statusBar.frame = CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: 40.0)) } @@ -348,6 +356,10 @@ open class ViewControllerPresentationArguments { } } + open func updateModalTransition(_ value: CGFloat, transition: ContainedViewLayoutTransition) { + + } + open func navigationStackConfigurationUpdated(next: [ViewController]) { } @@ -377,6 +389,10 @@ open class ViewControllerPresentationArguments { self.blocksBackgroundWhenInOverlay = true self.isOpaqueWhenInOverlay = true } + + if self.isModalWhenInOverlay { + self.displayNode.clipsToBounds = true + } } public func requestLayout(transition: ContainedViewLayoutTransition) { @@ -580,7 +596,7 @@ private func traceViewVisibility(view: UIView, rect: CGRect) -> Bool { if view.window == nil { return false } - if let index = siblings.index(where: { $0 === view.layer }) { + if let index = siblings.firstIndex(where: { $0 === view.layer }) { let viewFrame = view.convert(rect, to: superview) for i in (index + 1) ..< siblings.count { if siblings[i].frame.contains(viewFrame) { diff --git a/submodules/Display/Display/WindowContent.swift b/submodules/Display/Display/WindowContent.swift index 181fd6f4ca..cf0342181e 100644 --- a/submodules/Display/Display/WindowContent.swift +++ b/submodules/Display/Display/WindowContent.swift @@ -344,10 +344,6 @@ public class Window1 { private var isInteractionBlocked = false - /*private var accessibilityElements: [Any]? { - return self.viewController?.view.accessibilityElements - }*/ - public init(hostView: WindowHostView, statusBarHost: StatusBarHost?) { self.hostView = hostView @@ -377,6 +373,8 @@ public class Window1 { self.presentationContext = PresentationContext() self.overlayPresentationContext = GlobalOverlayPresentationContext(statusBarHost: statusBarHost, parentView: self.hostView.aboveStatusBarView) + self.presentationContextContainerView = UIView() + self.presentationContext.updateIsInteractionBlocked = { [weak self] value in self?.isInteractionBlocked = value } @@ -385,6 +383,10 @@ public class Window1 { self?._rootController?.displayNode.accessibilityElementsHidden = value } + self.presentationContext.updateModalTransition = { [weak self] value, transition in + self?.updateModalTransition(value, transition: transition) + } + self.hostView.present = { [weak self] controller, level, blockInteraction, completion in self?.present(controller, on: level, blockInteraction: blockInteraction, completion: completion) } @@ -440,12 +442,7 @@ public class Window1 { }) } - /*self.hostView.getAccessibilityElements = { [weak self] in - return self?.accessibilityElements - }*/ - - self.presentationContext.view = self.hostView.containerView - self.presentationContext.volumeControlStatusBarNodeView = self.volumeControlStatusBarNode.view + self.presentationContext.view = self.presentationContextContainerView self.presentationContext.containerLayoutUpdated(containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation), transition: .immediate) self.overlayPresentationContext.containerLayoutUpdated(containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation), transition: .immediate) @@ -567,6 +564,8 @@ public class Window1 { self.windowPanRecognizer = recognizer self.hostView.containerView.addGestureRecognizer(recognizer) + self.hostView.containerView.addSubview(self.presentationContextContainerView) + self.hostView.containerView.addSubview(self.volumeControlStatusBar) self.hostView.containerView.addSubview(self.volumeControlStatusBarNode.view) } @@ -668,7 +667,7 @@ public class Window1 { } } - if let result = self.presentationContext.hitTest(point, with: event) { + if let result = self.presentationContext.hitTest(view: self.hostView.containerView, point: point, with: event) { return result } return self.viewController?.view.hitTest(point, with: event) @@ -697,7 +696,19 @@ public class Window1 { if let rootController = self._rootController { if !self.windowLayout.size.width.isZero && !self.windowLayout.size.height.isZero { - rootController.containerLayoutUpdated(containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation), transition: .immediate) + let rootLayout = containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation) + var positionOffset: CGFloat = 0.0 + if !self.appliedModalLevel.isZero { + let scale = ((rootLayout.size.width - 20.0 * 2.0) / rootLayout.size.width) + rootController.displayNode.transform = CATransform3DMakeScale(scale, scale, 1.0) + let transformedUpperBound = (self.windowLayout.size.height - rootLayout.size.height * scale) / 2.0 + let targetBound = (self.windowLayout.statusBarHeight ?? 0.0) + 20.0 - 10.0 + positionOffset = targetBound - transformedUpperBound + } + rootController.displayNode.position = CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0 + positionOffset) + rootController.displayNode.bounds = CGRect(origin: CGPoint(), size: rootLayout.size) + rootController.containerLayoutUpdated(rootLayout, transition: .immediate) + rootController.updateModalTransition(self.appliedModalLevel, transition: .immediate) } self.hostView.containerView.insertSubview(rootController.view, at: 0) @@ -707,6 +718,26 @@ public class Window1 { } } + private func insertContentViewAtTop(_ view: UIView) { + if let dimView = self.dimView { + self.hostView.containerView.insertSubview(view, belowSubview: dimView) + } else { + self.hostView.containerView.insertSubview(view, belowSubview: self.presentationContextContainerView) + } + } + + private func insertCoveringView(_ view: UIView) { + self.hostView.containerView.insertSubview(view, belowSubview: self.volumeControlStatusBarNode.view) + } + + private func insertDimView(_ view: UIView) { + if let coveringView = self.coveringView { + self.hostView.containerView.insertSubview(view, belowSubview: coveringView) + } else { + self.hostView.containerView.insertSubview(view, belowSubview: self.presentationContextContainerView) + } + } + private var _topLevelOverlayControllers: [ContainableController] = [] public var topLevelOverlayControllers: [ContainableController] { get { @@ -721,18 +752,17 @@ public class Window1 { let layout = containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation) for controller in self._topLevelOverlayControllers { controller.containerLayoutUpdated(layout, transition: .immediate) - - if let coveringView = self.coveringView { - self.hostView.containerView.insertSubview(controller.view, belowSubview: coveringView) - } else { - self.hostView.containerView.insertSubview(controller.view, belowSubview: self.volumeControlStatusBarNode.view) - } + self.insertContentViewAtTop(controller.view) } self.presentationContext.topLevelSubview = self._topLevelOverlayControllers.first?.view } } + private var dimView: UIView? = nil + + private let presentationContextContainerView: UIView + public var coveringView: WindowCoveringView? { didSet { if self.coveringView !== oldValue { @@ -746,7 +776,7 @@ public class Window1 { coveringView.layer.removeAnimation(forKey: "opacity") coveringView.layer.allowsGroupOpacity = false coveringView.alpha = 1.0 - self.hostView.containerView.insertSubview(coveringView, belowSubview: self.volumeControlStatusBarNode.view) + self.insertCoveringView(coveringView) if !self.windowLayout.size.width.isZero { coveringView.frame = CGRect(origin: CGPoint(), size: self.windowLayout.size) coveringView.updateLayout(self.windowLayout.size) @@ -756,6 +786,8 @@ public class Window1 { } } + private var appliedModalLevel: CGFloat = 0.0 + private func layoutSubviews() { var hasPreview = false var updatedHasPreview = false @@ -771,11 +803,19 @@ public class Window1 { updatedHasPreview = true } - if self.tracingStatusBarsInvalidated || updatedHasPreview, let statusBarManager = statusBarManager, let keyboardManager = keyboardManager { + var modalLevelUpdated = false + if self.appliedModalLevel != self.modalTransition { + modalLevelUpdated = self.appliedModalLevel.isZero != self.modalTransition.isZero + self.appliedModalLevel = self.modalTransition + } + + if self.tracingStatusBarsInvalidated || updatedHasPreview || modalLevelUpdated, let statusBarManager = statusBarManager, let keyboardManager = keyboardManager { self.tracingStatusBarsInvalidated = false if self.statusBarHidden { - statusBarManager.updateState(surfaces: [], withSafeInsets: false, forceInCallStatusBarText: nil, forceHiddenBySystemWindows: false, animated: false) + statusBarManager.updateState(surfaces: [], withSafeInsets: false, forceInCallStatusBarText: nil, forceHiddenBySystemWindows: false, forceAppearance: nil, animated: false) + } else if !self.modalTransition.isZero || self.isInTransitionOutOfModal { + statusBarManager.updateState(surfaces: [], withSafeInsets: false, forceInCallStatusBarText: nil, forceHiddenBySystemWindows: false, forceAppearance: self.isInTransitionOutOfModal ? .default : .lightContent, animated: modalLevelUpdated) } else { var statusBarSurfaces: [StatusBarSurface] = [] for layers in self.hostView.containerView.layer.traceableLayerSurfaces(withTag: WindowTracingTags.statusBar) { @@ -796,7 +836,7 @@ public class Window1 { } } self.cachedWindowSubviewCount = self.hostView.containerView.window?.subviews.count ?? 0 - statusBarManager.updateState(surfaces: statusBarSurfaces, withSafeInsets: !self.windowLayout.safeInsets.top.isZero, forceInCallStatusBarText: self.forceInCallStatusBarText, forceHiddenBySystemWindows: hasPreview, animated: animatedUpdate) + statusBarManager.updateState(surfaces: statusBarSurfaces, withSafeInsets: !self.windowLayout.safeInsets.top.isZero, forceInCallStatusBarText: self.forceInCallStatusBarText, forceHiddenBySystemWindows: hasPreview, forceAppearance: nil, animated: animatedUpdate || modalLevelUpdated) } var keyboardSurfaces: [KeyboardSurface] = [] @@ -969,13 +1009,31 @@ public class Window1 { let childLayoutUpdated = self.updatedContainerLayout != childLayout self.updatedContainerLayout = childLayout + updatingLayout.transition.updateFrame(view: self.presentationContextContainerView, frame: CGRect(origin: CGPoint(), size: self.windowLayout.size)) + if let dimView = self.dimView { + updatingLayout.transition.updateFrame(view: dimView, frame: CGRect(origin: CGPoint(), size: self.windowLayout.size)) + } + if childLayoutUpdated { var rootLayout = childLayout let rootTransition = updatingLayout.transition if self.presentationContext.isCurrentlyOpaque { rootLayout.inputHeight = nil } - self._rootController?.containerLayoutUpdated(rootLayout, transition: rootTransition) + var positionOffset: CGFloat = 0.0 + if let rootController = self._rootController { + if !self.modalTransition.isZero { + let scale = (rootLayout.size.width - 20.0 * 2.0) / rootLayout.size.width + rootTransition.updateTransformScale(node: rootController.displayNode, scale: scale) + + let transformedUpperBound = (self.windowLayout.size.height - rootLayout.size.height * scale) / 2.0 + let targetBound = (self.windowLayout.statusBarHeight ?? 0.0) + 20.0 - 10.0 + positionOffset = targetBound - transformedUpperBound + } + rootTransition.updatePosition(node: rootController.displayNode, position: CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0 + positionOffset)) + rootTransition.updateBounds(node: rootController.displayNode, bounds: CGRect(origin: CGPoint(), size: rootLayout.size)) + rootController.containerLayoutUpdated(rootLayout, transition: rootTransition) + } self.presentationContext.containerLayoutUpdated(childLayout, transition: updatingLayout.transition) self.overlayPresentationContext.containerLayoutUpdated(childLayout, transition: updatingLayout.transition) @@ -1008,6 +1066,62 @@ public class Window1 { } } + private var modalTransition: CGFloat = 0.0 + private var defaultBackgroundColor: UIColor? + private var isInTransitionOutOfModal: Bool = false + + private func updateModalTransition(_ value: CGFloat, transition: ContainedViewLayoutTransition) { + self.modalTransition = value + if !value.isZero { + if self.dimView == nil { + let dimView = UIView() + dimView.frame = CGRect(origin: CGPoint(), size: self.windowLayout.size) + dimView.backgroundColor = UIColor(white: 0.0, alpha: 0.5) + self.dimView = dimView + self.insertDimView(dimView) + dimView.alpha = 0.0 + transition.updateAlpha(layer: dimView.layer, alpha: 1.0) + + self.defaultBackgroundColor = self.hostView.containerView.backgroundColor + self.hostView.containerView.backgroundColor = .black + + var positionOffset: CGFloat = 0.0 + if let rootController = self._rootController { + let rootSize = rootController.displayNode.bounds.size + let scale = (rootSize.width - 20.0 * 2.0) / rootSize.width + transition.updateTransformScale(node: rootController.displayNode, scale: scale) + + let transformedUpperBound = (self.windowLayout.size.height - rootSize.height * scale) / 2.0 + let targetBound = (self.windowLayout.statusBarHeight ?? 0.0) + 20.0 - 10.0 + positionOffset = targetBound - transformedUpperBound + + transition.updatePosition(node: rootController.displayNode, position: CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0 + positionOffset)) + rootController.updateModalTransition(value, transition: transition) + } + self.layoutSubviews() + } + } else { + if let dimView = self.dimView { + self.dimView = nil + self.isInTransitionOutOfModal = true + transition.updateAlpha(layer: dimView.layer, alpha: 0.0, completion: { [weak self, weak dimView] _ in + dimView?.removeFromSuperview() + if let strongSelf = self { + strongSelf.hostView.containerView.backgroundColor = strongSelf.defaultBackgroundColor + strongSelf.isInTransitionOutOfModal = false + strongSelf.layoutSubviews() + } + }) + if let rootController = self._rootController { + transition.updateTransformScale(node: rootController.displayNode, scale: 1.0) + transition.updatePosition(node: rootController.displayNode, position: CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0)) + rootController.updateModalTransition(0.0, transition: transition) + } + self.layoutSubviews() + } + } + } + public func present(_ controller: ContainableController, on level: PresentationSurfaceLevel, blockInteraction: Bool = false, completion: @escaping () -> Void = {}) { self.presentationContext.present(controller, on: level, blockInteraction: blockInteraction, completion: completion) } diff --git a/submodules/ItemListUI/Sources/ItemListController.swift b/submodules/ItemListUI/Sources/ItemListController.swift index 81344e6c05..25ebf981ea 100644 --- a/submodules/ItemListUI/Sources/ItemListController.swift +++ b/submodules/ItemListUI/Sources/ItemListController.swift @@ -230,6 +230,7 @@ open class ItemListController: ViewController, KeyShor super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: NavigationBarTheme(rootControllerTheme: theme), strings: NavigationBarStrings(presentationStrings: strings))) self.isOpaqueWhenInOverlay = true + self.isModalWhenInOverlay = true self.blocksBackgroundWhenInOverlay = true self.statusBar.statusBarStyle = theme.rootController.statusBarStyle.style @@ -478,6 +479,7 @@ open class ItemListController: ViewController, KeyShor presentationArguments.completion?() completion() }) + self.updateTransitionWhenPresentedAsModal?(1.0, .animated(duration: 0.5, curve: .spring)) } else { completion() } @@ -506,6 +508,7 @@ open class ItemListController: ViewController, KeyShor if !self.isDismissed { self.isDismissed = true (self.displayNode as! ItemListControllerNode).animateOut(completion: completion) + self.updateTransitionWhenPresentedAsModal?(0.0, .animated(duration: 0.2, curve: .easeInOut)) } } diff --git a/submodules/MessageReactionListUI/Info.plist b/submodules/MessageReactionListUI/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/MessageReactionListUI/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/submodules/MessageReactionListUI/MessageReactionListUI_Xcode.xcodeproj/project.pbxproj b/submodules/MessageReactionListUI/MessageReactionListUI_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..63e8bf9027 --- /dev/null +++ b/submodules/MessageReactionListUI/MessageReactionListUI_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,571 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D072F36823154C230009E66F /* MessageReactionListUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D072F36623154C230009E66F /* MessageReactionListUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D072F37423154E150009E66F /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F37323154E150009E66F /* AsyncDisplayKit.framework */; }; + D072F37623154E180009E66F /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F37523154E180009E66F /* SwiftSignalKit.framework */; }; + D072F37823154E1B0009E66F /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F37723154E1B0009E66F /* Display.framework */; }; + D072F37A23154E1E0009E66F /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F37923154E1E0009E66F /* Postbox.framework */; }; + D072F37C23154E220009E66F /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F37B23154E220009E66F /* TelegramCore.framework */; }; + D072F37E23154E290009E66F /* AccountContext.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F37D23154E290009E66F /* AccountContext.framework */; }; + D072F38023154E390009E66F /* MessageReactionListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D072F37F23154E390009E66F /* MessageReactionListController.swift */; }; + D072F38223154EA90009E66F /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F38123154EA90009E66F /* TelegramPresentationData.framework */; }; + D072F38623156B450009E66F /* MessageReactionCategoryNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D072F38523156B450009E66F /* MessageReactionCategoryNode.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D072F36323154C230009E66F /* MessageReactionListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MessageReactionListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F36623154C230009E66F /* MessageReactionListUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessageReactionListUI.h; sourceTree = ""; }; + D072F36723154C230009E66F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D072F37323154E150009E66F /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F37523154E180009E66F /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F37723154E1B0009E66F /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F37923154E1E0009E66F /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F37B23154E220009E66F /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F37D23154E290009E66F /* AccountContext.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AccountContext.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F37F23154E390009E66F /* MessageReactionListController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReactionListController.swift; sourceTree = ""; }; + D072F38123154EA90009E66F /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D072F38523156B450009E66F /* MessageReactionCategoryNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReactionCategoryNode.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D072F36023154C230009E66F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D072F38223154EA90009E66F /* TelegramPresentationData.framework in Frameworks */, + D072F37E23154E290009E66F /* AccountContext.framework in Frameworks */, + D072F37C23154E220009E66F /* TelegramCore.framework in Frameworks */, + D072F37A23154E1E0009E66F /* Postbox.framework in Frameworks */, + D072F37823154E1B0009E66F /* Display.framework in Frameworks */, + D072F37623154E180009E66F /* SwiftSignalKit.framework in Frameworks */, + D072F37423154E150009E66F /* AsyncDisplayKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D072F35923154C230009E66F = { + isa = PBXGroup; + children = ( + D072F36723154C230009E66F /* Info.plist */, + D072F36523154C230009E66F /* Sources */, + D072F36423154C230009E66F /* Products */, + D072F37223154E150009E66F /* Frameworks */, + ); + sourceTree = ""; + }; + D072F36423154C230009E66F /* Products */ = { + isa = PBXGroup; + children = ( + D072F36323154C230009E66F /* MessageReactionListUI.framework */, + ); + name = Products; + sourceTree = ""; + }; + D072F36523154C230009E66F /* Sources */ = { + isa = PBXGroup; + children = ( + D072F36623154C230009E66F /* MessageReactionListUI.h */, + D072F37F23154E390009E66F /* MessageReactionListController.swift */, + D072F38523156B450009E66F /* MessageReactionCategoryNode.swift */, + ); + path = Sources; + sourceTree = ""; + }; + D072F37223154E150009E66F /* Frameworks */ = { + isa = PBXGroup; + children = ( + D072F38123154EA90009E66F /* TelegramPresentationData.framework */, + D072F37D23154E290009E66F /* AccountContext.framework */, + D072F37B23154E220009E66F /* TelegramCore.framework */, + D072F37923154E1E0009E66F /* Postbox.framework */, + D072F37723154E1B0009E66F /* Display.framework */, + D072F37523154E180009E66F /* SwiftSignalKit.framework */, + D072F37323154E150009E66F /* AsyncDisplayKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D072F35E23154C230009E66F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D072F36823154C230009E66F /* MessageReactionListUI.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D072F36223154C230009E66F /* MessageReactionListUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = D072F36B23154C230009E66F /* Build configuration list for PBXNativeTarget "MessageReactionListUI" */; + buildPhases = ( + D072F35E23154C230009E66F /* Headers */, + D072F35F23154C230009E66F /* Sources */, + D072F36023154C230009E66F /* Frameworks */, + D072F36123154C230009E66F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MessageReactionListUI; + productName = MessageReactionListUI; + productReference = D072F36323154C230009E66F /* MessageReactionListUI.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D072F35A23154C230009E66F /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1030; + ORGANIZATIONNAME = "Telegram Messenger LLP"; + TargetAttributes = { + D072F36223154C230009E66F = { + CreatedOnToolsVersion = 10.3; + LastSwiftMigration = 1030; + }; + }; + }; + buildConfigurationList = D072F35D23154C230009E66F /* Build configuration list for PBXProject "MessageReactionListUI_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D072F35923154C230009E66F; + productRefGroup = D072F36423154C230009E66F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D072F36223154C230009E66F /* MessageReactionListUI */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D072F36123154C230009E66F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D072F35F23154C230009E66F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D072F38623156B450009E66F /* MessageReactionCategoryNode.swift in Sources */, + D072F38023154E390009E66F /* MessageReactionListController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D072F36923154C230009E66F /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStoreLLC; + }; + D072F36A23154C230009E66F /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStoreLLC; + }; + D072F36C23154C230009E66F /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.MessageReactionListUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D072F36D23154C230009E66F /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.MessageReactionListUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D072F36E23154C450009E66F /* DebugHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugHockeyapp; + }; + D072F36F23154C450009E66F /* DebugHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.MessageReactionListUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D072F37023154C530009E66F /* ReleaseHockeyappInternal */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyappInternal; + }; + D072F37123154C530009E66F /* ReleaseHockeyappInternal */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.MessageReactionListUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D072F35D23154C230009E66F /* Build configuration list for PBXProject "MessageReactionListUI_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D072F36923154C230009E66F /* DebugAppStoreLLC */, + D072F36E23154C450009E66F /* DebugHockeyapp */, + D072F36A23154C230009E66F /* ReleaseAppStoreLLC */, + D072F37023154C530009E66F /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D072F36B23154C230009E66F /* Build configuration list for PBXNativeTarget "MessageReactionListUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D072F36C23154C230009E66F /* DebugAppStoreLLC */, + D072F36F23154C450009E66F /* DebugHockeyapp */, + D072F36D23154C230009E66F /* ReleaseAppStoreLLC */, + D072F37123154C530009E66F /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D072F35A23154C230009E66F /* Project object */; +} diff --git a/submodules/MessageReactionListUI/Sources/MessageReactionCategoryNode.swift b/submodules/MessageReactionListUI/Sources/MessageReactionCategoryNode.swift new file mode 100644 index 0000000000..379ef364c6 --- /dev/null +++ b/submodules/MessageReactionListUI/Sources/MessageReactionCategoryNode.swift @@ -0,0 +1,103 @@ +import Foundation +import AsyncDisplayKit +import Display +import TelegramPresentationData +import TelegramCore + +final class MessageReactionCategoryNode: ASDisplayNode { + let category: MessageReactionListCategory + private let action: () -> Void + + private let buttonNode: HighlightableButtonNode + private let highlightedBackgroundNode: ASImageNode + private let iconNode: ASImageNode + private let emojiNode: ImmediateTextNode + private let countNode: ImmediateTextNode + + var isSelected = false { + didSet { + self.highlightedBackgroundNode.alpha = self.isSelected ? 1.0 : 0.0 + } + } + + init(theme: PresentationTheme, category: MessageReactionListCategory, count: Int, action: @escaping () -> Void) { + self.category = category + self.action = action + + self.buttonNode = HighlightableButtonNode() + + self.highlightedBackgroundNode = ASImageNode() + self.highlightedBackgroundNode.displaysAsynchronously = false + self.highlightedBackgroundNode.displayWithoutProcessing = true + self.highlightedBackgroundNode.image = generateStretchableFilledCircleImage(diameter: 18.0, color: UIColor(rgb: 0xe6e6e8)) + self.highlightedBackgroundNode.alpha = 1.0 + + self.iconNode = ASImageNode() + + self.emojiNode = ImmediateTextNode() + self.emojiNode.displaysAsynchronously = false + let emojiText: String + switch category { + case .all: + emojiText = "" + self.iconNode.image = PresentationResourcesChat.chatInputTextFieldTimerImage(theme) + case let .reaction(value): + emojiText = value + } + self.emojiNode.attributedText = NSAttributedString(string: emojiText, font: Font.regular(18.0), textColor: .black) + + self.countNode = ImmediateTextNode() + self.countNode.displaysAsynchronously = false + self.countNode.attributedText = NSAttributedString(string: "\(count)", font: Font.regular(16.0), textColor: .black) + + super.init() + + self.addSubnode(self.highlightedBackgroundNode) + self.addSubnode(self.iconNode) + self.addSubnode(self.emojiNode) + self.addSubnode(self.countNode) + self.addSubnode(self.buttonNode) + + self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside) + } + + func updateLayout() -> CGSize { + let sideInset: CGFloat = 6.0 + let spacing: CGFloat = 2.0 + let emojiSize = self.emojiNode.updateLayout(CGSize(width: 100.0, height: 100.0)) + let iconSize = self.iconNode.image?.size ?? CGSize() + let countSize = self.countNode.updateLayout(CGSize(width: 100.0, height: 100.0)) + + let height: CGFloat = 60.0 + let backgroundHeight: CGFloat = 36.0 + + self.emojiNode.frame = CGRect(origin: CGPoint(x: sideInset, y: floor((height - emojiSize.height) / 2.0)), size: emojiSize) + self.iconNode.frame = CGRect(origin: CGPoint(x: sideInset, y: floor((height - iconSize.height) / 2.0)), size: iconSize) + + let iconFrame: CGRect + if self.iconNode.image != nil { + iconFrame = self.iconNode.frame + } else { + iconFrame = self.emojiNode.frame + } + + self.countNode.frame = CGRect(origin: CGPoint(x: iconFrame.maxX + spacing, y: floor((height - countSize.height) / 2.0)), size: countSize) + let contentWidth = sideInset * 2.0 + spacing + iconFrame.width + countSize.width + self.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: floor((height - backgroundHeight) / 2.0)), size: CGSize(width: contentWidth, height: backgroundHeight)) + + let size = CGSize(width: contentWidth, height: height) + self.buttonNode.frame = CGRect(origin: CGPoint(), size: size) + return size + } + + @objc private func buttonPressed() { + self.action() + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if self.buttonNode.frame.contains(point) { + return self.buttonNode.view + } + return nil + } +} diff --git a/submodules/MessageReactionListUI/Sources/MessageReactionListController.swift b/submodules/MessageReactionListUI/Sources/MessageReactionListController.swift new file mode 100644 index 0000000000..c61df42470 --- /dev/null +++ b/submodules/MessageReactionListUI/Sources/MessageReactionListController.swift @@ -0,0 +1,418 @@ +import Foundation +import Display +import AccountContext +import TelegramPresentationData +import Postbox +import TelegramCore +import SwiftSignalKit +import MergeLists +import ItemListPeerItem + +public final class MessageReactionListController: ViewController { + private let context: AccountContext + private let messageId: MessageId + private let presentatonData: PresentationData + private let initialReactions: [MessageReaction] + + private var controllerNode: MessageReactionListControllerNode { + return self.displayNode as! MessageReactionListControllerNode + } + + private var animatedIn: Bool = false + + private let _ready = Promise() + override public var ready: Promise { + return self._ready + } + + public init(context: AccountContext, messageId: MessageId, initialReactions: [MessageReaction]) { + self.context = context + self.messageId = messageId + self.presentatonData = context.sharedContext.currentPresentationData.with { $0 } + self.initialReactions = initialReactions + + super.init(navigationBarPresentationData: nil) + + self.statusBar.statusBarStyle = .Ignore + } + + required public init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public func loadDisplayNode() { + self.displayNode = MessageReactionListControllerNode(context: self.context, presentatonData: self.presentatonData, messageId: messageId, initialReactions: initialReactions, dismiss: { [weak self] in + self?.dismiss() + }) + + super.displayNodeDidLoad() + + self._ready.set(self.controllerNode.isReady.get()) + } + + override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + self.controllerNode.containerLayoutUpdated(layout: layout, transition: transition) + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + if !self.animatedIn { + self.animatedIn = true + self.controllerNode.animateIn() + } + } + + override public func dismiss(completion: (() -> Void)? = nil) { + self.controllerNode.animateOut(completion: { [weak self] in + self?.presentingViewController?.dismiss(animated: false, completion: nil) + completion?() + }) + } +} + +private struct MessageReactionListTransaction { + let deletions: [ListViewDeleteItem] + let insertions: [ListViewInsertItem] + let updates: [ListViewUpdateItem] +} + +private struct MessageReactionListEntry: Comparable, Identifiable { + let index: Int + let item: MessageReactionListCategoryItem + + var stableId: PeerId { + return self.item.peer.id + } + + static func <(lhs: MessageReactionListEntry, rhs: MessageReactionListEntry) -> Bool { + return lhs.index < rhs.index + } + + func item(context: AccountContext, presentationData: PresentationData) -> ListViewItem { + return ItemListPeerItem(theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, account: context.account, peer: self.item.peer, height: .peerList, nameStyle: .distinctBold, presence: nil, text: .none, label: .text(self.item.reaction), editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: false, sectionId: 0, action: { + + }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, noInsets: true, tag: nil) + } +} + +private func preparedTransition(from fromEntries: [MessageReactionListEntry], to toEntries: [MessageReactionListEntry], context: AccountContext, presentationData: PresentationData) -> MessageReactionListTransaction { + let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries) + + let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) } + let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, presentationData: presentationData), directionHint: nil) } + let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, presentationData: presentationData), directionHint: nil) } + + return MessageReactionListTransaction(deletions: deletions, insertions: insertions, updates: updates) +} + +private let headerHeight: CGFloat = 60.0 +private let itemHeight: CGFloat = 50.0 + +private func topInsetForLayout(layout: ContainerViewLayout, itemCount: Int) -> CGFloat { + let contentHeight = CGFloat(itemCount) * itemHeight + let minimumItemHeights: CGFloat = contentHeight + + return max(layout.size.height - layout.intrinsicInsets.bottom - minimumItemHeights, headerHeight) +} + +private final class MessageReactionListControllerNode: ViewControllerTracingNode { + private let context: AccountContext + private let presentatonData: PresentationData + private let dismiss: () -> Void + + private let listContext: MessageReactionListContext + + private let dimNode: ASDisplayNode + private let backgroundNode: ASDisplayNode + private let contentHeaderContainerNode: ASDisplayNode + private let contentHeaderContainerBackgroundNode: ASImageNode + private var categoryItemNodes: [MessageReactionCategoryNode] = [] + private let categoryScrollNode: ASScrollNode + private let listNode: ListView + + private var validLayout: ContainerViewLayout? + + private var currentCategory: MessageReactionListCategory = .all + private var currentState: MessageReactionListState? + + private var enqueuedTransactions: [MessageReactionListTransaction] = [] + + private let disposable = MetaDisposable() + + let isReady = Promise() + + private var forceHeaderTransition: ContainedViewLayoutTransition? + + init(context: AccountContext, presentatonData: PresentationData, messageId: MessageId, initialReactions: [MessageReaction], dismiss: @escaping () -> Void) { + self.context = context + self.presentatonData = presentatonData + self.dismiss = dismiss + + self.dimNode = ASDisplayNode() + self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5) + + self.backgroundNode = ASDisplayNode() + self.backgroundNode.backgroundColor = self.presentatonData.theme.actionSheet.opaqueItemBackgroundColor + + self.contentHeaderContainerNode = ASDisplayNode() + self.contentHeaderContainerBackgroundNode = ASImageNode() + self.contentHeaderContainerBackgroundNode.displaysAsynchronously = false + + self.categoryScrollNode = ASScrollNode() + self.contentHeaderContainerBackgroundNode.displayWithoutProcessing = true + self.contentHeaderContainerBackgroundNode.image = generateImage(CGSize(width: 10.0, height: 10.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(presentatonData.theme.rootController.navigationBar.backgroundColor.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + context.fill(CGRect(origin: CGPoint(x: 0.0, y: size.height / 2.0), size: CGSize(width: size.width, height: size.height / 2.0))) + })?.stretchableImage(withLeftCapWidth: 5, topCapHeight: 5) + + self.listNode = ListView() + self.listNode.limitHitTestToNodes = true + + self.listContext = MessageReactionListContext(postbox: self.context.account.postbox, network: self.context.account.network, messageId: messageId, initialReactions: initialReactions) + + super.init() + + self.addSubnode(self.dimNode) + self.addSubnode(self.backgroundNode) + + self.listNode.stackFromBottom = false + self.addSubnode(self.listNode) + + self.addSubnode(self.contentHeaderContainerNode) + self.contentHeaderContainerNode.addSubnode(self.contentHeaderContainerBackgroundNode) + self.contentHeaderContainerNode.addSubnode(self.categoryScrollNode) + + self.listNode.updateFloatingHeaderOffset = { [weak self] offset, listTransition in + guard let strongSelf = self, let layout = strongSelf.validLayout else { + return + } + + let transition = strongSelf.forceHeaderTransition ?? listTransition + strongSelf.forceHeaderTransition = nil + + let topOffset = offset + transition.updateFrame(node: strongSelf.contentHeaderContainerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: topOffset - headerHeight), size: CGSize(width: layout.size.width, height: headerHeight))) + transition.updateFrame(node: strongSelf.contentHeaderContainerBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: layout.size.width, height: headerHeight))) + transition.updateFrame(node: strongSelf.backgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: topOffset - headerHeight / 2.0), size: CGSize(width: layout.size.width, height: layout.size.height + 300.0))) + } + + self.disposable.set((self.listContext.state + |> deliverOnMainQueue).start(next: { [weak self] state in + self?.updateState(state) + })) + } + + deinit { + self.disposable.dispose() + } + + override func didLoad() { + super.didLoad() + + self.dimNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dimNodeTapGesture))) + } + + func containerLayoutUpdated(layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + let isFirstLayout = self.validLayout == nil + self.validLayout = layout + + transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size)) + + //transition.updateBounds(node: self.listNode, bounds: CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: layout.size.height)) + //transition.updatePosition(node: self.listNode, position: CGPoint(x: layout.size.width / 2.0, y: layout.size.height / 2.0)) + + self.listNode.bounds = CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: layout.size.height) + self.listNode.position = CGPoint(x: layout.size.width / 2.0, y: layout.size.height / 2.0) + + var currentCategoryItemCount = 0 + if let currentState = self.currentState { + for (category, categoryState) in currentState.states { + if category == self.currentCategory { + currentCategoryItemCount = categoryState.count + break + } + } + } + + var insets = UIEdgeInsets() + insets.top = topInsetForLayout(layout: layout, itemCount: currentCategoryItemCount) + insets.bottom = layout.intrinsicInsets.bottom + + var duration: Double = 0.0 + var curve: UInt = 0 + switch transition { + case .immediate: + break + case let .animated(animationDuration, animationCurve): + duration = animationDuration + switch animationCurve { + case .easeInOut, .custom: + break + case .spring: + curve = 7 + } + } + + let listViewCurve: ListViewAnimationCurve + if curve == 7 { + listViewCurve = .Spring(duration: duration) + } else { + listViewCurve = .Default(duration: duration) + } + + self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: ListViewUpdateSizeAndInsets(size: layout.size, insets: insets, duration: duration, curve: listViewCurve), stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) + + let sideInset: CGFloat = 12.0 + let spacing: CGFloat = 6.0 + var leftX = sideInset + for itemNode in self.categoryItemNodes { + let itemSize = itemNode.updateLayout() + itemNode.frame = CGRect(origin: CGPoint(x: leftX, y: 0.0), size: itemSize) + leftX += spacing + itemSize.width + } + leftX += sideInset + self.categoryScrollNode.view.contentSize = CGSize(width: leftX, height: 60.0) + self.categoryScrollNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: 60.0)) + + if isFirstLayout { + while !self.enqueuedTransactions.isEmpty { + self.dequeueTransaction() + } + } + } + + func animateIn() { + self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) + self.dimNode.layer.animatePosition(from: CGPoint(x: self.dimNode.position.x, y: self.dimNode.position.y - self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring, completion: { _ in + }) + self.layer.animatePosition(from: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring, completion: { _ in + }) + } + + func animateOut(completion: @escaping () -> Void) { + self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) + self.dimNode.layer.animatePosition(from: self.dimNode.position, to: CGPoint(x: self.dimNode.position.x, y: self.dimNode.position.y - self.layer.bounds.size.height), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) + self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false, completion: { _ in + completion() + }) + } + + func updateState(_ state: MessageReactionListState) { + if self.currentState != state { + self.currentState = state + + self.updateItems() + + if let validLayout = self.validLayout { + self.containerLayoutUpdated(layout: validLayout, transition: .immediate) + } + } + } + + private var currentEntries: [MessageReactionListEntry]? + private func updateItems() { + var entries: [MessageReactionListEntry] = [] + + var index = 0 + let states = self.currentState?.states ?? [] + for (category, categoryState) in states { + if self.categoryItemNodes.count <= index { + let itemNode = MessageReactionCategoryNode(theme: self.presentatonData.theme, category: category, count: categoryState.count, action: { [weak self] in + self?.setCategory(category) + }) + self.categoryItemNodes.append(itemNode) + self.categoryScrollNode.addSubnode(itemNode) + if category == self.currentCategory { + itemNode.isSelected = true + } else { + itemNode.isSelected = false + } + } + + if category == self.currentCategory { + for item in categoryState.items { + entries.append(MessageReactionListEntry(index: entries.count, item: item)) + } + if !categoryState.items.isEmpty { + self.isReady.set(.single(true)) + } + } + index += 1 + } + let transaction = preparedTransition(from: self.currentEntries ?? [], to: entries, context: self.context, presentationData: self.presentatonData) + self.currentEntries = entries + + self.enqueuedTransactions.append(transaction) + self.dequeueTransaction() + } + + func setCategory(_ category: MessageReactionListCategory) { + if self.currentCategory != category { + self.currentCategory = category + + for itemNode in self.categoryItemNodes { + itemNode.isSelected = category == itemNode.category + } + + self.forceHeaderTransition = .animated(duration: 0.3, curve: .spring) + if let validLayout = self.validLayout { + self.containerLayoutUpdated(layout: validLayout, transition: .animated(duration: 0.3, curve: .spring)) + } + + self.updateItems() + } + } + + private func dequeueTransaction() { + guard let layout = self.validLayout, let transaction = self.enqueuedTransactions.first else { + return + } + + self.enqueuedTransactions.remove(at: 0) + + var options = ListViewDeleteAndInsertOptions() + options.insert(.Synchronous) + //options.insert(.AnimateTopItemPosition) + //options.insert(.AnimateCrossfade) + options.insert(.PreferSynchronousResourceLoading) + + var currentCategoryItemCount = 0 + if let currentState = self.currentState { + for (category, categoryState) in currentState.states { + if category == self.currentCategory { + currentCategoryItemCount = categoryState.count + break + } + } + } + + var insets = UIEdgeInsets() + insets.top = topInsetForLayout(layout: layout, itemCount: currentCategoryItemCount) + insets.bottom = layout.intrinsicInsets.bottom + + let updateSizeAndInsets = ListViewUpdateSizeAndInsets(size: self.listNode.bounds.size, insets: insets, duration: 0.0, curve: .Default(duration: nil)) + + self.listNode.transaction(deleteIndices: transaction.deletions, insertIndicesAndItems: transaction.insertions, updateIndicesAndItems: transaction.updates, options: options, updateSizeAndInsets: updateSizeAndInsets, updateOpaqueState: nil, completion: { _ in + }) + } + + @objc private func dimNodeTapGesture(_ recognizer: UITapGestureRecognizer) { + if case .ended = recognizer.state { + self.dismiss() + } + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + for itemNode in self.categoryItemNodes { + if let result = itemNode.hitTest(self.view.convert(point, to: itemNode.view), with: event) { + return result + } + } + return super.hitTest(point, with: event) + } +} diff --git a/submodules/MessageReactionListUI/Sources/MessageReactionListUI.h b/submodules/MessageReactionListUI/Sources/MessageReactionListUI.h new file mode 100644 index 0000000000..6460ffc97e --- /dev/null +++ b/submodules/MessageReactionListUI/Sources/MessageReactionListUI.h @@ -0,0 +1,19 @@ +// +// MessageReactionListUI.h +// MessageReactionListUI +// +// Created by Peter on 8/27/19. +// Copyright © 2019 Telegram Messenger LLP. All rights reserved. +// + +#import + +//! Project version number for MessageReactionListUI. +FOUNDATION_EXPORT double MessageReactionListUIVersionNumber; + +//! Project version string for MessageReactionListUI. +FOUNDATION_EXPORT const unsigned char MessageReactionListUIVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/TelegramCore/TelegramCore/MessageReactionList.swift b/submodules/TelegramCore/TelegramCore/MessageReactionList.swift new file mode 100644 index 0000000000..85a6b34d8b --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/MessageReactionList.swift @@ -0,0 +1,216 @@ +import Foundation +#if os(macOS) +import PostboxMac +import SwiftSignalKitMac +import MtProtoKitMac +import TelegramApiMac +#else +import Postbox +import SwiftSignalKit +import TelegramApi +#if BUCK +import MtProtoKit +#else +import MtProtoKitDynamic +#endif +#endif + +public enum MessageReactionListCategory: Hashable { + case all + case reaction(String) +} + +public final class MessageReactionListCategoryItem: Equatable { + public let peer: Peer + public let reaction: String + + init(peer: Peer, reaction: String) { + self.peer = peer + self.reaction = reaction + } + + public static func ==(lhs: MessageReactionListCategoryItem, rhs: MessageReactionListCategoryItem) -> Bool { + if lhs.peer.id != rhs.peer.id { + return false + } + if lhs.reaction != rhs.reaction { + return false + } + return true + } +} + +public struct MessageReactionListCategoryState: Equatable { + public var count: Int + public var completed: Bool + public var items: [MessageReactionListCategoryItem] + public var loadingMore: Bool + fileprivate var nextOffset: String? +} + +private enum LoadReactionsError { + case generic +} + +private final class MessageReactionCategoryContext { + private let postbox: Postbox + private let network: Network + private let messageId: MessageId + private let category: MessageReactionListCategory + private var state: MessageReactionListCategoryState + var statePromise: ValuePromise + + private let loadingDisposable = MetaDisposable() + + init(postbox: Postbox, network: Network, messageId: MessageId, category: MessageReactionListCategory, initialState: MessageReactionListCategoryState) { + self.postbox = postbox + self.network = network + self.messageId = messageId + self.category = category + self.state = initialState + self.statePromise = ValuePromise(initialState) + } + + deinit { + self.loadingDisposable.dispose() + } + + func loadMore() { + if self.state.completed || self.state.loadingMore { + return + } + self.state.loadingMore = true + self.statePromise.set(self.state) + + var flags: Int32 = 0 + var reaction: String? + switch self.category { + case .all: + break + case let .reaction(value): + flags |= 1 << 0 + reaction = value + } + let messageId = self.messageId + let offset = self.state.nextOffset + let request = self.postbox.transaction { transaction -> Api.InputPeer? in + let inputPeer = transaction.getPeer(messageId.peerId).flatMap(apiInputPeer) + return inputPeer + } + |> introduceError(LoadReactionsError.self) + |> mapToSignal { inputPeer -> Signal in + guard let inputPeer = inputPeer else { + return .fail(.generic) + } + return self.network.request(Api.functions.messages.getMessageReactionsList(flags: flags, peer: inputPeer, id: messageId.id, reaction: reaction, offset: offset, limit: 64)) + |> mapError { _ -> LoadReactionsError in + return .generic + } + } + self.loadingDisposable.set((request + |> deliverOnMainQueue).start(next: { [weak self] result in + guard let strongSelf = self else { + return + } + let currentState = strongSelf.state + let _ = (strongSelf.postbox.transaction { transaction -> MessageReactionListCategoryState in + var mergedItems = currentState.items + var currentIds = Set(mergedItems.lazy.map { $0.peer.id }) + switch result { + case let .messageReactionsList(_, count, reactions, users, nextOffset): + var peers: [Peer] = [] + for user in users { + let parsedUser = TelegramUser(user: user) + peers.append(parsedUser) + } + updatePeers(transaction: transaction, peers: peers, update: { _, updated in updated }) + for reaction in reactions { + switch reaction { + case let .messageUserReaction(userId, reaction): + if let peer = transaction.getPeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: userId)) { + if !currentIds.contains(peer.id) { + currentIds.insert(peer.id) + mergedItems.append(MessageReactionListCategoryItem(peer: peer, reaction: reaction)) + } + } + } + } + return MessageReactionListCategoryState(count: max(mergedItems.count, Int(count)), completed: nextOffset == nil, items: mergedItems, loadingMore: false, nextOffset: nextOffset) + } + } + |> deliverOnMainQueue).start(next: { state in + guard let strongSelf = self else { + return + } + strongSelf.state = state + strongSelf.statePromise.set(state) + }) + }, error: { _ in + + })) + } +} + +public struct MessageReactionListState: Equatable { + public var states: [(MessageReactionListCategory, MessageReactionListCategoryState)] + + public static func ==(lhs: MessageReactionListState, rhs: MessageReactionListState) -> Bool { + if lhs.states.count != rhs.states.count { + return false + } + for i in 0 ..< lhs.states.count { + if lhs.states[i].0 != rhs.states[i].0 { + return false + } + if lhs.states[i].1 != rhs.states[i].1 { + return false + } + } + return true + } +} + +public final class MessageReactionListContext { + private let postbox: Postbox + private let network: Network + + private var categoryContexts: [MessageReactionListCategory: MessageReactionCategoryContext] = [:] + + private let _state = Promise() + public var state: Signal { + return self._state.get() + } + + public init(postbox: Postbox, network: Network, messageId: MessageId, initialReactions: [MessageReaction]) { + self.postbox = postbox + self.network = network + + var allState = MessageReactionListCategoryState(count: 0, completed: false, items: [], loadingMore: false, nextOffset: nil) + var signals: [Signal<(MessageReactionListCategory, MessageReactionListCategoryState), NoError>] = [] + for reaction in initialReactions { + allState.count += Int(reaction.count) + let context = MessageReactionCategoryContext(postbox: postbox, network: network, messageId: messageId, category: .reaction(reaction.value), initialState: MessageReactionListCategoryState(count: Int(reaction.count), completed: false, items: [], loadingMore: false, nextOffset: nil)) + signals.append(context.statePromise.get() |> map { value -> (MessageReactionListCategory, MessageReactionListCategoryState) in + return (.reaction(reaction.value), value) + }) + self.categoryContexts[.reaction(reaction.value)] = context + context.loadMore() + } + let allContext = MessageReactionCategoryContext(postbox: postbox, network: network, messageId: messageId, category: .all, initialState: allState) + signals.insert(allContext.statePromise.get() |> map { value -> (MessageReactionListCategory, MessageReactionListCategoryState) in + return (.all, value) + }, at: 0) + self.categoryContexts[.all] = allContext + + self._state.set(combineLatest(queue: .mainQueue(), signals) + |> map { states in + return MessageReactionListState(states: states) + }) + + allContext.loadMore() + } + + public func loadMore(category: MessageReactionListCategory) { + self.categoryContexts[category]?.loadMore() + } +} diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 63bc08ccc6..e470875ec7 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -450,6 +450,8 @@ D07047B81F3DF2CD00F6A8D4 /* ManagedConsumePersonalMessagesActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07047B61F3DF2CD00F6A8D4 /* ManagedConsumePersonalMessagesActions.swift */; }; D07047BA1F3DF75500F6A8D4 /* ConsumePersonalMessageAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07047B91F3DF75500F6A8D4 /* ConsumePersonalMessageAction.swift */; }; D07047BB1F3DF75500F6A8D4 /* ConsumePersonalMessageAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07047B91F3DF75500F6A8D4 /* ConsumePersonalMessageAction.swift */; }; + D072F357231542740009E66F /* MessageReactionList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D072F356231542740009E66F /* MessageReactionList.swift */; }; + D072F358231542740009E66F /* MessageReactionList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D072F356231542740009E66F /* MessageReactionList.swift */; }; D073CE5D1DCB97F6007511FD /* ForwardSourceInfoAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D073CE5C1DCB97F6007511FD /* ForwardSourceInfoAttribute.swift */; }; D073CE601DCB9D14007511FD /* OutgoingMessageInfoAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D073CE5F1DCB9D14007511FD /* OutgoingMessageInfoAttribute.swift */; }; D073CE6A1DCBCF17007511FD /* ViewCountMessageAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0CE71D6224AD00955575 /* ViewCountMessageAttribute.swift */; }; @@ -1042,6 +1044,7 @@ D07047B31F3DF1FE00F6A8D4 /* ConsumablePersonalMentionMessageAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConsumablePersonalMentionMessageAttribute.swift; sourceTree = ""; }; D07047B61F3DF2CD00F6A8D4 /* ManagedConsumePersonalMessagesActions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedConsumePersonalMessagesActions.swift; sourceTree = ""; }; D07047B91F3DF75500F6A8D4 /* ConsumePersonalMessageAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConsumePersonalMessageAction.swift; sourceTree = ""; }; + D072F356231542740009E66F /* MessageReactionList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReactionList.swift; sourceTree = ""; }; D073CE5C1DCB97F6007511FD /* ForwardSourceInfoAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ForwardSourceInfoAttribute.swift; sourceTree = ""; }; D073CE5F1DCB9D14007511FD /* OutgoingMessageInfoAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutgoingMessageInfoAttribute.swift; sourceTree = ""; }; D0750C8F22B2FD8300BE5F6E /* PeerAccessHash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerAccessHash.swift; sourceTree = ""; }; @@ -1606,6 +1609,7 @@ D01AC91C1DD5DA5E00E8160F /* RequestMessageActionCallback.swift */, D0AB262A21C3CE80008F6685 /* Polls.swift */, D0329EA122FC5A7C00F9F071 /* MessageReactions.swift */, + D072F356231542740009E66F /* MessageReactionList.swift */, D01AC9201DD5E7E500E8160F /* RequestEditMessage.swift */, D0DC354D1DE368F7000195EB /* RequestChatContextResults.swift */, D0DC354F1DE36900000195EB /* ChatContextResult.swift */, @@ -2453,6 +2457,7 @@ D054649120738653002ECC1E /* SecureIdIDCardValue.swift in Sources */, D018EE052045E95000CBB130 /* CheckPeerChatServiceActions.swift in Sources */, D0F3A8A51E82C94C00B4C64C /* SynchronizeableChatInputState.swift in Sources */, + D072F357231542740009E66F /* MessageReactionList.swift in Sources */, D03B0CD71D62245300955575 /* TelegramGroup.swift in Sources */, D02609BF20C6EC08006C34AC /* Crypto.m in Sources */, D0B8438C1DA7CF50005F29E1 /* BotInfo.swift in Sources */, @@ -2783,6 +2788,7 @@ D05A32E81E6F0B5C002760B4 /* RecentAccountSession.swift in Sources */, D0F7B1E31E045C7B007EB8A5 /* RichText.swift in Sources */, D0575C2E22B922DF00A71A0E /* DeleteAccount.swift in Sources */, + D072F358231542740009E66F /* MessageReactionList.swift in Sources */, D0FA8BB11E1FEC7E001E855B /* SecretChatEncryptionConfig.swift in Sources */, D0B418AA1D7E0597004562A4 /* Download.swift in Sources */, D001F3F41E128A1C007A8C60 /* UpdatesApiUtils.swift in Sources */, diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index faf983cda1..7cadafdf72 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -57,12 +57,13 @@ private class ApplicationStatusBarHost: StatusBarHost { return self.application.statusBarFrame } var statusBarStyle: UIStatusBarStyle { - get { - return self.application.statusBarStyle - } set(value) { - self.application.setStatusBarStyle(value, animated: false) - } + return self.application.statusBarStyle } + + func setStatusBarStyle(_ style: UIStatusBarStyle, animated: Bool) { + self.application.setStatusBarStyle(style, animated: animated) + } + var statusBarWindow: UIView? { return self.application.value(forKey: "statusBarWindow") as? UIView } @@ -237,7 +238,7 @@ final class SharedApplicationContext { let (window, hostView, aboveStatusbarWindow) = nativeWindowHostView() self.mainWindow = Window1(hostView: hostView, statusBarHost: statusBarHost) self.aboveStatusbarWindow = aboveStatusbarWindow - window.backgroundColor = UIColor.white + hostView.containerView.backgroundColor = UIColor.white self.window = window self.nativeWindow = window @@ -656,7 +657,7 @@ final class SharedApplicationContext { } |> deliverOnMainQueue |> mapToSignal { accountManager, initialPresentationDataAndSettings -> Signal<(SharedApplicationContext, LoggingSettings), NoError> in - self.window?.backgroundColor = initialPresentationDataAndSettings.presentationData.theme.chatList.backgroundColor + self.mainWindow?.hostView.containerView.backgroundColor = initialPresentationDataAndSettings.presentationData.theme.chatList.backgroundColor let legacyBasePath = appGroupUrl.path let legacyCache = LegacyCache(path: legacyBasePath + "/Caches") diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 4a367294dc..2a55b64dab 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -44,6 +44,7 @@ import PeerInfoUI import RaiseToListen import UrlHandling import ReactionSelectionNode +import MessageReactionListUI public enum ChatControllerPeekActions { case standard @@ -286,6 +287,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private var updateSlowmodeStatusDisposable = MetaDisposable() private var updateSlowmodeStatusTimerValue: Int32? + + private var isDismissed = false public override var customData: Any? { return self.chatLocation @@ -343,6 +346,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G super.init(context: context, navigationBarPresentationData: navigationBarPresentationData, mediaAccessoryPanelVisibility: mediaAccessoryPanelVisibility, locationBroadcastPanelSource: locationBroadcastPanelSource) self.blocksBackgroundWhenInOverlay = true + if let subject = subject, case .scheduledMessages = subject { + self.isModalWhenInOverlay = true + } self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) @@ -1499,8 +1505,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { strongSelf.chatDisplayNode.sendCurrentMessage(scheduleTime: scheduleTime) if !strongSelf.presentationInterfaceState.isScheduledMessages { - let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) - (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + strongSelf.openScheduledMessages() } } }) @@ -1581,6 +1586,28 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } let _ = updateMessageReactionsInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, reaction: reaction).start() + }, openMessageReactions: { [weak self] messageId in + guard let strongSelf = self else { + return + } + let _ = (strongSelf.context.account.postbox.transaction { transaction -> Message? in + return transaction.getMessage(messageId) + } + |> deliverOnMainQueue).start(next: { message in + guard let strongSelf = self, let message = message else { + return + } + var initialReactions: [MessageReaction] = [] + for attribute in message.attributes { + if let attribute = attribute as? ReactionsMessageAttribute { + initialReactions = attribute.reactions + } + } + + if !initialReactions.isEmpty { + strongSelf.present(MessageReactionListController(context: strongSelf.context, messageId: message.id, initialReactions: initialReactions), in: .window(.root)) + } + }) }, requestMessageUpdate: { [weak self] id in if let strongSelf = self { strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(id) @@ -3856,8 +3883,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, openScheduledMessages: { [weak self] in if let strongSelf = self { - let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) - (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + strongSelf.openScheduledMessages() } }, statuses: ChatPanelInterfaceInteractionStatuses(editingMessage: self.editingMessage.get(), startingBot: self.startingBot.get(), unblockingPeer: self.unblockingPeer.get(), searching: self.searching.get(), loadingMessage: self.loadingMessage.get())) @@ -4213,6 +4239,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } } + + if let subject = self.subject, case .scheduledMessages = subject { + self.chatDisplayNode.animateIn() + self.updateTransitionWhenPresentedAsModal?(1.0, .animated(duration: 0.5, curve: .spring)) + } } override public func viewWillDisappear(_ animated: Bool) { @@ -4571,7 +4602,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G // // } - if let button = leftNavigationButtonForChatInterfaceState(updatedChatPresentationInterfaceState, strings: updatedChatPresentationInterfaceState.strings, currentButton: self.leftNavigationButton, target: self, selector: #selector(self.leftNavigationButtonAction)) { + if let button = leftNavigationButtonForChatInterfaceState(updatedChatPresentationInterfaceState, subject: self.subject, strings: updatedChatPresentationInterfaceState.strings, currentButton: self.leftNavigationButton, target: self, selector: #selector(self.leftNavigationButtonAction)) { if self.leftNavigationButton != button { var animated = transition.isAnimated if let currentButton = self.leftNavigationButton?.action, currentButton == button.action { @@ -4671,115 +4702,117 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private func navigationButtonAction(_ action: ChatNavigationButtonAction) { switch action { - case .cancelMessageSelection: - self.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withoutSelectionState() } }) - case .clearHistory: - if case let .peer(peerId) = self.chatLocation { - guard let peer = self.presentationInterfaceState.renderedPeer, let chatPeer = peer.peers[peer.peerId], let mainPeer = peer.chatMainPeer else { + case .cancelMessageSelection: + self.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withoutSelectionState() } }) + case .clearHistory: + if case let .peer(peerId) = self.chatLocation { + guard let peer = self.presentationInterfaceState.renderedPeer, let chatPeer = peer.peers[peer.peerId], let mainPeer = peer.chatMainPeer else { + return + } + + let text: String + if peerId == self.context.account.peerId { + text = self.presentationData.strings.Conversation_ClearSelfHistory + } else if peerId.namespace == Namespaces.Peer.SecretChat { + text = self.presentationData.strings.Conversation_ClearSecretHistory + } else if peerId.namespace == Namespaces.Peer.CloudGroup || peerId.namespace == Namespaces.Peer.CloudChannel { + text = self.presentationData.strings.Conversation_ClearGroupHistory + } else { + text = self.presentationData.strings.Conversation_ClearPrivateHistory + } + + var canRemoveGlobally = false + let limitsConfiguration = self.context.currentLimitsConfiguration.with { $0 } + if peerId.namespace == Namespaces.Peer.CloudUser && peerId != self.context.account.peerId { + if limitsConfiguration.maxMessageRevokeIntervalInPrivateChats == LimitsConfiguration.timeIntervalForever { + canRemoveGlobally = true + } + } + if let user = chatPeer as? TelegramUser, user.botInfo != nil { + canRemoveGlobally = false + } + + let account = self.context.account + + let beginClear: (InteractiveHistoryClearingType) -> Void = { [weak self] type in + guard let strongSelf = self else { return } + strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withoutSelectionState() } }) + strongSelf.chatDisplayNode.historyNode.historyAppearsCleared = true - let text: String - if peerId == self.context.account.peerId { - text = self.presentationData.strings.Conversation_ClearSelfHistory - } else if peerId.namespace == Namespaces.Peer.SecretChat { - text = self.presentationData.strings.Conversation_ClearSecretHistory - } else if peerId.namespace == Namespaces.Peer.CloudGroup || peerId.namespace == Namespaces.Peer.CloudChannel { - text = self.presentationData.strings.Conversation_ClearGroupHistory + let statusText: String + if strongSelf.presentationInterfaceState.isScheduledMessages { + statusText = strongSelf.presentationData.strings.Undo_ScheduledMessagesCleared + } else if case .forEveryone = type { + statusText = strongSelf.presentationData.strings.Undo_ChatClearedForBothSides } else { - text = self.presentationData.strings.Conversation_ClearPrivateHistory + statusText = strongSelf.presentationData.strings.Undo_ChatCleared } - var canRemoveGlobally = false - let limitsConfiguration = self.context.currentLimitsConfiguration.with { $0 } - if peerId.namespace == Namespaces.Peer.CloudUser && peerId != self.context.account.peerId { - if limitsConfiguration.maxMessageRevokeIntervalInPrivateChats == LimitsConfiguration.timeIntervalForever { - canRemoveGlobally = true - } - } - if let user = chatPeer as? TelegramUser, user.botInfo != nil { - canRemoveGlobally = false - } - - let account = self.context.account - - let beginClear: (InteractiveHistoryClearingType) -> Void = { [weak self] type in - guard let strongSelf = self else { - return - } - strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withoutSelectionState() } }) - strongSelf.chatDisplayNode.historyNode.historyAppearsCleared = true - - let statusText: String - if strongSelf.presentationInterfaceState.isScheduledMessages { - statusText = strongSelf.presentationData.strings.Undo_ScheduledMessagesCleared - } else if case .forEveryone = type { - statusText = strongSelf.presentationData.strings.Undo_ChatClearedForBothSides - } else { - statusText = strongSelf.presentationData.strings.Undo_ChatCleared - } - - strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .removedChat(text: statusText), elevatedLayout: true, action: { shouldCommit in - if shouldCommit { - let _ = clearHistoryInteractively(postbox: account.postbox, peerId: peerId, type: type).start(completed: { - self?.chatDisplayNode.historyNode.historyAppearsCleared = false - }) - } else { + strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .removedChat(text: statusText), elevatedLayout: true, action: { shouldCommit in + if shouldCommit { + let _ = clearHistoryInteractively(postbox: account.postbox, peerId: peerId, type: type).start(completed: { self?.chatDisplayNode.historyNode.historyAppearsCleared = false - } - }), in: .window(.root)) - } - - let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) - var items: [ActionSheetItem] = [] - - if self.presentationInterfaceState.isScheduledMessages { - items.append(ActionSheetButtonItem(title: self.presentationData.strings.ScheduledMessages_ClearAllConfirmation, color: .destructive, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - beginClear(.scheduledMessages) - })) - } else if canRemoveGlobally { - items.append(DeleteChatPeerActionSheetItem(context: self.context, peer: mainPeer, chatPeer: chatPeer, action: .clearHistory, strings: self.presentationData.strings)) - items.append(ActionSheetButtonItem(title: self.presentationData.strings.ChatList_DeleteForEveryone(mainPeer.compactDisplayTitle).0, color: .destructive, action: { [weak actionSheet] in - beginClear(.forEveryone) - actionSheet?.dismissAnimated() - })) - items.append(ActionSheetButtonItem(title: self.presentationData.strings.ChatList_DeleteForCurrentUser, color: .destructive, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - beginClear(.forLocalPeer) - })) - } else { - items.append(ActionSheetTextItem(title: text)) - items.append(ActionSheetButtonItem(title: self.presentationData.strings.Conversation_ClearAll, color: .destructive, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - beginClear(.forLocalPeer) - })) - } + }) + } else { + self?.chatDisplayNode.historyNode.historyAppearsCleared = false + } + }), in: .window(.root)) + } + + let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) + var items: [ActionSheetItem] = [] + + if self.presentationInterfaceState.isScheduledMessages { + items.append(ActionSheetButtonItem(title: self.presentationData.strings.ScheduledMessages_ClearAllConfirmation, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + beginClear(.scheduledMessages) + })) + } else if canRemoveGlobally { + items.append(DeleteChatPeerActionSheetItem(context: self.context, peer: mainPeer, chatPeer: chatPeer, action: .clearHistory, strings: self.presentationData.strings)) + items.append(ActionSheetButtonItem(title: self.presentationData.strings.ChatList_DeleteForEveryone(mainPeer.compactDisplayTitle).0, color: .destructive, action: { [weak actionSheet] in + beginClear(.forEveryone) + actionSheet?.dismissAnimated() + })) + items.append(ActionSheetButtonItem(title: self.presentationData.strings.ChatList_DeleteForCurrentUser, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + beginClear(.forLocalPeer) + })) + } else { + items.append(ActionSheetTextItem(title: text)) + items.append(ActionSheetButtonItem(title: self.presentationData.strings.Conversation_ClearAll, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + beginClear(.forLocalPeer) + })) + } - actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - }) - ])]) - - self.chatDisplayNode.dismissInput() - self.present(actionSheet, in: .window(.root)) - } - case .openChatInfo: - switch self.chatLocationInfoData { - case let .peer(peerView): - self.navigationActionDisposable.set((peerView.get() - |> take(1) - |> deliverOnMainQueue).start(next: { [weak self] peerView in - if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios") == nil && !strongSelf.presentationInterfaceState.isNotAccessible { - if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) { - (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) - } + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + + self.chatDisplayNode.dismissInput() + self.present(actionSheet, in: .window(.root)) + } + case .openChatInfo: + switch self.chatLocationInfoData { + case let .peer(peerView): + self.navigationActionDisposable.set((peerView.get() + |> take(1) + |> deliverOnMainQueue).start(next: { [weak self] peerView in + if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios") == nil && !strongSelf.presentationInterfaceState.isNotAccessible { + if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic) { + (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) } - })) - } - case .search: - self.interfaceInteraction?.beginMessageSearch(.everything, "") + } + })) + } + case .search: + self.interfaceInteraction?.beginMessageSearch(.everything, "") + case .dismiss: + self.dismiss() } } @@ -4944,8 +4977,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { done(time) if !strongSelf.presentationInterfaceState.isScheduledMessages { - let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) - (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + strongSelf.openScheduledMessages() } } }) @@ -4986,8 +5018,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { done(time) if !strongSelf.presentationInterfaceState.isScheduledMessages { - let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) - (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + strongSelf.openScheduledMessages() } } }) @@ -5171,8 +5202,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { done(time) if !strongSelf.presentationInterfaceState.isScheduledMessages { - let controller = ChatControllerImpl(context: strongSelf.context, chatLocation: strongSelf.chatLocation, subject: .scheduledMessages) - (strongSelf.navigationController as? NavigationController)?.pushViewController(controller) + strongSelf.openScheduledMessages() } } }) @@ -7535,4 +7565,19 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.updateSlowmodeStatusDisposable.set(nil) } } + + private func openScheduledMessages() { + let controller = ChatControllerImpl(context: self.context, chatLocation: self.chatLocation, subject: .scheduledMessages) + self.present(controller, in: .window(.root)) + } + + override public func dismiss(completion: (() -> Void)? = nil) { + if !self.isDismissed { + self.isDismissed = true + self.chatDisplayNode.animateOut(completion: { [weak self] in + self?.presentingViewController?.dismiss(animated: false, completion: nil) + }) + self.updateTransitionWhenPresentedAsModal?(0.0, .animated(duration: 0.2, curve: .easeInOut)) + } + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift index c36a16e51d..e1a7ce7cbc 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift @@ -95,6 +95,7 @@ public final class ChatControllerInteraction { let editScheduledMessagesTime: ([MessageId]) -> Void let performTextSelectionAction: (UInt32, String, TextSelectionAction) -> Void let updateMessageReaction: (MessageId, String) -> Void + let openMessageReactions: (MessageId) -> Void let requestMessageUpdate: (MessageId) -> Void let cancelInteractiveKeyboardGestures: () -> Void @@ -109,7 +110,7 @@ public final class ChatControllerInteraction { var searchTextHighightState: String? var seenOneTimeAnimatedMedia = Set() - init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, TapLongTapOrDoubleTapGestureRecognizer?) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, String, TextSelectionAction) -> Void, updateMessageReaction: @escaping (MessageId, String) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { + init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, TapLongTapOrDoubleTapGestureRecognizer?) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, String, TextSelectionAction) -> Void, updateMessageReaction: @escaping (MessageId, String) -> Void, openMessageReactions: @escaping (MessageId) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { self.openMessage = openMessage self.openPeer = openPeer self.openPeerMention = openPeerMention @@ -158,6 +159,7 @@ public final class ChatControllerInteraction { self.editScheduledMessagesTime = editScheduledMessagesTime self.performTextSelectionAction = performTextSelectionAction self.updateMessageReaction = updateMessageReaction + self.openMessageReactions = openMessageReactions self.requestMessageUpdate = requestMessageUpdate self.cancelInteractiveKeyboardGestures = cancelInteractiveKeyboardGestures @@ -193,6 +195,7 @@ public final class ChatControllerInteraction { }, editScheduledMessagesTime: { _ in }, performTextSelectionAction: { _, _, _ in }, updateMessageReaction: { _, _ in + }, openMessageReactions: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 9a77946636..1c2438c721 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -2100,4 +2100,16 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } } + + func animateIn(completion: (() -> Void)? = nil) { + self.layer.animatePosition(from: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring, completion: { _ in + completion?() + }) + } + + func animateOut(completion: (() -> Void)? = nil) { + self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false, completion: { [weak self] _ in + completion?() + }) + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift index 8fc3cd71c8..aee93f6cd7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift @@ -3,12 +3,14 @@ import UIKit import Postbox import TelegramCore import TelegramPresentationData +import AccountContext enum ChatNavigationButtonAction { case openChatInfo case clearHistory case cancelMessageSelection case search + case dismiss } struct ChatNavigationButton: Equatable { @@ -20,7 +22,7 @@ struct ChatNavigationButton: Equatable { } } -func leftNavigationButtonForChatInterfaceState(_ presentationInterfaceState: ChatPresentationInterfaceState, strings: PresentationStrings, currentButton: ChatNavigationButton?, target: Any?, selector: Selector?) -> ChatNavigationButton? { +func leftNavigationButtonForChatInterfaceState(_ presentationInterfaceState: ChatPresentationInterfaceState, subject: ChatControllerSubject?, strings: PresentationStrings, currentButton: ChatNavigationButton?, target: Any?, selector: Selector?) -> ChatNavigationButton? { if let _ = presentationInterfaceState.interfaceState.selectionState { if let currentButton = currentButton, currentButton.action == .clearHistory { return currentButton @@ -45,6 +47,13 @@ func leftNavigationButtonForChatInterfaceState(_ presentationInterfaceState: Cha } } } + if let subject = subject, case .scheduledMessages = subject { + if let currentButton = currentButton, currentButton.action == .dismiss { + return currentButton + } else { + return ChatNavigationButton(action: .dismiss, buttonItem: UIBarButtonItem(title: strings.Common_Done, style: .plain, target: target, action: selector)) + } + } return nil } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift index bf13645ce6..a9203282a4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift @@ -98,10 +98,13 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { private var impressionIcon: ASImageNode? private var reactionNodes: [StatusReactionNode] = [] private var reactionCountNode: TextNode? + private var reactionButtonNode: HighlightTrackingButtonNode? private var type: ChatMessageDateAndStatusType? private var theme: ChatPresentationThemeData? + var openReactions: (() -> Void)? + override init() { self.dateNode = TextNode() self.dateNode.isUserInteractionEnabled = false @@ -109,8 +112,6 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { super.init() - self.isUserInteractionEnabled = false - self.addSubnode(self.dateNode) } @@ -561,7 +562,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { node.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) } } - node.frame = CGRect(origin: CGPoint(x: reactionOffset + 1, y: backgroundInsets.top + 1.0 + offset), size: layout.size) + node.frame = CGRect(origin: CGPoint(x: reactionOffset + 1.0, y: backgroundInsets.top + 1.0 + offset), size: layout.size) + reactionOffset += 1.0 + layout.size.width } else if let reactionCountNode = strongSelf.reactionCountNode { strongSelf.reactionCountNode = nil if animated { @@ -572,6 +574,27 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { reactionCountNode.removeFromSupernode() } } + + if !strongSelf.reactionNodes.isEmpty { + if strongSelf.reactionButtonNode == nil { + let reactionButtonNode = HighlightTrackingButtonNode() + strongSelf.reactionButtonNode = reactionButtonNode + strongSelf.addSubnode(reactionButtonNode) + reactionButtonNode.addTarget(strongSelf, action: #selector(strongSelf.reactionButtonPressed), forControlEvents: .touchUpInside) + reactionButtonNode.highligthedChanged = { [weak strongSelf] highlighted in + guard let strongSelf = strongSelf else { + return + } + if highlighted { + strongSelf.reactionButtonPressed() + } + } + } + strongSelf.reactionButtonNode?.frame = CGRect(origin: CGPoint(x: leftInset - reactionInset + backgroundInsets.left - 5.0, y: backgroundInsets.top + 1.0 + offset - 5.0), size: CGSize(width: reactionOffset + 5.0 * 2.0, height: 20.0)) + } else if let reactionButtonNode = strongSelf.reactionButtonNode { + strongSelf.reactionButtonNode = nil + reactionButtonNode.removeFromSupernode() + } } }) } @@ -605,4 +628,17 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { } return nil } + + @objc private func reactionButtonPressed() { + self.openReactions?() + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if let reactionButtonNode = self.reactionButtonNode { + if reactionButtonNode.frame.contains(point) { + return reactionButtonNode.view + } + } + return nil + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 28e189b189..4a2c5d3a67 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -65,6 +65,13 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { self.textAccessibilityOverlayNode.openUrl = { [weak self] url in self?.item?.controllerInteraction.openUrl(url, false, false) } + + self.statusNode.openReactions = { [weak self] in + guard let strongSelf = self, let item = strongSelf.item else { + return + } + item.controllerInteraction.openMessageReactions(item.message.id) + } } required init?(coder aDecoder: NSCoder) { diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 3cdbbaf05d..dcc4f15462 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -411,6 +411,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, editScheduledMessagesTime: { _ in }, performTextSelectionAction: { _, _, _ in }, updateMessageReaction: { _, _ in + }, openMessageReactions: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: self.automaticMediaDownloadSettings, diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift index 76554ee22c..f3cd2f7bfe 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift @@ -113,6 +113,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu }, editScheduledMessagesTime: { _ in }, performTextSelectionAction: { _, _, _ in }, updateMessageReaction: { _, _ in + }, openMessageReactions: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, pollActionState: ChatInterfacePollActionState(), stickerSettings: ChatInterfaceStickerSettings(loopAnimatedStickers: false)) diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index 4702f224f8..f22b6c8c5d 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -287,6 +287,7 @@ public class PeerMediaCollectionController: TelegramBaseController { }, editScheduledMessagesTime: { _ in }, performTextSelectionAction: { _, _, _ in }, updateMessageReaction: { _, _ in + }, openMessageReactions: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index 994c9fab79..e46f7751ad 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -178,6 +178,7 @@ D06BB8821F58994B0084FC30 /* LegacyInstantVideoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06BB8811F58994B0084FC30 /* LegacyInstantVideoController.swift */; }; D06E0F8E1F79ABFB003CF3DD /* ChatLoadingNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E0F8D1F79ABFB003CF3DD /* ChatLoadingNode.swift */; }; D06F1EA41F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06F1EA31F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift */; }; + D072F38423155EAF0009E66F /* MessageReactionListUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D072F38323155EAF0009E66F /* MessageReactionListUI.framework */; }; D0750C7822B2A13300BE5F6E /* UniversalMediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C7722B2A13300BE5F6E /* UniversalMediaPlayer.framework */; }; D0750C7A22B2A14300BE5F6E /* DeviceAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C7922B2A14300BE5F6E /* DeviceAccess.framework */; }; D0750C7C22B2A14300BE5F6E /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C7B22B2A14300BE5F6E /* TelegramPresentationData.framework */; }; @@ -812,6 +813,7 @@ D06BB8811F58994B0084FC30 /* LegacyInstantVideoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyInstantVideoController.swift; sourceTree = ""; }; D06E0F8D1F79ABFB003CF3DD /* ChatLoadingNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatLoadingNode.swift; sourceTree = ""; }; D06F1EA31F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatHistorySearchContainerNode.swift; sourceTree = ""; }; + D072F38323155EAF0009E66F /* MessageReactionListUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MessageReactionListUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D073CE621DCBBE5D007511FD /* MessageSent.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = MessageSent.caf; path = TelegramUI/Sounds/MessageSent.caf; sourceTree = ""; }; D073CE641DCBC26B007511FD /* ServiceSoundManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceSoundManager.swift; sourceTree = ""; }; D073CE701DCBF23F007511FD /* DeclareEncodables.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeclareEncodables.swift; sourceTree = ""; }; @@ -1169,6 +1171,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D072F38423155EAF0009E66F /* MessageReactionListUI.framework in Frameworks */, D03E495D230868DF0049C28B /* PersistentStringHash.framework in Frameworks */, D03E493C2308679D0049C28B /* InstantPageCache.framework in Frameworks */, D03E4910230866280049C28B /* GridMessageSelectionNode.framework in Frameworks */, @@ -1773,6 +1776,7 @@ D08D45281D5E340200A7428A /* Frameworks */ = { isa = PBXGroup; children = ( + D072F38323155EAF0009E66F /* MessageReactionListUI.framework */, D03E495C230868DF0049C28B /* PersistentStringHash.framework */, D03E493B2308679D0049C28B /* InstantPageCache.framework */, D03E490F230866280049C28B /* GridMessageSelectionNode.framework */, From e89492b30ca17e9594afb866ac746c4b566f5095 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 27 Aug 2019 20:45:09 +0400 Subject: [PATCH 35/86] Update API --- NotificationService/Serialization.m | 2 +- NotificationService/Serialization.swift | 2 +- Telegram-iOS/en.lproj/Localizable.strings | 6 +- .../AvatarNode/Sources/AvatarNode.swift | 3 + submodules/Display/Display/ListView.swift | 75 +- .../Sources/ItemListPeerItem.swift | 18 +- .../MessageReactionListController.swift | 18 +- .../Sources/GroupInfoController.swift | 2 +- .../PrivacyAndSecurityController.swift | 26 +- .../SelectivePrivacySettingsController.swift | 140 +- .../Search/SettingsSearchableItems.swift | 2 +- submodules/TelegramApi/Sources/Api0.swift | 4 +- submodules/TelegramApi/Sources/Api1.swift | 68 +- .../TelegramCore/PrivacySettings.swift | 7 +- .../UpdatedAccountPrivacySettings.swift | 34 +- .../Sources/PresentationStrings.swift | 6232 +++++++++-------- .../ChatMessageDateAndStatusNode.swift | 9 +- .../ChatMessageTextBubbleContentNode.swift | 5 +- .../Resources/PresentationStrings.mapping | Bin 124717 -> 124820 bytes 19 files changed, 3411 insertions(+), 3242 deletions(-) diff --git a/NotificationService/Serialization.m b/NotificationService/Serialization.m index a10db76cba..6f6f9191a5 100644 --- a/NotificationService/Serialization.m +++ b/NotificationService/Serialization.m @@ -3,7 +3,7 @@ @implementation Serialization - (NSUInteger)currentLayer { - return 105; + return 106; } - (id _Nullable)parseMessage:(NSData * _Nullable)data { diff --git a/NotificationService/Serialization.swift b/NotificationService/Serialization.swift index 685b3cacb9..f0477c29cc 100644 --- a/NotificationService/Serialization.swift +++ b/NotificationService/Serialization.swift @@ -14,7 +14,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 105 + return 106 } public func parseMessage(_ data: Data!) -> Any! { diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index a3d042db4f..324c60665b 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -111,7 +111,7 @@ "PUSH_MESSAGE" = "%1$@|sent you a message"; "PUSH_MESSAGES_1" = "%1$@|sent you a message"; "PUSH_MESSAGES_any" = "%1$@|sent you %2$d messages"; -"PUSH_MESSAGE_ALBUM" = "%1$@|sent you an album"; +"PUSH_ALBUM" = "%1$@|sent you an album"; "PUSH_CHANNEL_MESSAGE_TEXT" = "%1$@|%2$@"; "PUSH_CHANNEL_MESSAGE_NOTEXT" = "%1$@|posted a message"; @@ -4280,6 +4280,10 @@ Sorry for the inconvenience."; "Privacy.AddNewPeer" = "Add Users or Groups"; "PrivacyPhoneNumberSettings.WhoCanSeeMyPhoneNumber" = "WHO CAN SEE MY PHONE NUMBER"; "PrivacyPhoneNumberSettings.CustomHelp" = "Users who already have your number saved in the contacts will also see it on Telegram."; +"PrivacyPhoneNumberSettings.CustomDisabledHelp" = "Users who add your number to their contacts will see it on Telegram only if they are your contacts."; + +"PrivacyPhoneNumberSettings.DiscoveryHeader" = "WHO CAN FIND ME BY MY NUMBER"; + "Privacy.PhoneNumber" = "Phone Number"; "PrivacySettings.PhoneNumber" = "Phone Number"; "Contacts.SearchUsersAndGroupsLabel" = "Search for users and groups"; diff --git a/submodules/AvatarNode/Sources/AvatarNode.swift b/submodules/AvatarNode/Sources/AvatarNode.swift index bbc1e08d3f..91c25c2819 100644 --- a/submodules/AvatarNode/Sources/AvatarNode.swift +++ b/submodules/AvatarNode/Sources/AvatarNode.swift @@ -344,6 +344,9 @@ public final class AvatarNode: ASDisplayNode { if self.parameters == nil || self.parameters != parameters { self.parameters = parameters self.setNeedsDisplay() + if synchronousLoad { + self.recursivelyEnsureDisplaySynchronously(true) + } } } } diff --git a/submodules/Display/Display/ListView.swift b/submodules/Display/Display/ListView.swift index 18e06e8c95..bebefcd7e3 100644 --- a/submodules/Display/Display/ListView.swift +++ b/submodules/Display/Display/ListView.swift @@ -1063,7 +1063,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture if self.stackFromBottom { topOffset = self.visibleSize.height } else { - topOffset = 0.0 + topOffset = self.insets.top } } } @@ -1159,52 +1159,51 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture private func updateScroller(transition: ContainedViewLayoutTransition) { self.updateOverlayHighlight(transition: transition) - if self.itemNodes.count == 0 { - return - } - var topItemFound: Bool = false var bottomItemFound: Bool = false var topItemEdge: CGFloat = 0.0 var bottomItemEdge: CGFloat = 0.0 + var completeHeight: CGFloat = 0.0 - for i in 0 ..< self.itemNodes.count { - if let index = self.itemNodes[i].index { - if index == 0 { - topItemFound = true - topItemEdge = self.itemNodes[0].apparentFrame.origin.y - break + if !self.itemNodes.isEmpty { + for i in 0 ..< self.itemNodes.count { + if let index = self.itemNodes[i].index { + if index == 0 { + topItemFound = true + topItemEdge = self.itemNodes[0].apparentFrame.origin.y + break + } } } - } - - var effectiveInsets = self.insets - if topItemFound && !self.stackFromBottomInsetItemFactor.isZero { - let additionalInverseTopInset = self.calculateAdditionalTopInverseInset() - effectiveInsets.top = max(effectiveInsets.top, self.visibleSize.height - additionalInverseTopInset) - } - - var completeHeight = effectiveInsets.top + effectiveInsets.bottom - - if let index = self.itemNodes[self.itemNodes.count - 1].index, index == self.items.count - 1 { - bottomItemFound = true - bottomItemEdge = self.itemNodes[self.itemNodes.count - 1].apparentFrame.maxY - } - - topItemEdge -= effectiveInsets.top - bottomItemEdge += effectiveInsets.bottom - - if topItemFound && bottomItemFound { - for itemNode in self.itemNodes { - completeHeight += itemNode.apparentBounds.height + + var effectiveInsets = self.insets + if topItemFound && !self.stackFromBottomInsetItemFactor.isZero { + let additionalInverseTopInset = self.calculateAdditionalTopInverseInset() + effectiveInsets.top = max(effectiveInsets.top, self.visibleSize.height - additionalInverseTopInset) } - if self.stackFromBottom { - let updatedCompleteHeight = max(completeHeight, self.visibleSize.height) - let deltaCompleteHeight = updatedCompleteHeight - completeHeight - topItemEdge -= deltaCompleteHeight - bottomItemEdge -= deltaCompleteHeight - completeHeight = updatedCompleteHeight + completeHeight = effectiveInsets.top + effectiveInsets.bottom + + if let index = self.itemNodes[self.itemNodes.count - 1].index, index == self.items.count - 1 { + bottomItemFound = true + bottomItemEdge = self.itemNodes[self.itemNodes.count - 1].apparentFrame.maxY + } + + topItemEdge -= effectiveInsets.top + bottomItemEdge += effectiveInsets.bottom + + if topItemFound && bottomItemFound { + for itemNode in self.itemNodes { + completeHeight += itemNode.apparentBounds.height + } + + if self.stackFromBottom { + let updatedCompleteHeight = max(completeHeight, self.visibleSize.height) + let deltaCompleteHeight = updatedCompleteHeight - completeHeight + topItemEdge -= deltaCompleteHeight + bottomItemEdge -= deltaCompleteHeight + completeHeight = updatedCompleteHeight + } } } diff --git a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift index f66a5dfd24..e06d4c5d21 100644 --- a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift +++ b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift @@ -35,9 +35,14 @@ public enum ItemListPeerItemText { case none } +public enum ItemListPeerItemLabelFont { + case standard + case custom(UIFont) +} + public enum ItemListPeerItemLabel { case none - case text(String) + case text(String, ItemListPeerItemLabelFont) case disclosure(String) case badge(String) } @@ -497,8 +502,15 @@ public class ItemListPeerItemNode: ItemListRevealOptionsItemNode, ItemListItemNo switch item.label { case .none: break - case let .text(text): - labelAttributedString = NSAttributedString(string: text, font: labelFont, textColor: item.theme.list.itemSecondaryTextColor) + case let .text(text, font): + let selectedFont: UIFont + switch font { + case .standard: + selectedFont = labelFont + case let .custom(value): + selectedFont = value + } + labelAttributedString = NSAttributedString(string: text, font: selectedFont, textColor: item.theme.list.itemSecondaryTextColor) labelInset += 15.0 case let .disclosure(text): if let currentLabelArrowNode = currentLabelArrowNode { diff --git a/submodules/MessageReactionListUI/Sources/MessageReactionListController.swift b/submodules/MessageReactionListUI/Sources/MessageReactionListController.swift index c61df42470..edcd28fd0e 100644 --- a/submodules/MessageReactionListUI/Sources/MessageReactionListController.swift +++ b/submodules/MessageReactionListUI/Sources/MessageReactionListController.swift @@ -92,7 +92,7 @@ private struct MessageReactionListEntry: Comparable, Identifiable { } func item(context: AccountContext, presentationData: PresentationData) -> ListViewItem { - return ItemListPeerItem(theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, account: context.account, peer: self.item.peer, height: .peerList, nameStyle: .distinctBold, presence: nil, text: .none, label: .text(self.item.reaction), editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: false, sectionId: 0, action: { + return ItemListPeerItem(theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, account: context.account, peer: self.item.peer, height: .peerList, nameStyle: .distinctBold, presence: nil, text: .none, label: .text(self.item.reaction, .custom(Font.regular(19.0))), editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: false, sectionId: 0, action: { }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, noInsets: true, tag: nil) } @@ -338,17 +338,20 @@ private final class MessageReactionListControllerNode: ViewControllerTracingNode for item in categoryState.items { entries.append(MessageReactionListEntry(index: entries.count, item: item)) } - if !categoryState.items.isEmpty { - self.isReady.set(.single(true)) - } } index += 1 } let transaction = preparedTransition(from: self.currentEntries ?? [], to: entries, context: self.context, presentationData: self.presentatonData) + let previousWasEmpty = self.currentEntries == nil || self.currentEntries?.count == 0 + let isEmpty = entries.isEmpty self.currentEntries = entries self.enqueuedTransactions.append(transaction) self.dequeueTransaction() + + if previousWasEmpty && !isEmpty { + self.listNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.18) + } } func setCategory(_ category: MessageReactionListCategory) { @@ -359,7 +362,7 @@ private final class MessageReactionListControllerNode: ViewControllerTracingNode itemNode.isSelected = category == itemNode.category } - self.forceHeaderTransition = .animated(duration: 0.3, curve: .spring) + //self.forceHeaderTransition = .animated(duration: 0.3, curve: .spring) if let validLayout = self.validLayout { self.containerLayoutUpdated(layout: validLayout, transition: .animated(duration: 0.3, curve: .spring)) } @@ -395,9 +398,10 @@ private final class MessageReactionListControllerNode: ViewControllerTracingNode insets.top = topInsetForLayout(layout: layout, itemCount: currentCategoryItemCount) insets.bottom = layout.intrinsicInsets.bottom - let updateSizeAndInsets = ListViewUpdateSizeAndInsets(size: self.listNode.bounds.size, insets: insets, duration: 0.0, curve: .Default(duration: nil)) + let updateSizeAndInsets = ListViewUpdateSizeAndInsets(size: self.listNode.bounds.size, insets: insets, duration: 0.3, curve: .Default(duration: 0.3)) - self.listNode.transaction(deleteIndices: transaction.deletions, insertIndicesAndItems: transaction.insertions, updateIndicesAndItems: transaction.updates, options: options, updateSizeAndInsets: updateSizeAndInsets, updateOpaqueState: nil, completion: { _ in + self.listNode.transaction(deleteIndices: transaction.deletions, insertIndicesAndItems: transaction.insertions, updateIndicesAndItems: transaction.updates, options: options, updateSizeAndInsets: updateSizeAndInsets, updateOpaqueState: nil, completion: { [weak self] _ in + self?.isReady.set(.single(true)) }) } diff --git a/submodules/PeerInfoUI/Sources/GroupInfoController.swift b/submodules/PeerInfoUI/Sources/GroupInfoController.swift index 29ef37b4f3..e4efa8bec2 100644 --- a/submodules/PeerInfoUI/Sources/GroupInfoController.swift +++ b/submodules/PeerInfoUI/Sources/GroupInfoController.swift @@ -578,7 +578,7 @@ private enum GroupInfoEntry: ItemListNodeEntry { } })) } - return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer, presence: presence, text: .presence, label: label == nil ? .none : .text(label!), editing: editing, revealOptions: ItemListPeerItemRevealOptions(options: options), switchValue: nil, enabled: enabled, selectable: selectable, sectionId: self.section, action: { + return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer, presence: presence, text: .presence, label: label == nil ? .none : .text(label!, .standard), editing: editing, revealOptions: ItemListPeerItemRevealOptions(options: options), switchValue: nil, enabled: enabled, selectable: selectable, sectionId: self.section, action: { if let infoController = arguments.context.sharedContext.makePeerInfoController(context: arguments.context, peer: peer, mode: .generic), selectable { arguments.pushController(infoController) } diff --git a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift index a1ddc1f992..de63a01d1c 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift @@ -473,7 +473,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue currentInfoDisposable.set(signal.start(next: { [weak currentInfoDisposable] info in if let info = info { - pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .presence, current: info.presence, updated: { updated, _ in + pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .presence, current: info.presence, updated: { updated, _, _ in if let currentInfoDisposable = currentInfoDisposable { let applySetting: Signal = privacySettingsPromise.get() |> filter { $0 != nil } @@ -481,7 +481,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue |> mapToSignal { value -> Signal in if let value = value { - privacySettingsPromise.set(.single(AccountPrivacySettings(presence: updated, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, accountRemovalTimeout: value.accountRemovalTimeout))) + privacySettingsPromise.set(.single(AccountPrivacySettings(presence: updated, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, phoneDiscoveryEnabled: value.phoneDiscoveryEnabled, accountRemovalTimeout: value.accountRemovalTimeout))) } return .complete() } @@ -496,7 +496,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue currentInfoDisposable.set(signal.start(next: { [weak currentInfoDisposable] info in if let info = info { - pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .groupInvitations, current: info.groupInvitations, updated: { updated, _ in + pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .groupInvitations, current: info.groupInvitations, updated: { updated, _, _ in if let currentInfoDisposable = currentInfoDisposable { let applySetting: Signal = privacySettingsPromise.get() |> filter { $0 != nil } @@ -504,7 +504,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue |> mapToSignal { value -> Signal in if let value = value { - privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: updated, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, accountRemovalTimeout: value.accountRemovalTimeout))) + privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: updated, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, phoneDiscoveryEnabled: value.phoneDiscoveryEnabled, accountRemovalTimeout: value.accountRemovalTimeout))) } return .complete() } @@ -529,7 +529,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting currentInfoDisposable.set((combineLatest(privacySignal, callsSignal) |> deliverOnMainQueue).start(next: { [weak currentInfoDisposable] info, callSettings in if let info = info { - pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .voiceCalls, current: info.voiceCalls, callSettings: (info.voiceCallsP2P, callSettings.0), voipConfiguration: callSettings.1, callIntegrationAvailable: CallKitIntegration.isAvailable, updated: { updated, updatedCallSettings in + pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .voiceCalls, current: info.voiceCalls, callSettings: (info.voiceCallsP2P, callSettings.0), voipConfiguration: callSettings.1, callIntegrationAvailable: CallKitIntegration.isAvailable, updated: { updated, updatedCallSettings, _ in if let currentInfoDisposable = currentInfoDisposable, let (updatedCallsPrivacy, updatedCallSettings) = updatedCallSettings { let _ = updateVoiceCallSettingsSettingsInteractively(accountManager: context.sharedContext.accountManager, { _ in return updatedCallSettings @@ -541,7 +541,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue |> mapToSignal { value -> Signal in if let value = value { - privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: updated, voiceCallsP2P: updatedCallsPrivacy, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, accountRemovalTimeout: value.accountRemovalTimeout))) + privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: updated, voiceCallsP2P: updatedCallsPrivacy, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, phoneDiscoveryEnabled: value.phoneDiscoveryEnabled, accountRemovalTimeout: value.accountRemovalTimeout))) } return .complete() } @@ -556,7 +556,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue currentInfoDisposable.set(signal.start(next: { [weak currentInfoDisposable] info in if let info = info { - pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .profilePhoto, current: info.profilePhoto, updated: { updated, _ in + pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .profilePhoto, current: info.profilePhoto, updated: { updated, _, _ in if let currentInfoDisposable = currentInfoDisposable { let applySetting: Signal = privacySettingsPromise.get() |> filter { $0 != nil } @@ -564,7 +564,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue |> mapToSignal { value -> Signal in if let value = value { - privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: updated, forwards: value.forwards, phoneNumber: value.phoneNumber, accountRemovalTimeout: value.accountRemovalTimeout))) + privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: updated, forwards: value.forwards, phoneNumber: value.phoneNumber, phoneDiscoveryEnabled: value.phoneDiscoveryEnabled, accountRemovalTimeout: value.accountRemovalTimeout))) } return .complete() } @@ -579,7 +579,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue currentInfoDisposable.set(signal.start(next: { [weak currentInfoDisposable] info in if let info = info { - pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .forwards, current: info.forwards, updated: { updated, _ in + pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .forwards, current: info.forwards, updated: { updated, _, _ in if let currentInfoDisposable = currentInfoDisposable { let applySetting: Signal = privacySettingsPromise.get() |> filter { $0 != nil } @@ -587,7 +587,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue |> mapToSignal { value -> Signal in if let value = value { - privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: updated, phoneNumber: value.phoneNumber, accountRemovalTimeout: value.accountRemovalTimeout))) + privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: updated, phoneNumber: value.phoneNumber, phoneDiscoveryEnabled: value.phoneDiscoveryEnabled, accountRemovalTimeout: value.accountRemovalTimeout))) } return .complete() } @@ -602,7 +602,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue currentInfoDisposable.set(signal.start(next: { [weak currentInfoDisposable] info in if let info = info { - pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .phoneNumber, current: info.phoneNumber, updated: { updated, _ in + pushControllerImpl?(selectivePrivacySettingsController(context: context, kind: .phoneNumber, current: info.phoneNumber, phoneDiscoveryEnabled: info.phoneDiscoveryEnabled, updated: { updated, _, updatedDiscoveryEnabled in if let currentInfoDisposable = currentInfoDisposable { let applySetting: Signal = privacySettingsPromise.get() |> filter { $0 != nil } @@ -610,7 +610,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue |> mapToSignal { value -> Signal in if let value = value { - privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: updated, accountRemovalTimeout: value.accountRemovalTimeout))) + privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: updated, phoneDiscoveryEnabled: updatedDiscoveryEnabled ?? value.phoneDiscoveryEnabled, accountRemovalTimeout: value.accountRemovalTimeout))) } return .complete() } @@ -678,7 +678,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting |> deliverOnMainQueue |> mapToSignal { value -> Signal in if let value = value { - privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, accountRemovalTimeout: timeout))) + privacySettingsPromise.set(.single(AccountPrivacySettings(presence: value.presence, groupInvitations: value.groupInvitations, voiceCalls: value.voiceCalls, voiceCallsP2P: value.voiceCallsP2P, profilePhoto: value.profilePhoto, forwards: value.forwards, phoneNumber: value.phoneNumber, phoneDiscoveryEnabled: value.phoneDiscoveryEnabled, accountRemovalTimeout: timeout))) } return .complete() } diff --git a/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift index c08f21f910..0b573bcd82 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift @@ -48,14 +48,16 @@ private final class SelectivePrivacySettingsControllerArguments { let updateCallP2PMode: ((SelectivePrivacySettingType) -> Void)? let updateCallIntegrationEnabled: ((Bool) -> Void)? + let updatePhoneDiscovery: ((Bool) -> Void)? - init(context: AccountContext, updateType: @escaping (SelectivePrivacySettingType) -> Void, openSelective: @escaping (SelectivePrivacySettingsPeerTarget, Bool) -> Void, updateCallP2PMode: ((SelectivePrivacySettingType) -> Void)?, updateCallIntegrationEnabled: ((Bool) -> Void)?) { + init(context: AccountContext, updateType: @escaping (SelectivePrivacySettingType) -> Void, openSelective: @escaping (SelectivePrivacySettingsPeerTarget, Bool) -> Void, updateCallP2PMode: ((SelectivePrivacySettingType) -> Void)?, updateCallIntegrationEnabled: ((Bool) -> Void)?, updatePhoneDiscovery: ((Bool) -> Void)?) { self.context = context self.updateType = updateType self.openSelective = openSelective self.updateCallP2PMode = updateCallP2PMode self.updateCallIntegrationEnabled = updateCallIntegrationEnabled + self.updatePhoneDiscovery = updatePhoneDiscovery } } @@ -66,6 +68,7 @@ private enum SelectivePrivacySettingsSection: Int32 { case callsP2P case callsP2PPeers case callsIntegrationEnabled + case phoneDiscovery } private func stringForUserCount(_ peers: [PeerId: SelectivePrivacyPeer], strings: PresentationStrings) -> String { @@ -102,6 +105,9 @@ private enum SelectivePrivacySettingsEntry: ItemListNodeEntry { case callsP2PPeersInfo(PresentationTheme, String) case callsIntegrationEnabled(PresentationTheme, String, Bool) case callsIntegrationInfo(PresentationTheme, String) + case phoneDiscoveryHeader(PresentationTheme, String) + case phoneDiscoveryEverybody(PresentationTheme, String, Bool) + case phoneDiscoveryMyContacts(PresentationTheme, String, Bool) var section: ItemListSectionId { switch self { @@ -117,6 +123,8 @@ private enum SelectivePrivacySettingsEntry: ItemListNodeEntry { return SelectivePrivacySettingsSection.callsP2PPeers.rawValue case .callsIntegrationEnabled, .callsIntegrationInfo: return SelectivePrivacySettingsSection.callsIntegrationEnabled.rawValue + case .phoneDiscoveryHeader, .phoneDiscoveryEverybody, .phoneDiscoveryMyContacts: + return SelectivePrivacySettingsSection.phoneDiscovery.rawValue } } @@ -136,34 +144,40 @@ private enum SelectivePrivacySettingsEntry: ItemListNodeEntry { return 5 case .settingInfo: return 6 - case .exceptionsHeader: + case .phoneDiscoveryHeader: return 7 - case .disableFor: + case .phoneDiscoveryEverybody: return 8 - case .enableFor: + case .phoneDiscoveryMyContacts: return 9 - case .peersInfo: + case .exceptionsHeader: return 10 - case .callsP2PHeader: + case .disableFor: return 11 - case .callsP2PAlways: + case .enableFor: return 12 - case .callsP2PContacts: + case .peersInfo: return 13 - case .callsP2PNever: + case .callsP2PHeader: return 14 - case .callsP2PInfo: + case .callsP2PAlways: return 15 - case .callsP2PDisableFor: + case .callsP2PContacts: return 16 - case .callsP2PEnableFor: + case .callsP2PNever: return 17 - case .callsP2PPeersInfo: + case .callsP2PInfo: return 18 - case .callsIntegrationEnabled: + case .callsP2PDisableFor: return 19 - case .callsIntegrationInfo: + case .callsP2PEnableFor: return 20 + case .callsP2PPeersInfo: + return 21 + case .callsIntegrationEnabled: + return 22 + case .callsIntegrationInfo: + return 23 } } @@ -295,6 +309,24 @@ private enum SelectivePrivacySettingsEntry: ItemListNodeEntry { } else { return false } + case let .phoneDiscoveryHeader(lhsTheme, lhsText): + if case let .phoneDiscoveryHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .phoneDiscoveryEverybody(lhsTheme, lhsText, lhsValue): + if case let .phoneDiscoveryEverybody(rhsTheme, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue { + return true + } else { + return false + } + case let .phoneDiscoveryMyContacts(lhsTheme, lhsText, lhsValue): + if case let .phoneDiscoveryMyContacts(rhsTheme, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue { + return true + } else { + return false + } } } @@ -368,6 +400,16 @@ private enum SelectivePrivacySettingsEntry: ItemListNodeEntry { }) case let .callsIntegrationInfo(theme, text): return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) + case let .phoneDiscoveryHeader(theme, text): + return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .phoneDiscoveryEverybody(theme, text, value): + return ItemListCheckboxItem(theme: theme, title: text, style: .left, checked: value, zeroSeparatorInsets: false, sectionId: self.section, action: { + arguments.updatePhoneDiscovery?(true) + }) + case let .phoneDiscoveryMyContacts(theme, text, value): + return ItemListCheckboxItem(theme: theme, title: text, style: .left, checked: value, zeroSeparatorInsets: false, sectionId: self.section, action: { + arguments.updatePhoneDiscovery?(false) + }) } } } @@ -385,8 +427,9 @@ private struct SelectivePrivacySettingsControllerState: Equatable { let callP2PDisableFor: [PeerId: SelectivePrivacyPeer]? let callIntegrationAvailable: Bool? let callIntegrationEnabled: Bool? + let phoneDiscoveryEnabled: Bool? - init(setting: SelectivePrivacySettingType, enableFor: [PeerId: SelectivePrivacyPeer], disableFor: [PeerId: SelectivePrivacyPeer], saving: Bool, callDataSaving: VoiceCallDataSaving?, callP2PMode: SelectivePrivacySettingType?, callP2PEnableFor: [PeerId: SelectivePrivacyPeer]?, callP2PDisableFor: [PeerId: SelectivePrivacyPeer]?, callIntegrationAvailable: Bool?, callIntegrationEnabled: Bool?) { + init(setting: SelectivePrivacySettingType, enableFor: [PeerId: SelectivePrivacyPeer], disableFor: [PeerId: SelectivePrivacyPeer], saving: Bool, callDataSaving: VoiceCallDataSaving?, callP2PMode: SelectivePrivacySettingType?, callP2PEnableFor: [PeerId: SelectivePrivacyPeer]?, callP2PDisableFor: [PeerId: SelectivePrivacyPeer]?, callIntegrationAvailable: Bool?, callIntegrationEnabled: Bool?, phoneDiscoveryEnabled: Bool?) { self.setting = setting self.enableFor = enableFor self.disableFor = disableFor @@ -397,6 +440,7 @@ private struct SelectivePrivacySettingsControllerState: Equatable { self.callP2PDisableFor = callP2PDisableFor self.callIntegrationAvailable = callIntegrationAvailable self.callIntegrationEnabled = callIntegrationEnabled + self.phoneDiscoveryEnabled = phoneDiscoveryEnabled } static func ==(lhs: SelectivePrivacySettingsControllerState, rhs: SelectivePrivacySettingsControllerState) -> Bool { @@ -430,40 +474,47 @@ private struct SelectivePrivacySettingsControllerState: Equatable { if lhs.callIntegrationEnabled != rhs.callIntegrationEnabled { return false } + if lhs.phoneDiscoveryEnabled != rhs.phoneDiscoveryEnabled { + return false + } return true } func withUpdatedSetting(_ setting: SelectivePrivacySettingType) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled) + return SelectivePrivacySettingsControllerState(setting: setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) } func withUpdatedEnableFor(_ enableFor: [PeerId: SelectivePrivacyPeer]) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled) + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) } func withUpdatedDisableFor(_ disableFor: [PeerId: SelectivePrivacyPeer]) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled) + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) } func withUpdatedSaving(_ saving: Bool) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled) + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) } func withUpdatedCallP2PMode(_ mode: SelectivePrivacySettingType) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: mode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled) + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: mode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) } func withUpdatedCallP2PEnableFor(_ enableFor: [PeerId: SelectivePrivacyPeer]) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: enableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled) + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: enableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) } func withUpdatedCallP2PDisableFor(_ disableFor: [PeerId: SelectivePrivacyPeer]) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: disableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled) + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: disableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) } func withUpdatedCallsIntegrationEnabled(_ enabled: Bool) -> SelectivePrivacySettingsControllerState { - return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: enabled) + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: enabled, phoneDiscoveryEnabled: self.phoneDiscoveryEnabled) + } + + func withUpdatedPhoneDiscoveryEnabled(_ phoneDiscoveryEnabled: Bool) -> SelectivePrivacySettingsControllerState { + return SelectivePrivacySettingsControllerState(setting: self.setting, enableFor: self.enableFor, disableFor: self.disableFor, saving: self.saving, callDataSaving: self.callDataSaving, callP2PMode: self.callP2PMode, callP2PEnableFor: self.callP2PEnableFor, callP2PDisableFor: self.callP2PDisableFor, callIntegrationAvailable: self.callIntegrationAvailable, callIntegrationEnabled: self.callIntegrationEnabled, phoneDiscoveryEnabled: phoneDiscoveryEnabled) } } @@ -502,7 +553,11 @@ private func selectivePrivacySettingsControllerEntries(presentationData: Present enableForText = presentationData.strings.Privacy_GroupsAndChannels_AlwaysAllow case .phoneNumber: settingTitle = presentationData.strings.PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber - settingInfoText = presentationData.strings.PrivacyPhoneNumberSettings_CustomHelp + if state.setting == .nobody, state.phoneDiscoveryEnabled == false { + settingInfoText = presentationData.strings.PrivacyPhoneNumberSettings_CustomDisabledHelp + } else { + settingInfoText = presentationData.strings.PrivacyPhoneNumberSettings_CustomHelp + } disableForText = presentationData.strings.PrivacyLastSeenSettings_NeverShareWith enableForText = presentationData.strings.PrivacyLastSeenSettings_AlwaysShareWith } @@ -537,6 +592,12 @@ private func selectivePrivacySettingsControllerEntries(presentationData: Present } entries.append(.settingInfo(presentationData.theme, settingInfoText)) + if case .phoneNumber = kind, state.setting == .nobody { + entries.append(.phoneDiscoveryHeader(presentationData.theme, presentationData.strings.PrivacyPhoneNumberSettings_DiscoveryHeader)) + entries.append(.phoneDiscoveryEverybody(presentationData.theme, presentationData.strings.PrivacySettings_LastSeenEverybody, state.phoneDiscoveryEnabled != false)) + entries.append(.phoneDiscoveryMyContacts(presentationData.theme, presentationData.strings.PrivacySettings_LastSeenContacts, state.phoneDiscoveryEnabled == false)) + } + entries.append(.exceptionsHeader(presentationData.theme, presentationData.strings.GroupInfo_Permissions_Exceptions)) switch state.setting { @@ -580,7 +641,7 @@ private func selectivePrivacySettingsControllerEntries(presentationData: Present return entries } -func selectivePrivacySettingsController(context: AccountContext, kind: SelectivePrivacySettingsKind, current: SelectivePrivacySettings, callSettings: (SelectivePrivacySettings, VoiceCallSettings)? = nil, voipConfiguration: VoipConfiguration? = nil, callIntegrationAvailable: Bool? = nil, updated: @escaping (SelectivePrivacySettings, (SelectivePrivacySettings, VoiceCallSettings)?) -> Void) -> ViewController { +func selectivePrivacySettingsController(context: AccountContext, kind: SelectivePrivacySettingsKind, current: SelectivePrivacySettings, callSettings: (SelectivePrivacySettings, VoiceCallSettings)? = nil, phoneDiscoveryEnabled: Bool? = nil, voipConfiguration: VoipConfiguration? = nil, callIntegrationAvailable: Bool? = nil, updated: @escaping (SelectivePrivacySettings, (SelectivePrivacySettings, VoiceCallSettings)?, Bool?) -> Void) -> ViewController { let strings = context.sharedContext.currentPresentationData.with { $0 }.strings var initialEnableFor: [PeerId: SelectivePrivacyPeer] = [:] @@ -610,7 +671,7 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective } } - let initialState = SelectivePrivacySettingsControllerState(setting: SelectivePrivacySettingType(current), enableFor: initialEnableFor, disableFor: initialDisableFor, saving: false, callDataSaving: callSettings?.1.dataSaving, callP2PMode: callSettings != nil ? SelectivePrivacySettingType(callSettings!.0) : nil, callP2PEnableFor: initialCallP2PEnableFor, callP2PDisableFor: initialCallP2PDisableFor, callIntegrationAvailable: callIntegrationAvailable, callIntegrationEnabled: callSettings?.1.enableSystemIntegration) + let initialState = SelectivePrivacySettingsControllerState(setting: SelectivePrivacySettingType(current), enableFor: initialEnableFor, disableFor: initialDisableFor, saving: false, callDataSaving: callSettings?.1.dataSaving, callP2PMode: callSettings != nil ? SelectivePrivacySettingType(callSettings!.0) : nil, callP2PEnableFor: initialCallP2PEnableFor, callP2PDisableFor: initialCallP2PDisableFor, callIntegrationAvailable: callIntegrationAvailable, callIntegrationEnabled: callSettings?.1.enableSystemIntegration, phoneDiscoveryEnabled: phoneDiscoveryEnabled) let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) @@ -838,7 +899,7 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective return state.withUpdatedCallP2PMode(mode) } }, updateCallIntegrationEnabled: { enabled in - updateState { state in + updateState { state in return state.withUpdatedCallsIntegrationEnabled(enabled) } let _ = updateVoiceCallSettingsSettingsInteractively(accountManager: context.sharedContext.accountManager, { settings in @@ -846,6 +907,10 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective settings.enableSystemIntegration = enabled return settings }).start() + }, updatePhoneDiscovery: { value in + updateState { state in + return state.withUpdatedPhoneDiscoveryEnabled(value) + } }) let peerName = context.account.postbox.transaction { transaction -> String in @@ -883,6 +948,7 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective let callP2PSettings: SelectivePrivacySettings? let callDataSaving: VoiceCallDataSaving? let callIntegrationEnabled: Bool? + let phoneDiscoveryEnabled: Bool? } var appliedSettings: AppliedSettings? @@ -891,6 +957,7 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective var wasSaving = false var settings: SelectivePrivacySettings? var callP2PSettings: SelectivePrivacySettings? + var phoneDiscoveryEnabled: Bool? var callDataSaving: VoiceCallDataSaving? var callIntegrationEnabled: Bool? updateState { state in @@ -906,6 +973,10 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective settings = SelectivePrivacySettings.disableEveryone(enableFor: state.enableFor) } + if case .phoneNumber = kind, let value = state.phoneDiscoveryEnabled { + phoneDiscoveryEnabled = value + } + if case .voiceCalls = kind, let callP2PMode = state.callP2PMode, let disableFor = state.callP2PDisableFor, let enableFor = state.callP2PEnableFor { switch callP2PMode { case .everybody: @@ -921,7 +992,7 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective } if let settings = settings, !wasSaving { - let settingsToApply = AppliedSettings(settings: settings, callP2PSettings: callP2PSettings, callDataSaving: callDataSaving, callIntegrationEnabled: callIntegrationEnabled) + let settingsToApply = AppliedSettings(settings: settings, callP2PSettings: callP2PSettings, callDataSaving: callDataSaving, callIntegrationEnabled: callIntegrationEnabled, phoneDiscoveryEnabled: phoneDiscoveryEnabled) if appliedSettings == settingsToApply { return } @@ -948,14 +1019,19 @@ func selectivePrivacySettingsController(context: AccountContext, kind: Selective if let callP2PSettings = callP2PSettings { updateCallP2PSettingsSignal = updateSelectiveAccountPrivacySettings(account: context.account, type: .voiceCallsP2P, settings: callP2PSettings) } + var updatePhoneDiscoverySignal: Signal = Signal.complete() + if let phoneDiscoveryEnabled = phoneDiscoveryEnabled { + updatePhoneDiscoverySignal = updatePhoneNumberDiscovery(account: context.account, value: phoneDiscoveryEnabled) + } - let _ = (combineLatest(updateSettingsSignal, updateCallP2PSettingsSignal) |> deliverOnMainQueue).start(completed: { + let _ = (combineLatest(updateSettingsSignal, updateCallP2PSettingsSignal, updatePhoneDiscoverySignal) + |> deliverOnMainQueue).start(completed: { }) if case .voiceCalls = kind, let dataSaving = callDataSaving, let callP2PSettings = callP2PSettings, let systemIntegrationEnabled = callIntegrationEnabled { - updated(settings, (callP2PSettings, VoiceCallSettings(dataSaving: dataSaving, enableSystemIntegration: systemIntegrationEnabled))) + updated(settings, (callP2PSettings, VoiceCallSettings(dataSaving: dataSaving, enableSystemIntegration: systemIntegrationEnabled)), phoneDiscoveryEnabled) } else { - updated(settings, nil) + updated(settings, nil, phoneDiscoveryEnabled) } } } diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift index 7e3eeb0e65..f29b6fa615 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift @@ -467,7 +467,7 @@ private func privacySearchableItems(context: AccountContext, privacySettings: Ac current = info.phoneNumber } - present(.push, selectivePrivacySettingsController(context: context, kind: kind, current: current, callSettings: callSettings != nil ? (info.voiceCallsP2P, callSettings!.0) : nil, voipConfiguration: callSettings?.1, callIntegrationAvailable: CallKitIntegration.isAvailable, updated: { updated, updatedCallSettings in + present(.push, selectivePrivacySettingsController(context: context, kind: kind, current: current, callSettings: callSettings != nil ? (info.voiceCallsP2P, callSettings!.0) : nil, voipConfiguration: callSettings?.1, callIntegrationAvailable: CallKitIntegration.isAvailable, updated: { updated, updatedCallSettings, _ in if let (_, updatedCallSettings) = updatedCallSettings { let _ = updateVoiceCallSettingsSettingsInteractively(accountManager: context.sharedContext.accountManager, { _ in return updatedCallSettings diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 421c95d871..c6f4eed860 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -166,6 +166,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1777096355] = { return Api.PrivacyKey.parse_privacyKeyForwards($0) } dict[-1777000467] = { return Api.PrivacyKey.parse_privacyKeyProfilePhoto($0) } dict[-778378131] = { return Api.PrivacyKey.parse_privacyKeyPhoneNumber($0) } + dict[1124062251] = { return Api.PrivacyKey.parse_privacyKeyAddedByPhone($0) } dict[522914557] = { return Api.Update.parse_updateNewMessage($0) } dict[1318109142] = { return Api.Update.parse_updateMessageID($0) } dict[-1576161051] = { return Api.Update.parse_updateDeleteMessages($0) } @@ -239,8 +240,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1263546448] = { return Api.Update.parse_updatePeerLocated($0) } dict[967122427] = { return Api.Update.parse_updateNewScheduledMessage($0) } dict[-1870238482] = { return Api.Update.parse_updateDeleteScheduledMessages($0) } - dict[357013699] = { return Api.Update.parse_updateMessageReactions($0) } dict[-2112423005] = { return Api.Update.parse_updateTheme($0) } + dict[357013699] = { return Api.Update.parse_updateMessageReactions($0) } dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) } dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) } dict[367766557] = { return Api.ChannelParticipant.parse_channelParticipant($0) } @@ -448,6 +449,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1529000952] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyForwards($0) } dict[1461304012] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyProfilePhoto($0) } dict[55761658] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyPhoneNumber($0) } + dict[-786326563] = { return Api.InputPrivacyKey.parse_inputPrivacyKeyAddedByPhone($0) } dict[235081943] = { return Api.help.RecentMeUrls.parse_recentMeUrls($0) } dict[-1606526075] = { return Api.ReplyMarkup.parse_replyKeyboardHide($0) } dict[-200242528] = { return Api.ReplyMarkup.parse_replyKeyboardForceReply($0) } diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index b935356ca5..687ae5d6b6 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -3967,6 +3967,7 @@ public extension Api { case privacyKeyForwards case privacyKeyProfilePhoto case privacyKeyPhoneNumber + case privacyKeyAddedByPhone public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -4011,6 +4012,12 @@ public extension Api { buffer.appendInt32(-778378131) } + break + case .privacyKeyAddedByPhone: + if boxed { + buffer.appendInt32(1124062251) + } + break } } @@ -4031,6 +4038,8 @@ public extension Api { return ("privacyKeyProfilePhoto", []) case .privacyKeyPhoneNumber: return ("privacyKeyPhoneNumber", []) + case .privacyKeyAddedByPhone: + return ("privacyKeyAddedByPhone", []) } } @@ -4055,6 +4064,9 @@ public extension Api { public static func parse_privacyKeyPhoneNumber(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyPhoneNumber } + public static func parse_privacyKeyAddedByPhone(_ reader: BufferReader) -> PrivacyKey? { + return Api.PrivacyKey.privacyKeyAddedByPhone + } } public enum Update: TypeConstructorDescription { @@ -4131,8 +4143,8 @@ public extension Api { case updatePeerLocated(peers: [Api.PeerLocated]) case updateNewScheduledMessage(message: Api.Message) case updateDeleteScheduledMessages(peer: Api.Peer, messages: [Int32]) - case updateMessageReactions(peer: Api.Peer, msgId: Int32, reactions: Api.MessageReactions) case updateTheme(theme: Api.Theme) + case updateMessageReactions(peer: Api.Peer, msgId: Int32, reactions: Api.MessageReactions) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -4751,6 +4763,12 @@ public extension Api { serializeInt32(item, buffer: buffer, boxed: false) } break + case .updateTheme(let theme): + if boxed { + buffer.appendInt32(-2112423005) + } + theme.serialize(buffer, true) + break case .updateMessageReactions(let peer, let msgId, let reactions): if boxed { buffer.appendInt32(357013699) @@ -4759,12 +4777,6 @@ public extension Api { serializeInt32(msgId, buffer: buffer, boxed: false) reactions.serialize(buffer, true) break - case .updateTheme(let theme): - if boxed { - buffer.appendInt32(-2112423005) - } - theme.serialize(buffer, true) - break } } @@ -4916,10 +4928,10 @@ public extension Api { return ("updateNewScheduledMessage", [("message", message)]) case .updateDeleteScheduledMessages(let peer, let messages): return ("updateDeleteScheduledMessages", [("peer", peer), ("messages", messages)]) - case .updateMessageReactions(let peer, let msgId, let reactions): - return ("updateMessageReactions", [("peer", peer), ("msgId", msgId), ("reactions", reactions)]) case .updateTheme(let theme): return ("updateTheme", [("theme", theme)]) + case .updateMessageReactions(let peer, let msgId, let reactions): + return ("updateMessageReactions", [("peer", peer), ("msgId", msgId), ("reactions", reactions)]) } } @@ -6165,6 +6177,19 @@ public extension Api { return nil } } + public static func parse_updateTheme(_ reader: BufferReader) -> Update? { + var _1: Api.Theme? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.Theme + } + let _c1 = _1 != nil + if _c1 { + return Api.Update.updateTheme(theme: _1!) + } + else { + return nil + } + } public static func parse_updateMessageReactions(_ reader: BufferReader) -> Update? { var _1: Api.Peer? if let signature = reader.readInt32() { @@ -6186,19 +6211,6 @@ public extension Api { return nil } } - public static func parse_updateTheme(_ reader: BufferReader) -> Update? { - var _1: Api.Theme? - if let signature = reader.readInt32() { - _1 = Api.parse(reader, signature: signature) as? Api.Theme - } - let _c1 = _1 != nil - if _c1 { - return Api.Update.updateTheme(theme: _1!) - } - else { - return nil - } - } } public enum PopularContact: TypeConstructorDescription { @@ -11045,6 +11057,7 @@ public extension Api { case inputPrivacyKeyForwards case inputPrivacyKeyProfilePhoto case inputPrivacyKeyPhoneNumber + case inputPrivacyKeyAddedByPhone public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -11089,6 +11102,12 @@ public extension Api { buffer.appendInt32(55761658) } + break + case .inputPrivacyKeyAddedByPhone: + if boxed { + buffer.appendInt32(-786326563) + } + break } } @@ -11109,6 +11128,8 @@ public extension Api { return ("inputPrivacyKeyProfilePhoto", []) case .inputPrivacyKeyPhoneNumber: return ("inputPrivacyKeyPhoneNumber", []) + case .inputPrivacyKeyAddedByPhone: + return ("inputPrivacyKeyAddedByPhone", []) } } @@ -11133,6 +11154,9 @@ public extension Api { public static func parse_inputPrivacyKeyPhoneNumber(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyPhoneNumber } + public static func parse_inputPrivacyKeyAddedByPhone(_ reader: BufferReader) -> InputPrivacyKey? { + return Api.InputPrivacyKey.inputPrivacyKeyAddedByPhone + } } public enum ReplyMarkup: TypeConstructorDescription { diff --git a/submodules/TelegramCore/TelegramCore/PrivacySettings.swift b/submodules/TelegramCore/TelegramCore/PrivacySettings.swift index 00651e8dad..e313ecf68a 100644 --- a/submodules/TelegramCore/TelegramCore/PrivacySettings.swift +++ b/submodules/TelegramCore/TelegramCore/PrivacySettings.swift @@ -96,10 +96,11 @@ public struct AccountPrivacySettings: Equatable { public let profilePhoto: SelectivePrivacySettings public let forwards: SelectivePrivacySettings public let phoneNumber: SelectivePrivacySettings + public let phoneDiscoveryEnabled: Bool public let accountRemovalTimeout: Int32 - public init(presence: SelectivePrivacySettings, groupInvitations: SelectivePrivacySettings, voiceCalls: SelectivePrivacySettings, voiceCallsP2P: SelectivePrivacySettings, profilePhoto: SelectivePrivacySettings, forwards: SelectivePrivacySettings, phoneNumber: SelectivePrivacySettings, accountRemovalTimeout: Int32) { + public init(presence: SelectivePrivacySettings, groupInvitations: SelectivePrivacySettings, voiceCalls: SelectivePrivacySettings, voiceCallsP2P: SelectivePrivacySettings, profilePhoto: SelectivePrivacySettings, forwards: SelectivePrivacySettings, phoneNumber: SelectivePrivacySettings, phoneDiscoveryEnabled: Bool, accountRemovalTimeout: Int32) { self.presence = presence self.groupInvitations = groupInvitations self.voiceCalls = voiceCalls @@ -107,6 +108,7 @@ public struct AccountPrivacySettings: Equatable { self.profilePhoto = profilePhoto self.forwards = forwards self.phoneNumber = phoneNumber + self.phoneDiscoveryEnabled = phoneDiscoveryEnabled self.accountRemovalTimeout = accountRemovalTimeout } @@ -132,6 +134,9 @@ public struct AccountPrivacySettings: Equatable { if lhs.phoneNumber != rhs.phoneNumber { return false } + if lhs.phoneDiscoveryEnabled != rhs.phoneDiscoveryEnabled { + return false + } if lhs.accountRemovalTimeout != rhs.accountRemovalTimeout { return false } diff --git a/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift b/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift index f335b6d504..ef4e05aca9 100644 --- a/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift +++ b/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift @@ -17,12 +17,13 @@ public func requestAccountPrivacySettings(account: Account) -> Signal `catch` { _ in return .complete() } - |> mapToSignal { lastSeenPrivacy, groupPrivacy, voiceCallPrivacy, voiceCallP2P, profilePhotoPrivacy, forwardPrivacy, phoneNumberPrivacy, autoremoveTimeout -> Signal in + |> mapToSignal { lastSeenPrivacy, groupPrivacy, voiceCallPrivacy, voiceCallP2P, profilePhotoPrivacy, forwardPrivacy, phoneNumberPrivacy, phoneDiscoveryPrivacy, autoremoveTimeout -> Signal in let accountTimeoutSeconds: Int32 switch autoremoveTimeout { case let .accountDaysTTL(days): @@ -88,6 +89,19 @@ public func requestAccountPrivacySettings(account: Account) -> Signal Signal Sig } } +public func updatePhoneNumberDiscovery(account: Account, value: Bool) -> Signal { + var rules: [Api.InputPrivacyRule] = [] + if value { + rules.append(.inputPrivacyValueAllowAll) + } else { + rules.append(.inputPrivacyValueAllowContacts) + } + return account.network.request(Api.functions.account.setPrivacy(key: .inputPrivacyKeyAddedByPhone, rules: rules)) + |> retryRequest + |> mapToSignal { _ -> Signal in + return .complete() + } +} + public enum UpdateSelectiveAccountPrivacySettingsType { case presence case groupInvitations diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 34a16f9c57..34b435e08d 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -671,3823 +671,3823 @@ public final class PresentationStrings { public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[441]!, self._r[441]!, [_0]) } - public var AutoDownloadSettings_GroupChats: String { return self._s[443]! } - public var CheckoutInfo_SaveInfo: String { return self._s[444]! } - public var SharedMedia_EmptyLinksText: String { return self._s[446]! } - public var Passport_Address_CityPlaceholder: String { return self._s[447]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[448]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[449]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[451]! } + public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[442]!, self._r[442]!, [_1]) + } + public var AutoDownloadSettings_GroupChats: String { return self._s[444]! } + public var CheckoutInfo_SaveInfo: String { return self._s[445]! } + public var SharedMedia_EmptyLinksText: String { return self._s[447]! } + public var Passport_Address_CityPlaceholder: String { return self._s[448]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[449]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[450]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[452]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[452]!, self._r[452]!, [_1]) + return formatWithArgumentRanges(self._s[453]!, self._r[453]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[453]!, self._r[453]!, [_0]) + return formatWithArgumentRanges(self._s[454]!, self._r[454]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[454]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[455]! } - public var ChangePhoneNumberCode_Code: String { return self._s[456]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[455]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[456]! } + public var ChangePhoneNumberCode_Code: String { return self._s[457]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[457]!, self._r[457]!, [_0]) + return formatWithArgumentRanges(self._s[458]!, self._r[458]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[458]! } - public var HashtagSearch_AllChats: String { return self._s[459]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[461]! } + public var TwoStepAuth_SetupEmail: String { return self._s[459]! } + public var HashtagSearch_AllChats: String { return self._s[460]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[462]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[462]!, self._r[462]!, [_0]) + return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[464]! } + public var PhotoEditor_QualityHigh: String { return self._s[465]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[465]!, self._r[465]!, [_0]) + return formatWithArgumentRanges(self._s[466]!, self._r[466]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[466]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[467]! } - public var Message_LiveLocation: String { return self._s[468]! } - public var Cache_LowDiskSpaceText: String { return self._s[469]! } - public var Conversation_SendMessage: String { return self._s[470]! } - public var AuthSessions_EmptyTitle: String { return self._s[471]! } - public var Privacy_PhoneNumber: String { return self._s[472]! } - public var PeopleNearby_CreateGroup: String { return self._s[473]! } - public var CallSettings_UseLessData: String { return self._s[474]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[475]! } - public var Stickers_AddToFavorites: String { return self._s[476]! } - public var PhotoEditor_QualityLow: String { return self._s[477]! } - public var Watch_UserInfo_Unblock: String { return self._s[478]! } - public var Settings_Logout: String { return self._s[479]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[467]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[468]! } + public var Message_LiveLocation: String { return self._s[469]! } + public var Cache_LowDiskSpaceText: String { return self._s[470]! } + public var Conversation_SendMessage: String { return self._s[471]! } + public var AuthSessions_EmptyTitle: String { return self._s[472]! } + public var Privacy_PhoneNumber: String { return self._s[473]! } + public var PeopleNearby_CreateGroup: String { return self._s[474]! } + public var CallSettings_UseLessData: String { return self._s[475]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[476]! } + public var Stickers_AddToFavorites: String { return self._s[477]! } + public var PhotoEditor_QualityLow: String { return self._s[478]! } + public var Watch_UserInfo_Unblock: String { return self._s[479]! } + public var Settings_Logout: String { return self._s[480]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[480]!, self._r[480]!, [_1]) + return formatWithArgumentRanges(self._s[481]!, self._r[481]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[481]! } - public var ChannelInfo_Stats: String { return self._s[482]! } - public var TextFormat_Link: String { return self._s[483]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[482]! } + public var ChannelInfo_Stats: String { return self._s[483]! } + public var TextFormat_Link: String { return self._s[484]! } public func Date_ChatDateHeader(_ _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 func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[485]!, self._r[485]!, [_0]) + return formatWithArgumentRanges(self._s[486]!, self._r[486]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[486]! } - public var Group_Setup_TypePublicHelp: String { return self._s[487]! } - public var Passport_Scans_UploadNew: String { return self._s[488]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[489]! } - public var DialogList_Title: String { return self._s[492]! } - public var NotificationSettings_ContactJoined: String { return self._s[493]! } - public var GroupInfo_LabelAdmin: String { return self._s[494]! } - public var KeyCommand_ChatInfo: String { return self._s[495]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[496]! } - public var Call_ReportIncludeLog: String { return self._s[497]! } + public var Watch_Notification_Joined: String { return self._s[487]! } + public var Group_Setup_TypePublicHelp: String { return self._s[488]! } + public var Passport_Scans_UploadNew: String { return self._s[489]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[490]! } + public var DialogList_Title: String { return self._s[493]! } + public var NotificationSettings_ContactJoined: String { return self._s[494]! } + public var GroupInfo_LabelAdmin: String { return self._s[495]! } + public var KeyCommand_ChatInfo: String { return self._s[496]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[497]! } + public var Call_ReportIncludeLog: String { return self._s[498]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[500]!, self._r[500]!, [_0]) + return formatWithArgumentRanges(self._s[501]!, self._r[501]!, [_0]) } - public var LocalGroup_IrrelevantWarning: String { return self._s[501]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[502]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[503]! } - public var Message_Sticker: String { return self._s[504]! } - public var LastSeen_JustNow: String { return self._s[506]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[508]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[509]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[510]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[511]! } - public var TwoStepAuth_Email: String { return self._s[512]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[513]! } - public var PhotoEditor_BlurToolOff: String { return self._s[514]! } - public var Message_PinnedStickerMessage: String { return self._s[515]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[516]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[517]! } - public var Passport_DiscardMessageTitle: String { return self._s[518]! } - public var Privacy_PaymentsTitle: String { return self._s[519]! } - public var Channel_DiscussionGroup_Header: String { return self._s[521]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[522]! } - public var Appearance_ColorTheme: String { return self._s[523]! } - public var UserInfo_ShareContact: String { return self._s[524]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[525]! } - public var Common_More: String { return self._s[526]! } - public var Watch_Message_Call: String { return self._s[527]! } - public var Profile_EncryptionKey: String { return self._s[530]! } - public var Privacy_TopPeers: String { return self._s[531]! } - public var Conversation_StopPollConfirmation: String { return self._s[532]! } - public var Privacy_TopPeersWarning: String { return self._s[534]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[535]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[536]! } - public var DialogList_SearchSectionMessages: String { return self._s[539]! } - public var Appearance_ThemePreview_ChatList_8_Name: String { return self._s[540]! } - public var Notifications_ChannelNotifications: String { return self._s[541]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[542]! } - public var Passport_Language_sk: String { return self._s[543]! } - public var Notification_MessageLifetime1h: String { return self._s[544]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[545]! } - public var Call_ReportSkip: String { return self._s[547]! } - public var Cache_ServiceFiles: String { return self._s[548]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[549]! } - public var VoiceOver_Chat_YourFile: String { return self._s[550]! } - public var Map_Hybrid: String { return self._s[551]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[553]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[555]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[556]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[557]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[560]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[502]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[503]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[504]! } + public var Message_Sticker: String { return self._s[505]! } + public var LastSeen_JustNow: String { return self._s[507]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[509]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[510]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[511]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[512]! } + public var TwoStepAuth_Email: String { return self._s[513]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[514]! } + public var PhotoEditor_BlurToolOff: String { return self._s[515]! } + public var Message_PinnedStickerMessage: String { return self._s[516]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[517]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[518]! } + public var Passport_DiscardMessageTitle: String { return self._s[519]! } + public var Privacy_PaymentsTitle: String { return self._s[520]! } + public var Channel_DiscussionGroup_Header: String { return self._s[522]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[523]! } + public var Appearance_ColorTheme: String { return self._s[524]! } + public var UserInfo_ShareContact: String { return self._s[525]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[526]! } + public var Common_More: String { return self._s[527]! } + public var Watch_Message_Call: String { return self._s[528]! } + public var Profile_EncryptionKey: String { return self._s[531]! } + public var Privacy_TopPeers: String { return self._s[532]! } + public var Conversation_StopPollConfirmation: String { return self._s[533]! } + public var Privacy_TopPeersWarning: String { return self._s[535]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[536]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[537]! } + public var DialogList_SearchSectionMessages: String { return self._s[540]! } + public var Appearance_ThemePreview_ChatList_8_Name: String { return self._s[541]! } + public var Notifications_ChannelNotifications: String { return self._s[542]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[543]! } + public var Passport_Language_sk: String { return self._s[544]! } + public var Notification_MessageLifetime1h: String { return self._s[545]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[546]! } + public var Call_ReportSkip: String { return self._s[548]! } + public var Cache_ServiceFiles: String { return self._s[549]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[550]! } + public var VoiceOver_Chat_YourFile: String { return self._s[551]! } + public var Map_Hybrid: String { return self._s[552]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[554]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[556]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[557]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[558]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[561]! } public func PUSH_MESSAGE_AUDIO(_ _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 Channel_Username_CreatePrivateLinkHelp: String { return self._s[563]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[564]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[564]!, self._r[564]!, [_1, _2]) + return formatWithArgumentRanges(self._s[565]!, self._r[565]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[565]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[566]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[567]! } - public var UserInfo_ShareBot: String { return self._s[570]! } + public var Conversation_LiveLocationYou: String { return self._s[566]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[567]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[568]! } + public var UserInfo_ShareBot: String { return self._s[571]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[571]!, self._r[571]!, [_1, _2]) + return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[572]! } - public var Message_Audio: String { return self._s[573]! } - public var Passport_Language_lt: String { return self._s[574]! } + public var PhotoEditor_ShadowsTint: String { return self._s[573]! } + public var Message_Audio: String { return self._s[574]! } + public var Passport_Language_lt: String { return self._s[575]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[575]!, self._r[575]!, [_0]) + return formatWithArgumentRanges(self._s[576]!, self._r[576]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[576]! } - public var Conversation_FileICloudDrive: String { return self._s[577]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[578]! } + public var Permissions_SiriText_v0: String { return self._s[577]! } + public var Conversation_FileICloudDrive: String { return self._s[578]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[579]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[579]!, self._r[579]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[580]!, self._r[580]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[580]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[581]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[581]!, self._r[581]!, [_0]) + return formatWithArgumentRanges(self._s[582]!, self._r[582]!, [_0]) } - public var Channel_SignMessages: String { return self._s[582]! } + public var Channel_SignMessages: String { return self._s[583]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_1]) + return formatWithArgumentRanges(self._s[584]!, self._r[584]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[584]! } - public var Passport_ScanPassport: String { return self._s[585]! } - public var Watch_Suggestion_Thanks: String { return self._s[586]! } - public var BlockedUsers_AddNew: String { return self._s[587]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[585]! } + public var Passport_ScanPassport: String { return self._s[586]! } + public var Watch_Suggestion_Thanks: String { return self._s[587]! } + public var BlockedUsers_AddNew: String { return self._s[588]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[588]!, self._r[588]!, [_1, _2]) + return formatWithArgumentRanges(self._s[589]!, self._r[589]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[589]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[590]! } - public var Month_GenJuly: String { return self._s[591]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[592]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[594]! } - public var Notification_ChannelInviterSelf: String { return self._s[595]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[596]! } + public var Watch_Message_Invoice: String { return self._s[590]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[591]! } + public var Month_GenJuly: String { return self._s[592]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[593]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[595]! } + public var Notification_ChannelInviterSelf: String { return self._s[596]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[597]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[597]!, self._r[597]!, [_1, _2]) + return formatWithArgumentRanges(self._s[598]!, self._r[598]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[598]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[599]! } + public var CheckoutInfo_Title: String { return self._s[599]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[600]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[600]!, self._r[600]!, [_0]) + return formatWithArgumentRanges(self._s[601]!, self._r[601]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[601]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[602]! } - public var Passport_Language_de: String { return self._s[603]! } - public var Update_Title: String { return self._s[604]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[605]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[606]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[607]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[608]! } - public var NotificationsSound_Telegraph: String { return self._s[609]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[610]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[611]! } + public var Passport_Identity_MainPage: String { return self._s[602]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[603]! } + public var Passport_Language_de: String { return self._s[604]! } + public var Update_Title: String { return self._s[605]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[606]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[607]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[608]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[609]! } + public var NotificationsSound_Telegraph: String { return self._s[610]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[611]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[612]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[612]!, self._r[612]!, [_0]) + return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[613]! } - public var Conversation_ForwardTitle: String { return self._s[614]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[615]! } + public var Stickers_SuggestAll: String { return self._s[614]! } + public var Conversation_ForwardTitle: String { return self._s[615]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[616]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[616]!, self._r[616]!, [_0]) + return formatWithArgumentRanges(self._s[617]!, self._r[617]!, [_0]) } - public var Calls_NewCall: String { return self._s[617]! } - public var Call_StatusEnded: String { return self._s[618]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[619]! } - public var Settings_ProxyConnected: String { return self._s[620]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[621]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[622]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[623]! } - public var Passport_PasswordPlaceholder: String { return self._s[624]! } - public var Message_PinnedInvoice: String { return self._s[625]! } - public var Passport_Identity_IssueDate: String { return self._s[626]! } - public var Passport_Language_pl: String { return self._s[627]! } + public var Calls_NewCall: String { return self._s[618]! } + public var Call_StatusEnded: String { return self._s[619]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[620]! } + public var Settings_ProxyConnected: String { return self._s[621]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[622]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[623]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[624]! } + public var Passport_PasswordPlaceholder: String { return self._s[625]! } + public var Message_PinnedInvoice: String { return self._s[626]! } + public var Passport_Identity_IssueDate: String { return self._s[627]! } + public var Passport_Language_pl: String { return self._s[628]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[628]!, self._r[628]!, [_0]) + return formatWithArgumentRanges(self._s[629]!, self._r[629]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[629]! } - public var Call_StatusConnecting: String { return self._s[630]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[630]! } + public var Call_StatusConnecting: String { return self._s[631]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[631]!, self._r[631]!, [_0]) + return formatWithArgumentRanges(self._s[632]!, self._r[632]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[633]! } - public var Common_Edit: String { return self._s[634]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[635]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[634]! } + public var Common_Edit: String { return self._s[635]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[636]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[636]!, self._r[636]!, [_0]) + return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[637]! } - public var PrivateDataSettings_Title: String { return self._s[638]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[639]! } - public var ChatList_Read: String { return self._s[640]! } - public var Undo_ChatClearedForBothSides: String { return self._s[641]! } - public var GroupPermission_SectionTitle: String { return self._s[642]! } + public var GroupInfo_ChatAdmins: String { return self._s[638]! } + public var PrivateDataSettings_Title: String { return self._s[639]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[640]! } + public var ChatList_Read: String { return self._s[641]! } + public var Undo_ChatClearedForBothSides: String { return self._s[642]! } + public var GroupPermission_SectionTitle: String { return self._s[643]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_1, _2]) + return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[645]! } - public var Update_UpdateApp: String { return self._s[646]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[647]! } - public var Settings_Appearance: String { return self._s[648]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[651]! } - public var Watch_Location_Access: String { return self._s[652]! } - public var ShareMenu_CopyShareLink: String { return self._s[654]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[655]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[646]! } + public var Update_UpdateApp: String { return self._s[647]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[648]! } + public var Settings_Appearance: String { return self._s[649]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[652]! } + public var Watch_Location_Access: String { return self._s[653]! } + public var ShareMenu_CopyShareLink: String { return self._s[655]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[656]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[657]!, self._r[657]!, [_0]) + return formatWithArgumentRanges(self._s[658]!, self._r[658]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[658]! } - public var Weekday_ShortWednesday: String { return self._s[659]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[660]! } - public var Undo_LeftGroup: String { return self._s[663]! } - public var Conversation_LinkDialogCopy: String { return self._s[664]! } - public var KeyCommand_FocusOnInputField: String { return self._s[666]! } - public var Contacts_SelectAll: String { return self._s[667]! } - public var Preview_SaveToCameraRoll: String { return self._s[668]! } - public var PrivacySettings_PasscodeOff: String { return self._s[669]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[670]! } - public var Wallpaper_Title: String { return self._s[671]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[672]! } - public var AccessDenied_Camera: String { return self._s[673]! } - public var Watch_Compose_CurrentLocation: String { return self._s[674]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[676]! } + public var Notifications_ClassicTones: String { return self._s[659]! } + public var Weekday_ShortWednesday: String { return self._s[660]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[661]! } + public var Undo_LeftGroup: String { return self._s[664]! } + public var Conversation_LinkDialogCopy: String { return self._s[665]! } + public var KeyCommand_FocusOnInputField: String { return self._s[667]! } + public var Contacts_SelectAll: String { return self._s[668]! } + public var Preview_SaveToCameraRoll: String { return self._s[669]! } + public var PrivacySettings_PasscodeOff: String { return self._s[670]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[671]! } + public var Wallpaper_Title: String { return self._s[672]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[673]! } + public var AccessDenied_Camera: String { return self._s[674]! } + public var Watch_Compose_CurrentLocation: String { return self._s[675]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[677]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[677]!, self._r[677]!, [_0]) + return formatWithArgumentRanges(self._s[678]!, self._r[678]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[678]! } - public var Passport_Language_ro: String { return self._s[679]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[680]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[679]! } + public var Passport_Language_ro: String { return self._s[680]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[681]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[681]!, self._r[681]!, [_0]) + return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[682]! } - public var State_ConnectingToProxy: String { return self._s[683]! } - public var Calls_RatingTitle: String { return self._s[684]! } - public var Generic_ErrorMoreInfo: String { return self._s[685]! } - public var Appearance_PreviewReplyText: String { return self._s[686]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[687]! } - public var SharedMedia_CategoryLinks: String { return self._s[688]! } - public var Calls_Missed: String { return self._s[689]! } - public var Cache_Photos: String { return self._s[693]! } - public var GroupPermission_NoAddMembers: String { return self._s[694]! } - public var ScheduledMessages_Title: String { return self._s[695]! } + public var Login_CancelPhoneVerification: String { return self._s[683]! } + public var State_ConnectingToProxy: String { return self._s[684]! } + public var Calls_RatingTitle: String { return self._s[685]! } + public var Generic_ErrorMoreInfo: String { return self._s[686]! } + public var Appearance_PreviewReplyText: String { return self._s[687]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[688]! } + public var SharedMedia_CategoryLinks: String { return self._s[689]! } + public var Calls_Missed: String { return self._s[690]! } + public var Cache_Photos: String { return self._s[694]! } + public var GroupPermission_NoAddMembers: String { return self._s[695]! } + public var ScheduledMessages_Title: String { return self._s[696]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[696]!, self._r[696]!, [_0]) + return formatWithArgumentRanges(self._s[697]!, self._r[697]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[697]! } - public var Settings_ProxyDisabled: String { return self._s[698]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[698]! } + public var Settings_ProxyDisabled: String { return self._s[699]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_0]) + return formatWithArgumentRanges(self._s[701]!, self._r[701]!, [_0]) } - public var Appearance_Title: String { return self._s[702]! } + public var Appearance_Title: String { return self._s[703]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_0]) + return formatWithArgumentRanges(self._s[705]!, self._r[705]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[705]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[706]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[707]! } - public var Preview_DeletePhoto: String { return self._s[708]! } - public var Appearance_AppIconFilledX: String { return self._s[709]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[710]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[706]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[707]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[708]! } + public var Preview_DeletePhoto: String { return self._s[709]! } + public var Appearance_AppIconFilledX: String { return self._s[710]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[711]! } public func Conversation_BotInteractiveUrlAlert(_ _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 Appearance_ThemePreview_Chat_1_ReplyText: String { return self._s[713]! } - public var Coub_TapForSound: String { return self._s[714]! } - public var Map_LocatingError: String { return self._s[715]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[717]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[718]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[719]! } - public var Passport_ForgottenPassword: String { return self._s[720]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[721]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[722]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[724]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[725]! } - public var Message_Location: String { return self._s[726]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[727]! } - public var Channel_Management_Title: String { return self._s[728]! } - public var DialogList_SearchSectionDialogs: String { return self._s[730]! } - public var Compose_NewChannel_Members: String { return self._s[731]! } + public var Appearance_ThemePreview_Chat_1_ReplyText: String { return self._s[714]! } + public var Coub_TapForSound: String { return self._s[715]! } + public var Map_LocatingError: String { return self._s[716]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[718]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[719]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[720]! } + public var Passport_ForgottenPassword: String { return self._s[721]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[722]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[723]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[725]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[726]! } + public var Message_Location: String { return self._s[727]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[728]! } + public var Channel_Management_Title: String { return self._s[729]! } + public var DialogList_SearchSectionDialogs: String { return self._s[731]! } + public var Compose_NewChannel_Members: String { return self._s[732]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[732]!, self._r[732]!, [_0]) + return formatWithArgumentRanges(self._s[733]!, self._r[733]!, [_0]) } - public var GroupInfo_Location: String { return self._s[733]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[734]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[735]! } - public var PhotoEditor_WarmthTool: String { return self._s[736]! } - public var Passport_Language_tr: String { return self._s[737]! } + public var GroupInfo_Location: String { return self._s[734]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[735]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[736]! } + public var PhotoEditor_WarmthTool: String { return self._s[737]! } + public var Passport_Language_tr: String { return self._s[738]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[738]!, self._r[738]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[739]!, self._r[739]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[740]! } - public var Watch_PhotoView_Title: String { return self._s[741]! } - public var Passport_Phone_Delete: String { return self._s[742]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[743]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[744]! } - public var GroupInfo_Permissions: String { return self._s[745]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[746]! } - public var Profile_ShareContactButton: String { return self._s[747]! } - public var ChatSettings_Other: String { return self._s[748]! } - public var UserInfo_NotificationsDisabled: String { return self._s[749]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[750]! } - public var LastSeen_WithinAMonth: String { return self._s[751]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[752]! } - public var Conversation_ReportGroupLocation: String { return self._s[753]! } - public var Conversation_EncryptionCanceled: String { return self._s[754]! } - public var MediaPicker_GroupDescription: String { return self._s[755]! } - public var WebSearch_Images: String { return self._s[756]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[741]! } + public var Watch_PhotoView_Title: String { return self._s[742]! } + public var Passport_Phone_Delete: String { return self._s[743]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[744]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[745]! } + public var GroupInfo_Permissions: String { return self._s[746]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[747]! } + public var Profile_ShareContactButton: String { return self._s[748]! } + public var ChatSettings_Other: String { return self._s[749]! } + public var UserInfo_NotificationsDisabled: String { return self._s[750]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[751]! } + public var LastSeen_WithinAMonth: String { return self._s[752]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[753]! } + public var Conversation_ReportGroupLocation: String { return self._s[754]! } + public var Conversation_EncryptionCanceled: String { return self._s[755]! } + public var MediaPicker_GroupDescription: String { return self._s[756]! } + public var WebSearch_Images: String { return self._s[757]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[757]!, self._r[757]!, [_0]) + return formatWithArgumentRanges(self._s[758]!, self._r[758]!, [_0]) } - public var Message_Photo: String { return self._s[758]! } - public var PasscodeSettings_HelpBottom: String { return self._s[759]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[760]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[761]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[762]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[763]! } - public var NotificationsSound_Calypso: String { return self._s[764]! } - public var Map_Map: String { return self._s[765]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[767]! } - public var ChatSettings_TextSizeUnits: String { return self._s[768]! } + public var Message_Photo: String { return self._s[759]! } + public var PasscodeSettings_HelpBottom: String { return self._s[760]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[761]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[762]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[763]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[764]! } + public var NotificationsSound_Calypso: String { return self._s[765]! } + public var Map_Map: String { return self._s[766]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[768]! } + public var ChatSettings_TextSizeUnits: String { return self._s[769]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[769]!, self._r[769]!, [_0]) + return formatWithArgumentRanges(self._s[770]!, self._r[770]!, [_0]) } - public var Common_of: String { return self._s[770]! } - public var Conversation_ForwardContacts: String { return self._s[773]! } + public var Common_of: String { return self._s[771]! } + public var Conversation_ForwardContacts: String { return self._s[774]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_0]) + return formatWithArgumentRanges(self._s[776]!, self._r[776]!, [_0]) } - public var Passport_Language_hy: String { return self._s[776]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[777]! } - public var AutoDownloadSettings_Reset: String { return self._s[778]! } - public var Paint_ClearConfirm: String { return self._s[779]! } - public var Camera_VideoMode: String { return self._s[780]! } + public var Passport_Language_hy: String { return self._s[777]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[778]! } + public var AutoDownloadSettings_Reset: String { return self._s[779]! } + public var Paint_ClearConfirm: String { return self._s[780]! } + public var Camera_VideoMode: String { return self._s[781]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_0]) + return formatWithArgumentRanges(self._s[782]!, self._r[782]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[782]! } - public var Conversation_ViewBackground: String { return self._s[783]! } - public var Passport_Language_el: String { return self._s[784]! } - public var PhotoEditor_Original: String { return self._s[785]! } - public var Settings_FAQ_Button: String { return self._s[787]! } - public var Channel_Setup_PublicNoLink: String { return self._s[789]! } - public var Conversation_UnsupportedMedia: String { return self._s[790]! } - public var Conversation_SlideToCancel: String { return self._s[791]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[792]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[793]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[794]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[795]! } - public var AutoNightTheme_NotAvailable: String { return self._s[796]! } - public var Conversation_Owner: String { return self._s[797]! } - public var Common_Create: String { return self._s[798]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[799]! } - public var Localization_ChooseLanguage: String { return self._s[801]! } - public var Settings_Proxy: String { return self._s[804]! } - public var Privacy_TopPeersHelp: String { return self._s[805]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[806]! } - public var Chat_UnsendMyMessages: String { return self._s[807]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[783]! } + public var Conversation_ViewBackground: String { return self._s[784]! } + public var Passport_Language_el: String { return self._s[785]! } + public var PhotoEditor_Original: String { return self._s[786]! } + public var Settings_FAQ_Button: String { return self._s[788]! } + public var Channel_Setup_PublicNoLink: String { return self._s[790]! } + public var Conversation_UnsupportedMedia: String { return self._s[791]! } + public var Conversation_SlideToCancel: String { return self._s[792]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[793]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[794]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[795]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[796]! } + public var AutoNightTheme_NotAvailable: String { return self._s[797]! } + public var Conversation_Owner: String { return self._s[798]! } + public var Common_Create: String { return self._s[799]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[800]! } + public var Localization_ChooseLanguage: String { return self._s[802]! } + public var Settings_Proxy: String { return self._s[805]! } + public var Privacy_TopPeersHelp: String { return self._s[806]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[807]! } + public var Chat_UnsendMyMessages: String { return self._s[808]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[808]!, self._r[808]!, [_0]) + return formatWithArgumentRanges(self._s[809]!, self._r[809]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[809]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[810]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[811]!, self._r[811]!, [_0]) + return formatWithArgumentRanges(self._s[812]!, self._r[812]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[812]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[813]! } - public var Cache_Title: String { return self._s[814]! } + public var Contacts_SortedByPresence: String { return self._s[813]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[814]! } + public var Cache_Title: String { return self._s[815]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) + return formatWithArgumentRanges(self._s[816]!, self._r[816]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[816]! } - public var Channel_Moderator_Title: String { return self._s[817]! } - public var InstantPage_AutoNightTheme: String { return self._s[819]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[817]! } + public var Channel_Moderator_Title: String { return self._s[818]! } + public var InstantPage_AutoNightTheme: String { return self._s[820]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[822]!, self._r[822]!, [_1]) + return formatWithArgumentRanges(self._s[823]!, self._r[823]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[823]! } - public var Undo_Undo: String { return self._s[825]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[826]! } - public var TwoStepAuth_RemovePassword: String { return self._s[827]! } - public var Common_Delete: String { return self._s[828]! } - public var Contacts_AddPeopleNearby: String { return self._s[830]! } - public var Conversation_ContextMenuDelete: String { return self._s[831]! } - public var SocksProxySetup_Credentials: String { return self._s[832]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[834]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[837]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[838]! } - public var Passport_Language_id: String { return self._s[840]! } - public var WallpaperSearch_ColorTeal: String { return self._s[841]! } - public var ChannelIntro_Title: String { return self._s[842]! } + public var Passport_Scans_Upload: String { return self._s[824]! } + public var Undo_Undo: String { return self._s[826]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[827]! } + public var TwoStepAuth_RemovePassword: String { return self._s[828]! } + public var Common_Delete: String { return self._s[829]! } + public var Contacts_AddPeopleNearby: String { return self._s[831]! } + public var Conversation_ContextMenuDelete: String { return self._s[832]! } + public var SocksProxySetup_Credentials: String { return self._s[833]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[835]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[838]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[839]! } + public var Passport_Language_id: String { return self._s[841]! } + public var WallpaperSearch_ColorTeal: String { return self._s[842]! } + public var ChannelIntro_Title: String { return self._s[843]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[843]!, self._r[843]!, [_0]) + return formatWithArgumentRanges(self._s[844]!, self._r[844]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[845]! } - public var VoiceOver_Chat_Reply: String { return self._s[846]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[847]! } - public var Channel_Info_Description: String { return self._s[848]! } - public var Stickers_FavoriteStickers: String { return self._s[849]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[850]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[851]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[852]! } - public var Group_PublicLink_Placeholder: String { return self._s[853]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[854]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[846]! } + public var VoiceOver_Chat_Reply: String { return self._s[847]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[848]! } + public var Channel_Info_Description: String { return self._s[849]! } + public var Stickers_FavoriteStickers: String { return self._s[850]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[851]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[852]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[853]! } + public var Group_PublicLink_Placeholder: String { return self._s[854]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[855]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[855]!, self._r[855]!, [_1]) + return formatWithArgumentRanges(self._s[856]!, self._r[856]!, [_1]) } - public var TextFormat_Underline: String { return self._s[856]! } + public var TextFormat_Underline: String { return self._s[857]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_1, _2]) + return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_0]) + return formatWithArgumentRanges(self._s[859]!, self._r[859]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[859]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[860]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1, _2]) + return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[861]! } - public var Passport_Language_uk: String { return self._s[862]! } - public var StickerPack_HideStickers: String { return self._s[864]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[865]! } + public var GroupPermission_Delete: String { return self._s[862]! } + public var Passport_Language_uk: String { return self._s[863]! } + public var StickerPack_HideStickers: String { return self._s[865]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[866]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[866]!, self._r[866]!, [_1, _2]) + return formatWithArgumentRanges(self._s[867]!, self._r[867]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[867]! } + public var Activity_UploadingVideoMessage: String { return self._s[868]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_0]) + return formatWithArgumentRanges(self._s[869]!, self._r[869]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[869]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[870]! } - public var Settings_CallSettings: String { return self._s[871]! } - public var Camera_SquareMode: String { return self._s[872]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[873]! } - public var GroupInfo_SharedMediaNone: String { return self._s[874]! } + public var Channel_TitleInfo: String { return self._s[870]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[871]! } + public var Settings_CallSettings: String { return self._s[872]! } + public var Camera_SquareMode: String { return self._s[873]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[874]! } + public var GroupInfo_SharedMediaNone: String { return self._s[875]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_1]) + return formatWithArgumentRanges(self._s[876]!, self._r[876]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[876]! } - public var Application_Update: String { return self._s[878]! } - public var Month_ShortJanuary: String { return self._s[879]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[880]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[881]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[882]! } - public var Passport_Address_Street2Placeholder: String { return self._s[883]! } + public var Bot_GenericBotStatus: String { return self._s[877]! } + public var Application_Update: String { return self._s[879]! } + public var Month_ShortJanuary: String { return self._s[880]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[881]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[882]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[883]! } + public var Passport_Address_Street2Placeholder: String { return self._s[884]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_0]) + return formatWithArgumentRanges(self._s[885]!, self._r[885]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[885]! } - public var Appearance_PreviewOutgoingText: String { return self._s[886]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[887]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[889]! } - public var Map_Directions: String { return self._s[890]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[892]! } - public var Appearance_ThemeDay: String { return self._s[893]! } - public var LogoutOptions_LogOut: String { return self._s[894]! } - public var Group_PublicLink_Title: String { return self._s[896]! } - public var Channel_AddBotErrorNoRights: String { return self._s[897]! } - public var Passport_Identity_AddPassport: String { return self._s[898]! } - public var LocalGroup_ButtonTitle: String { return self._s[899]! } - public var Call_Message: String { return self._s[900]! } - public var PhotoEditor_ExposureTool: String { return self._s[901]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[903]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[905]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[906]! } - public var Appearance_Preview: String { return self._s[907]! } - public var Compose_ChannelMembers: String { return self._s[908]! } - public var Conversation_DeleteManyMessages: String { return self._s[909]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[910]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[911]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[912]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[915]! } - public var Conversation_UpdateTelegram: String { return self._s[916]! } + public var NetworkUsageSettings_Cellular: String { return self._s[886]! } + public var Appearance_PreviewOutgoingText: String { return self._s[887]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[888]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[890]! } + public var Map_Directions: String { return self._s[891]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[893]! } + public var Appearance_ThemeDay: String { return self._s[894]! } + public var LogoutOptions_LogOut: String { return self._s[895]! } + public var Group_PublicLink_Title: String { return self._s[897]! } + public var Channel_AddBotErrorNoRights: String { return self._s[898]! } + public var Passport_Identity_AddPassport: String { return self._s[899]! } + public var LocalGroup_ButtonTitle: String { return self._s[900]! } + public var Call_Message: String { return self._s[901]! } + public var PhotoEditor_ExposureTool: String { return self._s[902]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[904]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[906]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[907]! } + public var Appearance_Preview: String { return self._s[908]! } + public var Compose_ChannelMembers: String { return self._s[909]! } + public var Conversation_DeleteManyMessages: String { return self._s[910]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[911]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[912]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[913]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[916]! } + public var Conversation_UpdateTelegram: String { return self._s[917]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[917]!, self._r[917]!, [_0]) + return formatWithArgumentRanges(self._s[918]!, self._r[918]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[918]!, self._r[918]!, [_1]) + return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[919]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[920]! } + public var GroupInfo_Administrators_Title: String { return self._s[920]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[921]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_0]) + return formatWithArgumentRanges(self._s[922]!, self._r[922]!, [_0]) } - public var Tour_Title3: String { return self._s[922]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[923]! } - public var Clipboard_SendPhoto: String { return self._s[927]! } - public var MediaPicker_Videos: String { return self._s[928]! } - public var Passport_Email_Title: String { return self._s[929]! } + public var Tour_Title3: String { return self._s[923]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[924]! } + public var Clipboard_SendPhoto: String { return self._s[928]! } + public var MediaPicker_Videos: String { return self._s[929]! } + public var Passport_Email_Title: String { return self._s[930]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[930]!, self._r[930]!, [_0]) + return formatWithArgumentRanges(self._s[931]!, self._r[931]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[931]! } - public var Conversation_MessageDialogDelete: String { return self._s[932]! } - public var Privacy_Calls_CustomHelp: String { return self._s[934]! } - public var Message_Wallpaper: String { return self._s[935]! } - public var MemberSearch_BotSection: String { return self._s[936]! } - public var GroupInfo_SetSound: String { return self._s[937]! } - public var Core_ServiceUserStatus: String { return self._s[938]! } - public var LiveLocationUpdated_JustNow: String { return self._s[939]! } - public var Call_StatusFailed: String { return self._s[940]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[941]! } - public var TwoStepAuth_SetPassword: String { return self._s[942]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[943]! } + public var StickerPacksSettings_Title: String { return self._s[932]! } + public var Conversation_MessageDialogDelete: String { return self._s[933]! } + public var Privacy_Calls_CustomHelp: String { return self._s[935]! } + public var Message_Wallpaper: String { return self._s[936]! } + public var MemberSearch_BotSection: String { return self._s[937]! } + public var GroupInfo_SetSound: String { return self._s[938]! } + public var Core_ServiceUserStatus: String { return self._s[939]! } + public var LiveLocationUpdated_JustNow: String { return self._s[940]! } + public var Call_StatusFailed: String { return self._s[941]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[942]! } + public var TwoStepAuth_SetPassword: String { return self._s[943]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[944]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[945]!, self._r[945]!, [_0]) + return formatWithArgumentRanges(self._s[946]!, self._r[946]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[946]! } - public var Profile_Username: String { return self._s[947]! } - public var Bot_DescriptionTitle: String { return self._s[948]! } - public var MaskStickerSettings_Title: String { return self._s[949]! } - public var SharedMedia_CategoryOther: String { return self._s[950]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[951]! } - public var Common_NotNow: String { return self._s[952]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[953]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[954]! } - public var Map_Location: String { return self._s[955]! } - public var Invitation_JoinGroup: String { return self._s[956]! } - public var AutoDownloadSettings_Title: String { return self._s[958]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[959]! } - public var Channel_ErrorAddBlocked: String { return self._s[960]! } - public var Conversation_UnblockUser: String { return self._s[961]! } - public var Watch_Bot_Restart: String { return self._s[962]! } - public var TwoStepAuth_Title: String { return self._s[963]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[964]! } - public var Checkout_ShippingMethod: String { return self._s[965]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[966]! } + public var Calls_SubmitRating: String { return self._s[947]! } + public var Profile_Username: String { return self._s[948]! } + public var Bot_DescriptionTitle: String { return self._s[949]! } + public var MaskStickerSettings_Title: String { return self._s[950]! } + public var SharedMedia_CategoryOther: String { return self._s[951]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[952]! } + public var Common_NotNow: String { return self._s[953]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[954]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[955]! } + public var Map_Location: String { return self._s[956]! } + public var Invitation_JoinGroup: String { return self._s[957]! } + public var AutoDownloadSettings_Title: String { return self._s[959]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[960]! } + public var Channel_ErrorAddBlocked: String { return self._s[961]! } + public var Conversation_UnblockUser: String { return self._s[962]! } + public var Watch_Bot_Restart: String { return self._s[963]! } + public var TwoStepAuth_Title: String { return self._s[964]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[965]! } + public var Checkout_ShippingMethod: String { return self._s[966]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[967]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[967]!, self._r[967]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[968]!, self._r[968]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_0]) - } - public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[970]!, self._r[970]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[971]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[972]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[973]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[974]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[975]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[976]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[977]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[978]! } - public var Checkout_PaymentMethod_Title: String { return self._s[979]! } - public var SocksProxySetup_Connection: String { return self._s[980]! } - public var Group_MessagePhotoRemoved: String { return self._s[981]! } - public var Channel_Stickers_NotFound: String { return self._s[983]! } - public var Group_About_Help: String { return self._s[984]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[985]! } - public var PeopleNearby_Title: String { return self._s[987]! } - public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[988]!, self._r[988]!, [_1]) + public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[971]!, self._r[971]!, [_0]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[990]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[991]! } - public var SocksProxySetup_Password: String { return self._s[992]! } - public var Notifications_PermissionsEnable: String { return self._s[993]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[995]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[972]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[973]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[974]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[975]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[976]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[977]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[978]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[979]! } + public var Checkout_PaymentMethod_Title: String { return self._s[980]! } + public var SocksProxySetup_Connection: String { return self._s[981]! } + public var Group_MessagePhotoRemoved: String { return self._s[982]! } + public var Channel_Stickers_NotFound: String { return self._s[984]! } + public var Group_About_Help: String { return self._s[985]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[986]! } + public var PeopleNearby_Title: String { return self._s[988]! } + public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_1]) + } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[991]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[992]! } + public var SocksProxySetup_Password: String { return self._s[993]! } + public var Notifications_PermissionsEnable: String { return self._s[994]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[996]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[996]!, self._r[996]!, [_1]) + return formatWithArgumentRanges(self._s[997]!, self._r[997]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_0]) + return formatWithArgumentRanges(self._s[999]!, self._r[999]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[999]! } - public var ArchivedPacksAlert_Title: String { return self._s[1000]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1000]! } + public var ArchivedPacksAlert_Title: String { return self._s[1001]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1002]!, self._r[1002]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1002]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1004]! } - public var Conversation_StatusTyping: String { return self._s[1005]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1006]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1007]! } - public var UserInfo_CreateNewContact: String { return self._s[1008]! } - public var Passport_Identity_FrontSide: String { return self._s[1009]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1010]! } - public var Calls_CallTabTitle: String { return self._s[1011]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1012]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1003]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1005]! } + public var Conversation_StatusTyping: String { return self._s[1006]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1007]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1008]! } + public var UserInfo_CreateNewContact: String { return self._s[1009]! } + public var Passport_Identity_FrontSide: String { return self._s[1010]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1011]! } + public var Calls_CallTabTitle: String { return self._s[1012]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1013]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1014]!, self._r[1014]!, [_0]) + return formatWithArgumentRanges(self._s[1015]!, self._r[1015]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1015]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1016]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1017]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1018]! } - public var Paint_Stickers: String { return self._s[1019]! } - public var Privacy_GroupsAndChannels: String { return self._s[1020]! } - public var UserInfo_AddContact: String { return self._s[1022]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1016]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1017]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1018]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1019]! } + public var Paint_Stickers: String { return self._s[1020]! } + public var Privacy_GroupsAndChannels: String { return self._s[1021]! } + public var UserInfo_AddContact: String { return self._s[1023]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1023]!, self._r[1023]!, [_0]) + return formatWithArgumentRanges(self._s[1024]!, self._r[1024]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1025]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1026]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_0]) + return formatWithArgumentRanges(self._s[1028]!, self._r[1028]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1028]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1029]! } - public var BlockedUsers_BlockUser: String { return self._s[1030]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1031]! } - public var MediaPicker_UngroupDescription: String { return self._s[1032]! } - public var Watch_NoConnection: String { return self._s[1033]! } - public var Month_GenSeptember: String { return self._s[1034]! } - public var Conversation_ViewGroup: String { return self._s[1035]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1038]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1039]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1040]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1041]! } - public var MediaPicker_CameraRoll: String { return self._s[1043]! } - public var Month_GenAugust: String { return self._s[1044]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1045]! } - public var SharedMedia_EmptyText: String { return self._s[1046]! } - public var Map_ShareLiveLocation: String { return self._s[1047]! } - public var Calls_All: String { return self._s[1048]! } - public var Appearance_ThemeNight: String { return self._s[1051]! } - public var Conversation_HoldForAudio: String { return self._s[1052]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1055]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1056]! } - public var SocksProxySetup_Secret: String { return self._s[1057]! } + public var DialogList_NoMessagesTitle: String { return self._s[1029]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1030]! } + public var BlockedUsers_BlockUser: String { return self._s[1031]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1032]! } + public var MediaPicker_UngroupDescription: String { return self._s[1033]! } + public var Watch_NoConnection: String { return self._s[1034]! } + public var Month_GenSeptember: String { return self._s[1035]! } + public var Conversation_ViewGroup: String { return self._s[1036]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1039]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1040]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1041]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1042]! } + public var MediaPicker_CameraRoll: String { return self._s[1044]! } + public var Month_GenAugust: String { return self._s[1045]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1046]! } + public var SharedMedia_EmptyText: String { return self._s[1047]! } + public var Map_ShareLiveLocation: String { return self._s[1048]! } + public var Calls_All: String { return self._s[1049]! } + public var Appearance_ThemeNight: String { return self._s[1052]! } + public var Conversation_HoldForAudio: String { return self._s[1053]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1056]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1057]! } + public var SocksProxySetup_Secret: String { return self._s[1058]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1058]!, self._r[1058]!, [_0]) + return formatWithArgumentRanges(self._s[1059]!, self._r[1059]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1060]! } - public var Conversation_Location: String { return self._s[1061]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1061]! } + public var Conversation_Location: String { return self._s[1062]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1063]!, self._r[1063]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1064]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1065]! } - public var Notifications_PermissionsText: String { return self._s[1066]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1067]! } - public var Call_Flip: String { return self._s[1068]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1070]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1072]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1074]! } - public var Channel_TooMuchBots: String { return self._s[1076]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1077]! } - public var Login_InvalidCodeError: String { return self._s[1078]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1079]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1065]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1066]! } + public var Notifications_PermissionsText: String { return self._s[1067]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1068]! } + public var Call_Flip: String { return self._s[1069]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1071]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1072]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1074]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1076]! } + public var Channel_TooMuchBots: String { return self._s[1078]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1079]! } + public var Login_InvalidCodeError: String { return self._s[1080]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1081]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1080]!, self._r[1080]!, [_0]) + return formatWithArgumentRanges(self._s[1082]!, self._r[1082]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1081]!, self._r[1081]!, [_0]) + return formatWithArgumentRanges(self._s[1083]!, self._r[1083]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1082]! } - public var Call_CallInProgressTitle: String { return self._s[1083]! } - public var Month_ShortSeptember: String { return self._s[1084]! } - public var Watch_ChannelInfo_Title: String { return self._s[1085]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1088]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1089]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1090]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1091]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1092]! } - public var PhotoEditor_CropReset: String { return self._s[1093]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1095]! } - public var Channel_Management_LabelEditor: String { return self._s[1096]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1098]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1099]! } - public var UserInfo_Title: String { return self._s[1100]! } - public var ChatList_HideAction: String { return self._s[1101]! } - public var AccessDenied_Title: String { return self._s[1102]! } - public var DialogList_SearchLabel: String { return self._s[1103]! } - public var Group_Setup_HistoryHidden: String { return self._s[1104]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1105]! } - public var State_Updating: String { return self._s[1107]! } - public var Contacts_TabTitle: String { return self._s[1108]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1110]! } - public var GroupInfo_GroupHistory: String { return self._s[1111]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1112]! } - public var Wallpaper_SetColor: String { return self._s[1113]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1114]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1115]! } - public var Chat_AttachmentLimitReached: String { return self._s[1116]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1117]! } - public var Contacts_NotRegisteredSection: String { return self._s[1118]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1084]! } + public var Call_CallInProgressTitle: String { return self._s[1085]! } + public var Month_ShortSeptember: String { return self._s[1086]! } + public var Watch_ChannelInfo_Title: String { return self._s[1087]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1090]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1091]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1092]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1093]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1094]! } + public var PhotoEditor_CropReset: String { return self._s[1095]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1097]! } + public var Channel_Management_LabelEditor: String { return self._s[1098]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1100]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1101]! } + public var UserInfo_Title: String { return self._s[1102]! } + public var ChatList_HideAction: String { return self._s[1103]! } + public var AccessDenied_Title: String { return self._s[1104]! } + public var DialogList_SearchLabel: String { return self._s[1105]! } + public var Group_Setup_HistoryHidden: String { return self._s[1106]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1107]! } + public var State_Updating: String { return self._s[1109]! } + public var Contacts_TabTitle: String { return self._s[1110]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1112]! } + public var GroupInfo_GroupHistory: String { return self._s[1113]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1114]! } + public var Wallpaper_SetColor: String { return self._s[1115]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1116]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1117]! } + public var Chat_AttachmentLimitReached: String { return self._s[1118]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1119]! } + public var Contacts_NotRegisteredSection: String { return self._s[1120]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1119]!, self._r[1119]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1121]!, self._r[1121]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1120]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1121]! } - public var SocksProxySetup_Connecting: String { return self._s[1122]! } - public var ExplicitContent_AlertChannel: String { return self._s[1123]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1124]! } - public var Conversation_Contact: String { return self._s[1125]! } - public var Login_CodeExpired: String { return self._s[1126]! } - public var Passport_DiscardMessageAction: String { return self._s[1127]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1128]! } + public var Paint_Clear: String { return self._s[1122]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1123]! } + public var SocksProxySetup_Connecting: String { return self._s[1124]! } + public var ExplicitContent_AlertChannel: String { return self._s[1125]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1126]! } + public var Conversation_Contact: String { return self._s[1127]! } + public var Login_CodeExpired: String { return self._s[1128]! } + public var Passport_DiscardMessageAction: String { return self._s[1129]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1130]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1129]!, self._r[1129]!, [_0]) + return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1130]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1131]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1132]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1133]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_0]) + return formatWithArgumentRanges(self._s[1134]!, self._r[1134]!, [_0]) } - public var Month_ShortApril: String { return self._s[1133]! } - public var AuthSessions_CurrentSession: String { return self._s[1134]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1137]! } - public var WallpaperPreview_CropTopText: String { return self._s[1139]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1140]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1141]! } + public var Month_ShortApril: String { return self._s[1135]! } + public var AuthSessions_CurrentSession: String { return self._s[1136]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1139]! } + public var WallpaperPreview_CropTopText: String { return self._s[1141]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1142]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1143]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1142]!, self._r[1142]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1144]!, self._r[1144]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1143]! } - public var Channel_Setup_TypePrivate: String { return self._s[1145]! } - public var Forward_ChannelReadOnly: String { return self._s[1148]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1149]! } - public var AddContact_SharedContactException: String { return self._s[1150]! } - public var UserInfo_BotPrivacy: String { return self._s[1152]! } - public var Notification_PassportValueEmail: String { return self._s[1153]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1154]! } - public var GroupPermission_NewTitle: String { return self._s[1155]! } - public var CallFeedback_ReasonDropped: String { return self._s[1156]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1157]! } - public var Channel_SignMessages_Help: String { return self._s[1159]! } - public var Undo_ChatDeleted: String { return self._s[1161]! } - public var Conversation_ChatBackground: String { return self._s[1162]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1163]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1164]! } - public var Passport_Language_pt: String { return self._s[1165]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1166]! } - public var NotificationsSound_Popcorn: String { return self._s[1169]! } - public var AutoNightTheme_Disabled: String { return self._s[1170]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1171]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1172]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1173]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1174]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1145]! } + public var Channel_Setup_TypePrivate: String { return self._s[1147]! } + public var Forward_ChannelReadOnly: String { return self._s[1150]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1151]! } + public var AddContact_SharedContactException: String { return self._s[1152]! } + public var UserInfo_BotPrivacy: String { return self._s[1154]! } + public var Notification_PassportValueEmail: String { return self._s[1155]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1156]! } + public var GroupPermission_NewTitle: String { return self._s[1157]! } + public var CallFeedback_ReasonDropped: String { return self._s[1158]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1159]! } + public var Channel_SignMessages_Help: String { return self._s[1161]! } + public var Undo_ChatDeleted: String { return self._s[1163]! } + public var Conversation_ChatBackground: String { return self._s[1164]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1165]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1166]! } + public var Passport_Language_pt: String { return self._s[1167]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1168]! } + public var NotificationsSound_Popcorn: String { return self._s[1171]! } + public var AutoNightTheme_Disabled: String { return self._s[1172]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1173]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1174]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1175]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1176]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1175]!, self._r[1175]!, [_0]) + return formatWithArgumentRanges(self._s[1177]!, self._r[1177]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1176]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1177]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1179]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1178]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1179]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1181]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1180]!, self._r[1180]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1182]!, self._r[1182]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1183]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1184]! } - public var Compose_NewEncryptedChat: String { return self._s[1185]! } - public var Login_CodeFloodError: String { return self._s[1186]! } - public var Calls_TabTitle: String { return self._s[1187]! } - public var Privacy_ProfilePhoto: String { return self._s[1188]! } - public var Passport_Language_he: String { return self._s[1189]! } + public var SocksProxySetup_Hostname: String { return self._s[1185]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1186]! } + public var Compose_NewEncryptedChat: String { return self._s[1187]! } + public var Login_CodeFloodError: String { return self._s[1188]! } + public var Calls_TabTitle: String { return self._s[1189]! } + public var Privacy_ProfilePhoto: String { return self._s[1190]! } + public var Passport_Language_he: String { return self._s[1191]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1190]!, self._r[1190]!, [_0]) - } - public var GroupPermission_Title: String { return self._s[1191]! } - public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1192]!, self._r[1192]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1193]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1194]! } - public var Tour_Text1: String { return self._s[1195]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1196]! } - public var Month_ShortFebruary: String { return self._s[1197]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1198]! } - public var NotificationsSound_Glass: String { return self._s[1199]! } - public var Appearance_ThemeNightBlue: String { return self._s[1200]! } - public var CheckoutInfo_Pay: String { return self._s[1201]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1203]! } - public var Call_CallAgain: String { return self._s[1205]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1206]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1207]! } - public var Passport_InvalidPasswordError: String { return self._s[1208]! } - public var Watch_Message_Game: String { return self._s[1209]! } - public var Stickers_Install: String { return self._s[1210]! } - public var VoiceOver_Chat_Message: String { return self._s[1211]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1212]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1214]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1215]! } - public var AuthSessions_OtherSessions: String { return self._s[1216]! } - public var Channel_Username_Help: String { return self._s[1217]! } - public var Camera_Title: String { return self._s[1218]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1220]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1221]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1222]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1223]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1224]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1225]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1226]! } - public var Conversation_RestrictedStickers: String { return self._s[1227]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1229]! } - public var UserInfo_TelegramCall: String { return self._s[1231]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1232]! } - public var CreatePoll_OptionsHeader: String { return self._s[1233]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1234]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1235]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1236]! } - public var Appearance_ThemePreview_Chat_1_ReplyName: String { return self._s[1237]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1238]! } + public var GroupPermission_Title: String { return self._s[1193]! } + public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1194]!, self._r[1194]!, [_0]) + } + public var GroupPermission_NoChangeInfo: String { return self._s[1195]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1196]! } + public var Tour_Text1: String { return self._s[1197]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1198]! } + public var Month_ShortFebruary: String { return self._s[1199]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1200]! } + public var NotificationsSound_Glass: String { return self._s[1201]! } + public var Appearance_ThemeNightBlue: String { return self._s[1202]! } + public var CheckoutInfo_Pay: String { return self._s[1203]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1205]! } + public var Call_CallAgain: String { return self._s[1207]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1208]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1209]! } + public var Passport_InvalidPasswordError: String { return self._s[1210]! } + public var Watch_Message_Game: String { return self._s[1211]! } + public var Stickers_Install: String { return self._s[1212]! } + public var VoiceOver_Chat_Message: String { return self._s[1213]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1214]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1216]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1217]! } + public var AuthSessions_OtherSessions: String { return self._s[1218]! } + public var Channel_Username_Help: String { return self._s[1219]! } + public var Camera_Title: String { return self._s[1220]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1222]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1223]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1224]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1225]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1226]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1227]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1228]! } + public var Conversation_RestrictedStickers: String { return self._s[1229]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1231]! } + public var UserInfo_TelegramCall: String { return self._s[1233]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1234]! } + public var CreatePoll_OptionsHeader: String { return self._s[1235]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1236]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1237]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1238]! } + public var Appearance_ThemePreview_Chat_1_ReplyName: String { return self._s[1239]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1240]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1239]!, self._r[1239]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1241]!, self._r[1241]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1240]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1241]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1242]! } - public var Conversation_MessageDialogRetry: String { return self._s[1243]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1244]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1245]! } - public var Group_Setup_TypeHeader: String { return self._s[1246]! } - public var Paint_RecentStickers: String { return self._s[1247]! } - public var PhotoEditor_GrainTool: String { return self._s[1248]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1249]! } - public var EmptyGroupInfo_Line4: String { return self._s[1250]! } - public var Watch_AuthRequired: String { return self._s[1252]! } + public var Settings_SaveEditedPhotos: String { return self._s[1242]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1243]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1244]! } + public var Conversation_MessageDialogRetry: String { return self._s[1245]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1246]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1247]! } + public var Group_Setup_TypeHeader: String { return self._s[1248]! } + public var Paint_RecentStickers: String { return self._s[1249]! } + public var PhotoEditor_GrainTool: String { return self._s[1250]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1251]! } + public var EmptyGroupInfo_Line4: String { return self._s[1252]! } + public var Watch_AuthRequired: String { return self._s[1254]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1253]!, self._r[1253]!, [_0]) + return formatWithArgumentRanges(self._s[1255]!, self._r[1255]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1254]! } - public var ChannelIntro_Text: String { return self._s[1255]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1256]! } - public var GroupPermission_NoSendMedia: String { return self._s[1257]! } - public var Calls_AddTab: String { return self._s[1258]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1259]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1260]! } - public var Notification_MessageLifetime1d: String { return self._s[1261]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1262]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1263]! } - public var Passport_Identity_GenderFemale: String { return self._s[1264]! } - public var BlockedUsers_BlockTitle: String { return self._s[1265]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1256]! } + public var ChannelIntro_Text: String { return self._s[1257]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1258]! } + public var GroupPermission_NoSendMedia: String { return self._s[1259]! } + public var Calls_AddTab: String { return self._s[1260]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1261]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1262]! } + public var Notification_MessageLifetime1d: String { return self._s[1263]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1264]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1265]! } + public var Passport_Identity_GenderFemale: String { return self._s[1266]! } + public var BlockedUsers_BlockTitle: String { return self._s[1267]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1266]!, self._r[1266]!, [_1]) + return formatWithArgumentRanges(self._s[1268]!, self._r[1268]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1267]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1268]! } - public var ChatList_ArchiveAction: String { return self._s[1269]! } - public var AutoNightTheme_Scheduled: String { return self._s[1270]! } + public var Weekday_Yesterday: String { return self._s[1269]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1270]! } + public var ChatList_ArchiveAction: String { return self._s[1271]! } + public var AutoNightTheme_Scheduled: String { return self._s[1272]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1272]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1274]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1275]!, self._r[1275]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1274]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1275]! } + public var CreatePoll_Create: String { return self._s[1276]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1277]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1276]!, self._r[1276]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1278]!, self._r[1278]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1277]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1278]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1280]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1279]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1280]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1282]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_1]) + return formatWithArgumentRanges(self._s[1283]!, self._r[1283]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1282]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1283]! } + public var Preview_OpenInInstagram: String { return self._s[1284]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1285]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1284]!, self._r[1284]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1286]!, self._r[1286]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1286]! } - public var ArchivedChats_IntroText3: String { return self._s[1287]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1288]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1289]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1290]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1288]! } + public var ArchivedChats_IntroText3: String { return self._s[1289]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1290]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1291]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1292]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1291]!, self._r[1291]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1293]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1294]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1295]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1296]! } - public var Gif_NoGifsFound: String { return self._s[1297]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1298]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1299]! } - public var GroupInfo_ActionPromote: String { return self._s[1300]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1301]! } - public var GroupInfo_Permissions_Title: String { return self._s[1302]! } - public var Permissions_ContactsText_v0: String { return self._s[1303]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1304]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1307]! } - public var Passport_FieldEmailHelp: String { return self._s[1308]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1295]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1296]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1297]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1298]! } + public var Gif_NoGifsFound: String { return self._s[1299]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1300]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1301]! } + public var GroupInfo_ActionPromote: String { return self._s[1302]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1303]! } + public var GroupInfo_Permissions_Title: String { return self._s[1304]! } + public var Permissions_ContactsText_v0: String { return self._s[1305]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1306]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1307]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1310]! } + public var Passport_FieldEmailHelp: String { return self._s[1311]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1309]!, self._r[1309]!, [_0]) + return formatWithArgumentRanges(self._s[1312]!, self._r[1312]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1310]! } - public var Weekday_ShortSaturday: String { return self._s[1311]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1312]! } - public var Watch_Conversation_UserInfo: String { return self._s[1313]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1314]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1315]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1316]! } - public var PhotoEditor_VignetteTool: String { return self._s[1317]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1318]! } - public var Passport_Language_et: String { return self._s[1319]! } - public var AppUpgrade_Running: String { return self._s[1320]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1322]! } - public var Passport_Language_bg: String { return self._s[1323]! } - public var Stickers_NoStickersFound: String { return self._s[1325]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1313]! } + public var Weekday_ShortSaturday: String { return self._s[1314]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1315]! } + public var Watch_Conversation_UserInfo: String { return self._s[1316]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1317]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1318]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1319]! } + public var PhotoEditor_VignetteTool: String { return self._s[1320]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1321]! } + public var Passport_Language_et: String { return self._s[1322]! } + public var AppUpgrade_Running: String { return self._s[1323]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1325]! } + public var Passport_Language_bg: String { return self._s[1326]! } + public var Stickers_NoStickersFound: String { return self._s[1328]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1328]!, self._r[1328]!, [_0]) + return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, [_0]) } - public var Settings_About: String { return self._s[1329]! } + public var Settings_About: String { return self._s[1332]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1332]! } - public var Group_ErrorAddBlocked: String { return self._s[1333]! } + public var KeyCommand_NewMessage: String { return self._s[1335]! } + public var Group_ErrorAddBlocked: String { return self._s[1336]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_0]) + return formatWithArgumentRanges(self._s[1337]!, self._r[1337]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1335]! } - public var ReportGroupLocation_Title: String { return self._s[1336]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1337]! } - public var Cache_ClearProgress: String { return self._s[1338]! } + public var Map_LocationTitle: String { return self._s[1338]! } + public var ReportGroupLocation_Title: String { return self._s[1339]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1340]! } + public var Cache_ClearProgress: String { return self._s[1341]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1339]!, self._r[1339]!, [_0]) + return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1340]! } - public var Passport_UpdateRequiredError: String { return self._s[1341]! } + public var GroupRemoved_AddToGroup: String { return self._s[1343]! } + public var Passport_UpdateRequiredError: String { return self._s[1344]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_1]) + return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1344]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1345]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1346]! } - public var Passport_Language_ka: String { return self._s[1347]! } - public var Call_Decline: String { return self._s[1348]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1349]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1347]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1348]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1349]! } + public var Passport_Language_ka: String { return self._s[1350]! } + public var Call_Decline: String { return self._s[1351]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1352]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_0]) + return formatWithArgumentRanges(self._s[1355]!, self._r[1355]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1353]! } + public var CallFeedback_Send: String { return self._s[1356]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1355]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1357]! } - public var Passport_DeletePassport: String { return self._s[1358]! } - public var Appearance_AppIconFilled: String { return self._s[1359]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1360]! } - public var Month_ShortDecember: String { return self._s[1361]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1363]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1358]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1360]! } + public var Passport_DeletePassport: String { return self._s[1361]! } + public var Appearance_AppIconFilled: String { return self._s[1362]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1363]! } + public var Month_ShortDecember: String { return self._s[1364]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1366]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1364]!, self._r[1364]!, [_0]) + return formatWithArgumentRanges(self._s[1367]!, self._r[1367]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1365]! } - public var Conversation_EncryptedDescription1: String { return self._s[1366]! } - public var Conversation_EncryptedDescription2: String { return self._s[1367]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1368]! } - public var Conversation_EncryptedDescription3: String { return self._s[1369]! } - public var PhotoEditor_SharpenTool: String { return self._s[1370]! } + public var Channel_Stickers_Searching: String { return self._s[1368]! } + public var Conversation_EncryptedDescription1: String { return self._s[1369]! } + public var Conversation_EncryptedDescription2: String { return self._s[1370]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1371]! } + public var Conversation_EncryptedDescription3: String { return self._s[1372]! } + public var PhotoEditor_SharpenTool: String { return self._s[1373]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_0]) + return formatWithArgumentRanges(self._s[1374]!, self._r[1374]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1373]! } - public var Channel_Members_AddMembers: String { return self._s[1374]! } - public var Wallpaper_Search: String { return self._s[1375]! } - public var Weekday_Friday: String { return self._s[1376]! } - public var Privacy_ContactsSync: String { return self._s[1377]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1378]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1379]! } + public var Conversation_EncryptedDescription4: String { return self._s[1376]! } + public var Channel_Members_AddMembers: String { return self._s[1377]! } + public var Wallpaper_Search: String { return self._s[1378]! } + public var Weekday_Friday: String { return self._s[1379]! } + public var Privacy_ContactsSync: String { return self._s[1380]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1381]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1382]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_0]) - } - public var GroupInfo_Permissions_Removed: String { return self._s[1381]! } - public var Passport_Identity_GenderMale: String { return self._s[1382]! } - public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1383]!, self._r[1383]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1384]! } - public var Conversation_JumpToDate: String { return self._s[1385]! } - public var Contacts_GlobalSearch: String { return self._s[1386]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1387]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1388]! } - public var Profile_MessageLifetime1d: String { return self._s[1389]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1384]! } + public var Passport_Identity_GenderMale: String { return self._s[1385]! } + public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1386]!, self._r[1386]!, [_0]) + } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1387]! } + public var Conversation_JumpToDate: String { return self._s[1388]! } + public var Contacts_GlobalSearch: String { return self._s[1389]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1390]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1391]! } + public var Profile_MessageLifetime1d: String { return self._s[1392]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1390]!, self._r[1390]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1393]!, self._r[1393]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1393]! } + public var StickerPack_BuiltinPackName: String { return self._s[1396]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1397]!, self._r[1397]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1395]! } - public var Passport_InfoTitle: String { return self._s[1397]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1398]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1398]! } + public var Passport_InfoTitle: String { return self._s[1400]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1401]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_0]) + return formatWithArgumentRanges(self._s[1405]!, self._r[1405]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1403]!, self._r[1403]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1404]! } - public var Profile_BotInfo: String { return self._s[1405]! } - public var Watch_Compose_CreateMessage: String { return self._s[1406]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1407]! } - public var Month_ShortNovember: String { return self._s[1408]! } - public var Conversation_ScamWarning: String { return self._s[1409]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1410]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1411]! } - public var NotificationsSound_Chime: String { return self._s[1412]! } - public var Passport_Language_ko: String { return self._s[1414]! } - public var InviteText_URL: String { return self._s[1415]! } - public var TextFormat_Monospace: String { return self._s[1416]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1407]! } + public var Profile_BotInfo: String { return self._s[1408]! } + public var Watch_Compose_CreateMessage: String { return self._s[1409]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1410]! } + public var Month_ShortNovember: String { return self._s[1411]! } + public var Conversation_ScamWarning: String { return self._s[1412]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1413]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1414]! } + public var NotificationsSound_Chime: String { return self._s[1415]! } + public var Passport_Language_ko: String { return self._s[1417]! } + public var InviteText_URL: String { return self._s[1418]! } + public var TextFormat_Monospace: String { return self._s[1419]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1420]!, self._r[1420]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1418]!, self._r[1418]!, [_0]) + return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1421]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1422]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1423]! } - public var Your_card_has_expired: String { return self._s[1424]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1425]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1426]! } - public var Conversation_Report: String { return self._s[1430]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1431]! } - public var Notification_MessageLifetime1m: String { return self._s[1432]! } - public var Privacy_ContactsTitle: String { return self._s[1433]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1434]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1435]! } - public var Channel_Members_Title: String { return self._s[1436]! } - public var Map_OpenInWaze: String { return self._s[1437]! } - public var Login_PhoneBannedError: String { return self._s[1438]! } + public var Passport_InfoLearnMore: String { return self._s[1424]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1425]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1426]! } + public var Your_card_has_expired: String { return self._s[1427]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1428]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1429]! } + public var Conversation_Report: String { return self._s[1433]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1434]! } + public var Notification_MessageLifetime1m: String { return self._s[1435]! } + public var Privacy_ContactsTitle: String { return self._s[1436]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1437]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1438]! } + public var Channel_Members_Title: String { return self._s[1439]! } + public var Map_OpenInWaze: String { return self._s[1440]! } + public var Login_PhoneBannedError: String { return self._s[1441]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_0]) + return formatWithArgumentRanges(self._s[1442]!, self._r[1442]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1440]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1441]! } - public var Common_OK: String { return self._s[1442]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1443]! } - public var Cache_Music: String { return self._s[1444]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1445]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1446]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1447]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1443]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1444]! } + public var Common_OK: String { return self._s[1445]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1446]! } + public var Cache_Music: String { return self._s[1447]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1448]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1449]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1450]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1]) + return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1449]!, self._r[1449]!, [_0]) + return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_0]) } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_0]) + return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1452]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1453]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1455]! } - public var State_ConnectingToProxyInfo: String { return self._s[1456]! } - public var Message_VideoMessage: String { return self._s[1458]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1459]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1460]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1461]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1462]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1463]! } - public var Activity_RecordingAudio: String { return self._s[1464]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1465]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1466]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1455]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1456]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1458]! } + public var State_ConnectingToProxyInfo: String { return self._s[1459]! } + public var Message_VideoMessage: String { return self._s[1461]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1462]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1463]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1464]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1465]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1466]! } + public var Activity_RecordingAudio: String { return self._s[1467]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1468]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1469]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1468]!, self._r[1468]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1471]!, self._r[1471]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_0]) + return formatWithArgumentRanges(self._s[1475]!, self._r[1475]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1473]! } - public var UserInfo_AddPhone: String { return self._s[1474]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1475]! } + public var Conversation_ApplyLocalization: String { return self._s[1476]! } + public var UserInfo_AddPhone: String { return self._s[1477]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1478]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0]) + return formatWithArgumentRanges(self._s[1479]!, self._r[1479]!, [_0]) } - public var Passport_Scans: String { return self._s[1478]! } - public var BlockedUsers_Unblock: String { return self._s[1479]! } + public var Passport_Scans: String { return self._s[1481]! } + public var BlockedUsers_Unblock: String { return self._s[1482]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_1]) + return formatWithArgumentRanges(self._s[1483]!, self._r[1483]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1481]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1482]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1483]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1484]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1485]! } + public var Channel_Management_LabelCreator: String { return self._s[1484]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1485]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1486]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1487]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1488]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1486]!, self._r[1486]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1489]!, self._r[1489]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1487]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1488]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1489]! } - public var ChannelIntro_CreateChannel: String { return self._s[1490]! } - public var Conversation_UnreadMessages: String { return self._s[1491]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1492]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1493]! } - public var Notification_GroupActivated: String { return self._s[1494]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1495]! } + public var Login_PhoneNumberHelp: String { return self._s[1490]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1491]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1492]! } + public var ChannelIntro_CreateChannel: String { return self._s[1493]! } + public var Conversation_UnreadMessages: String { return self._s[1494]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1495]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1496]! } + public var Notification_GroupActivated: String { return self._s[1497]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1498]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1496]!, self._r[1496]!, [_0]) + return formatWithArgumentRanges(self._s[1499]!, self._r[1499]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1497]!, self._r[1497]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1499]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1502]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) - } - public var Undo_DeletedChannel: String { return self._s[1501]! } - public var CallFeedback_AddComment: String { return self._s[1502]! } - public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1503]!, self._r[1503]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1504]! } + public var Undo_DeletedChannel: String { return self._s[1504]! } + public var CallFeedback_AddComment: String { return self._s[1505]! } + public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1506]!, self._r[1506]!, [_0]) + } + public var Document_TargetConfirmationFormat: String { return self._s[1507]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0]) + return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1506]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1509]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1507]!, self._r[1507]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1510]!, self._r[1510]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1508]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1509]! } + public var Contacts_SortByName: String { return self._s[1511]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1512]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1514]!, self._r[1514]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1512]! } - public var ScheduledMessages_EditTime: String { return self._s[1513]! } - public var Conversation_ClearSelfHistory: String { return self._s[1514]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1515]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1516]! } - public var Stickers_SuggestNone: String { return self._s[1517]! } - public var ChatSettings_Cache: String { return self._s[1518]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1519]! } - public var Media_ShareThisPhoto: String { return self._s[1520]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1521]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1522]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1523]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1524]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1525]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1526]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1527]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1529]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1530]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1531]! } - public var Map_OpenIn: String { return self._s[1532]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1515]! } + public var ScheduledMessages_EditTime: String { return self._s[1516]! } + public var Conversation_ClearSelfHistory: String { return self._s[1517]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1518]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1519]! } + public var Stickers_SuggestNone: String { return self._s[1520]! } + public var ChatSettings_Cache: String { return self._s[1521]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1522]! } + public var Media_ShareThisPhoto: String { return self._s[1523]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1524]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1525]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1526]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1527]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1528]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1529]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1530]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1532]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1533]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1534]! } + public var Map_OpenIn: String { return self._s[1535]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_1]) + return formatWithArgumentRanges(self._s[1538]!, self._r[1538]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1536]!, self._r[1536]!, [_0]) + return formatWithArgumentRanges(self._s[1539]!, self._r[1539]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1537]! } - public var MessagePoll_LabelClosed: String { return self._s[1538]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1540]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1541]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1542]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1543]! } - public var Login_SelectCountry_Title: String { return self._s[1544]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1545]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1540]! } + public var MessagePoll_LabelClosed: String { return self._s[1541]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1543]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1544]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1545]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1546]! } + public var Login_SelectCountry_Title: String { return self._s[1547]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1548]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1549]!, self._r[1549]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1547]! } - public var Watch_Suggestion_BRB: String { return self._s[1548]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1549]! } - public var Contacts_PermissionsTitle: String { return self._s[1550]! } - public var Conversation_RestrictedInline: String { return self._s[1551]! } - public var StickerPack_ViewPack: String { return self._s[1553]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1550]! } + public var Watch_Suggestion_BRB: String { return self._s[1551]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1552]! } + public var Contacts_PermissionsTitle: String { return self._s[1553]! } + public var Conversation_RestrictedInline: String { return self._s[1554]! } + public var StickerPack_ViewPack: String { return self._s[1556]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1554]!, self._r[1554]!, [_0]) + return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1556]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1559]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1561]! } - public var Channel_Info_Stickers: String { return self._s[1562]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1563]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1564]! } - public var Passport_DeletePersonalDetails: String { return self._s[1565]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1566]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1567]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1568]! } - public var Conversation_SearchNoResults: String { return self._s[1570]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1571]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1572]! } - public var Login_Code: String { return self._s[1573]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1574]! } - public var Weekday_ShortThursday: String { return self._s[1575]! } - public var Resolve_ErrorNotFound: String { return self._s[1577]! } - public var LastSeen_Offline: String { return self._s[1578]! } - public var PeopleNearby_NoMembers: String { return self._s[1579]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1580]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1581]! } - public var GroupInfo_Title: String { return self._s[1583]! } - public var NotificationsSound_Note: String { return self._s[1584]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1585]! } - public var Watch_Message_Poll: String { return self._s[1586]! } - public var Privacy_Calls: String { return self._s[1587]! } + public var Compose_NewChannel: String { return self._s[1559]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1562]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1564]! } + public var Channel_Info_Stickers: String { return self._s[1565]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1566]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1567]! } + public var Passport_DeletePersonalDetails: String { return self._s[1568]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1569]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1570]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1571]! } + public var Conversation_SearchNoResults: String { return self._s[1573]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1574]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1575]! } + public var Login_Code: String { return self._s[1576]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1577]! } + public var Weekday_ShortThursday: String { return self._s[1578]! } + public var Resolve_ErrorNotFound: String { return self._s[1580]! } + public var LastSeen_Offline: String { return self._s[1581]! } + public var PeopleNearby_NoMembers: String { return self._s[1582]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1583]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1584]! } + public var GroupInfo_Title: String { return self._s[1586]! } + public var NotificationsSound_Note: String { return self._s[1587]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1588]! } + public var Watch_Message_Poll: String { return self._s[1589]! } + public var Privacy_Calls: String { return self._s[1590]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1588]!, self._r[1588]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1591]!, self._r[1591]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1589]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1590]! } - public var Notifications_Reset: String { return self._s[1591]! } - public var Conversation_Pin: String { return self._s[1592]! } - public var Passport_Language_lv: String { return self._s[1593]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1594]! } - public var BlockedUsers_Info: String { return self._s[1595]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1597]! } - public var Watch_Conversation_Unblock: String { return self._s[1599]! } + public var Month_ShortAugust: String { return self._s[1592]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1593]! } + public var Notifications_Reset: String { return self._s[1594]! } + public var Conversation_Pin: String { return self._s[1595]! } + public var Passport_Language_lv: String { return self._s[1596]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1597]! } + public var BlockedUsers_Info: String { return self._s[1598]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1600]! } + public var Watch_Conversation_Unblock: String { return self._s[1602]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1600]!, self._r[1600]!, [_0]) - } - public var CloudStorage_Title: String { return self._s[1601]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1602]! } - public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1604]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1605]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1606]! } - public var Passport_Address_EditBankStatement: String { return self._s[1607]! } - public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_1, _2]) + public var CloudStorage_Title: String { return self._s[1604]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1605]! } + public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1606]!, self._r[1606]!, [_0]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1609]! } - public var ShareMenu_Comment: String { return self._s[1610]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1611]! } - public var Notifications_PermissionsTitle: String { return self._s[1612]! } - public var GroupPermission_NoSendLinks: String { return self._s[1613]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1614]! } - public var Settings_Support: String { return self._s[1615]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1616]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1617]! } - public var Privacy_Forwards_Preview: String { return self._s[1618]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1619]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1620]! } - public var Common_Select: String { return self._s[1622]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1623]! } - public var WallpaperSearch_ColorGray: String { return self._s[1625]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1626]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1627]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1628]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1629]! } - public var Widget_AuthRequired: String { return self._s[1630]! } - public var Camera_FlashOn: String { return self._s[1631]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1632]! } - public var Watch_Suggestion_OK: String { return self._s[1633]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1607]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1608]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1609]! } + public var Passport_Address_EditBankStatement: String { return self._s[1610]! } + public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1611]!, self._r[1611]!, [_1, _2]) + } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1612]! } + public var ShareMenu_Comment: String { return self._s[1613]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1614]! } + public var Notifications_PermissionsTitle: String { return self._s[1615]! } + public var GroupPermission_NoSendLinks: String { return self._s[1616]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1617]! } + public var Settings_Support: String { return self._s[1618]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1619]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1620]! } + public var Privacy_Forwards_Preview: String { return self._s[1621]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1622]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1623]! } + public var Common_Select: String { return self._s[1625]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1626]! } + public var WallpaperSearch_ColorGray: String { return self._s[1628]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1629]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1630]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1631]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1632]! } + public var Widget_AuthRequired: String { return self._s[1633]! } + public var Camera_FlashOn: String { return self._s[1634]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1635]! } + public var Watch_Suggestion_OK: String { return self._s[1636]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1635]!, self._r[1635]!, [_0]) + return formatWithArgumentRanges(self._s[1638]!, self._r[1638]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1637]!, self._r[1637]!, [_0]) + return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1638]! } - public var DialogList_AdLabel: String { return self._s[1639]! } - public var WatchRemote_NotificationText: String { return self._s[1640]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1641]! } - public var Conversation_ReportSpam: String { return self._s[1642]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1643]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1645]! } - public var PhoneLabel_Title: String { return self._s[1646]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1647]! } - public var Settings_ChangePhoneNumber: String { return self._s[1648]! } - public var Notifications_ExceptionsTitle: String { return self._s[1649]! } - public var Notifications_AlertTones: String { return self._s[1650]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1651]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1652]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1653]! } - public var VoiceOver_Chat_Photo: String { return self._s[1655]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1656]! } - public var ReportPeer_ReasonOther: String { return self._s[1657]! } - public var KeyCommand_ScrollDown: String { return self._s[1659]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1660]! } + public var TextFormat_Strikethrough: String { return self._s[1641]! } + public var DialogList_AdLabel: String { return self._s[1642]! } + public var WatchRemote_NotificationText: String { return self._s[1643]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1644]! } + public var Conversation_ReportSpam: String { return self._s[1645]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1646]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1648]! } + public var PhoneLabel_Title: String { return self._s[1649]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1650]! } + public var Settings_ChangePhoneNumber: String { return self._s[1651]! } + public var Notifications_ExceptionsTitle: String { return self._s[1652]! } + public var Notifications_AlertTones: String { return self._s[1653]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1654]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1655]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1656]! } + public var VoiceOver_Chat_Photo: String { return self._s[1658]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1659]! } + public var ReportPeer_ReasonOther: String { return self._s[1660]! } + public var KeyCommand_ScrollDown: String { return self._s[1662]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1663]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1661]!, self._r[1661]!, [_0]) + return formatWithArgumentRanges(self._s[1664]!, self._r[1664]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1662]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1663]! } - public var AuthSessions_LogOut: String { return self._s[1664]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1665]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1666]! } - public var Passport_Phone_Title: String { return self._s[1667]! } - public var Settings_PhoneNumber: String { return self._s[1668]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1665]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1666]! } + public var AuthSessions_LogOut: String { return self._s[1667]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1668]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1669]! } + public var Passport_Phone_Title: String { return self._s[1670]! } + public var Settings_PhoneNumber: String { return self._s[1671]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1669]!, self._r[1669]!, [_0]) + return formatWithArgumentRanges(self._s[1672]!, self._r[1672]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1670]! } - public var WebSearch_SearchNoResults: String { return self._s[1671]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1673]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1674]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1675]! } - public var PhotoEditor_CurvesTool: String { return self._s[1676]! } - public var Checkout_PaymentMethod: String { return self._s[1678]! } + public var NotificationsSound_Alert: String { return self._s[1673]! } + public var WebSearch_SearchNoResults: String { return self._s[1674]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1676]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1677]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1678]! } + public var PhotoEditor_CurvesTool: String { return self._s[1679]! } + public var Checkout_PaymentMethod: String { return self._s[1681]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1679]!, self._r[1679]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1680]! } - public var Camera_PhotoMode: String { return self._s[1683]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1685]! } - public var CallSettings_OnMobile: String { return self._s[1686]! } - public var Tour_Text2: String { return self._s[1687]! } + public var Contacts_AccessDeniedError: String { return self._s[1683]! } + public var Camera_PhotoMode: String { return self._s[1686]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1688]! } + public var CallSettings_OnMobile: String { return self._s[1689]! } + public var Tour_Text2: String { return self._s[1690]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1691]!, self._r[1691]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1690]! } - public var Permissions_Skip: String { return self._s[1691]! } - public var SecretImage_Title: String { return self._s[1692]! } - public var Watch_MessageView_Title: String { return self._s[1693]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1694]! } - public var AttachmentMenu_Poll: String { return self._s[1695]! } + public var DialogList_EncryptionProcessing: String { return self._s[1693]! } + public var Permissions_Skip: String { return self._s[1694]! } + public var SecretImage_Title: String { return self._s[1695]! } + public var Watch_MessageView_Title: String { return self._s[1696]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1697]! } + public var AttachmentMenu_Poll: String { return self._s[1698]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1696]!, self._r[1696]!, [_0]) + return formatWithArgumentRanges(self._s[1699]!, self._r[1699]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1697]!, self._r[1697]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1700]!, self._r[1700]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1698]! } - public var WallpaperPreview_Title: String { return self._s[1699]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1700]! } - public var Settings_ProxyConnecting: String { return self._s[1701]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1703]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1704]! } - public var Profile_MessageLifetime5s: String { return self._s[1705]! } - public var Username_InvalidCharacters: String { return self._s[1706]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1707]! } - public var ScheduledMessages_ClearAll: String { return self._s[1708]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1709]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1710]! } - public var Settings_AddAccount: String { return self._s[1711]! } - public var Notification_CreatedChannel: String { return self._s[1714]! } + public var Notification_CallCanceled: String { return self._s[1701]! } + public var WallpaperPreview_Title: String { return self._s[1702]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1703]! } + public var Settings_ProxyConnecting: String { return self._s[1704]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1706]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1707]! } + public var Profile_MessageLifetime5s: String { return self._s[1708]! } + public var Username_InvalidCharacters: String { return self._s[1709]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1710]! } + public var ScheduledMessages_ClearAll: String { return self._s[1711]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1712]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1713]! } + public var Settings_AddAccount: String { return self._s[1714]! } + public var Notification_CreatedChannel: String { return self._s[1717]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1718]!, self._r[1718]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1717]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1718]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1719]! } - public var Contacts_TopSection: String { return self._s[1720]! } + public var Passcode_AppLockedAlert: String { return self._s[1720]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1721]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1722]! } + public var Contacts_TopSection: String { return self._s[1723]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1724]!, self._r[1724]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_0]) + return formatWithArgumentRanges(self._s[1725]!, self._r[1725]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1723]! } - public var UserInfo_TapToCall: String { return self._s[1724]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1726]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1727]! } - public var Common_Search: String { return self._s[1728]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1729]! } + public var ReportPeer_ReasonSpam: String { return self._s[1726]! } + public var UserInfo_TapToCall: String { return self._s[1727]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1729]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1730]! } + public var Common_Search: String { return self._s[1731]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1732]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1730]!, self._r[1730]!, [_0]) + return formatWithArgumentRanges(self._s[1733]!, self._r[1733]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1731]! } - public var Message_InvoiceLabel: String { return self._s[1732]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1733]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1734]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1734]! } + public var Message_InvoiceLabel: String { return self._s[1735]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1736]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1737]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) + return formatWithArgumentRanges(self._s[1738]!, self._r[1738]!, [_0]) } - public var Conversation_Info: String { return self._s[1736]! } - public var Login_InfoDeletePhoto: String { return self._s[1737]! } - public var Passport_Language_vi: String { return self._s[1739]! } - public var UserInfo_ScamUserWarning: String { return self._s[1740]! } - public var Conversation_Search: String { return self._s[1741]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1742]! } - public var ReportPeer_ReasonPornography: String { return self._s[1743]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1744]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1745]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1746]! } - public var Channel_Setup_TypeHeader: String { return self._s[1747]! } - public var AuthSessions_LoggedIn: String { return self._s[1748]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1749]! } - public var Login_SmsRequestState3: String { return self._s[1750]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1751]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1752]! } - public var Join_ChannelsTooMuch: String { return self._s[1753]! } - public var Channel_Edit_LinkItem: String { return self._s[1754]! } - public var Privacy_Calls_P2PNever: String { return self._s[1755]! } - public var Conversation_AddToReadingList: String { return self._s[1757]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1758]! } - public var Message_Animation: String { return self._s[1759]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1760]! } - public var Map_Unknown: String { return self._s[1761]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1762]! } + public var Conversation_Info: String { return self._s[1739]! } + public var Login_InfoDeletePhoto: String { return self._s[1740]! } + public var Passport_Language_vi: String { return self._s[1742]! } + public var UserInfo_ScamUserWarning: String { return self._s[1743]! } + public var Conversation_Search: String { return self._s[1744]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1745]! } + public var ReportPeer_ReasonPornography: String { return self._s[1746]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1747]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1748]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1749]! } + public var Channel_Setup_TypeHeader: String { return self._s[1750]! } + public var AuthSessions_LoggedIn: String { return self._s[1751]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1752]! } + public var Login_SmsRequestState3: String { return self._s[1753]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1754]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1755]! } + public var Join_ChannelsTooMuch: String { return self._s[1756]! } + public var Channel_Edit_LinkItem: String { return self._s[1757]! } + public var Privacy_Calls_P2PNever: String { return self._s[1758]! } + public var Conversation_AddToReadingList: String { return self._s[1760]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1761]! } + public var Message_Animation: String { return self._s[1762]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1763]! } + public var Map_Unknown: String { return self._s[1764]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1765]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1763]!, self._r[1763]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1766]!, self._r[1766]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1764]!, self._r[1764]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1767]!, self._r[1767]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1765]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1766]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1767]! } + public var Call_StatusRequesting: String { return self._s[1768]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1769]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1770]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_0]) + return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_0]) } - public var Update_Skip: String { return self._s[1770]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1771]! } - public var Message_PinnedPollMessage: String { return self._s[1772]! } - public var BlockedUsers_Title: String { return self._s[1773]! } + public var Update_Skip: String { return self._s[1773]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1774]! } + public var Message_PinnedPollMessage: String { return self._s[1775]! } + public var BlockedUsers_Title: String { return self._s[1776]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_1]) + return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1775]! } - public var NotificationsSound_Bell: String { return self._s[1776]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1777]! } - public var Weekday_Monday: String { return self._s[1778]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1779]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1780]! } - public var ChatSettings_Groups: String { return self._s[1781]! } + public var Username_CheckingUsername: String { return self._s[1778]! } + public var NotificationsSound_Bell: String { return self._s[1779]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1780]! } + public var Weekday_Monday: String { return self._s[1781]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1782]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1783]! } + public var ChatSettings_Groups: String { return self._s[1784]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) + return formatWithArgumentRanges(self._s[1785]!, self._r[1785]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1783]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1785]! } - public var ChatList_Unmute: String { return self._s[1786]! } - public var PhotoEditor_CurvesAll: String { return self._s[1787]! } - public var Weekday_ShortTuesday: String { return self._s[1788]! } - public var DialogList_Read: String { return self._s[1789]! } - public var Appearance_AppIconClassic: String { return self._s[1790]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1791]! } - public var Passport_Identity_Gender: String { return self._s[1792]! } + public var Your_card_was_declined: String { return self._s[1786]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1788]! } + public var ChatList_Unmute: String { return self._s[1789]! } + public var PhotoEditor_CurvesAll: String { return self._s[1790]! } + public var Weekday_ShortTuesday: String { return self._s[1791]! } + public var DialogList_Read: String { return self._s[1792]! } + public var Appearance_AppIconClassic: String { return self._s[1793]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1794]! } + public var Passport_Identity_Gender: String { return self._s[1795]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1793]!, self._r[1793]!, [_0]) - } - public var Target_SelectGroup: String { return self._s[1794]! } - public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_0]) } - public var Passport_Language_en: String { return self._s[1797]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1798]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1799]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1800]! } - public var ScheduledMessages_SendNow: String { return self._s[1801]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1803]! } - public var Login_InfoHelp: String { return self._s[1804]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1805]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1806]! } + public var Target_SelectGroup: String { return self._s[1797]! } + public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1799]!, self._r[1799]!, [_0]) + } + public var Passport_Language_en: String { return self._s[1800]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1801]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1802]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1803]! } + public var ScheduledMessages_SendNow: String { return self._s[1804]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1806]! } + public var Login_InfoHelp: String { return self._s[1807]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1808]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1809]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1810]!, self._r[1810]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1810]! } - public var CreatePoll_Title: String { return self._s[1811]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1812]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1813]! } - public var UserInfo_GroupsInCommon: String { return self._s[1814]! } - public var Call_AudioRouteHide: String { return self._s[1815]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1817]! } + public var SocksProxySetup_AddProxy: String { return self._s[1813]! } + public var CreatePoll_Title: String { return self._s[1814]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1815]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1816]! } + public var UserInfo_GroupsInCommon: String { return self._s[1817]! } + public var Call_AudioRouteHide: String { return self._s[1818]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1820]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_0]) + return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1819]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1820]! } - public var Notifications_Title: String { return self._s[1821]! } - public var Group_Username_InvalidTooShort: String { return self._s[1822]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1823]! } + public var TextFormat_Bold: String { return self._s[1822]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1823]! } + public var Notifications_Title: String { return self._s[1824]! } + public var Group_Username_InvalidTooShort: String { return self._s[1825]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1826]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1827]!, self._r[1827]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1826]! } - public var Stickers_SuggestAdded: String { return self._s[1827]! } - public var Login_CountryCode: String { return self._s[1828]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1829]! } - public var Map_GetDirections: String { return self._s[1830]! } - public var Login_PhoneFloodError: String { return self._s[1831]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1829]! } + public var Stickers_SuggestAdded: String { return self._s[1830]! } + public var Login_CountryCode: String { return self._s[1831]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1832]! } + public var Map_GetDirections: String { return self._s[1833]! } + public var Login_PhoneFloodError: String { return self._s[1834]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1832]!, self._r[1832]!, [_0]) + return formatWithArgumentRanges(self._s[1835]!, self._r[1835]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1834]! } - public var Group_Location_ChangeLocation: String { return self._s[1835]! } - public var Notification_GroupInviterSelf: String { return self._s[1836]! } - public var InstantPage_TapToOpenLink: String { return self._s[1837]! } + public var Settings_SetUsername: String { return self._s[1837]! } + public var Group_Location_ChangeLocation: String { return self._s[1838]! } + public var Notification_GroupInviterSelf: String { return self._s[1839]! } + public var InstantPage_TapToOpenLink: String { return self._s[1840]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_0]) + return formatWithArgumentRanges(self._s[1841]!, self._r[1841]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1839]! } - public var SecretChat_Title: String { return self._s[1840]! } - public var Group_UpgradeNoticeText1: String { return self._s[1841]! } - public var AuthSessions_Title: String { return self._s[1842]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1842]! } + public var SecretChat_Title: String { return self._s[1843]! } + public var Group_UpgradeNoticeText1: String { return self._s[1844]! } + public var AuthSessions_Title: String { return self._s[1845]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_0]) + return formatWithArgumentRanges(self._s[1846]!, self._r[1846]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1844]! } - public var Channel_About_Title: String { return self._s[1845]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1846]! } + public var PhotoEditor_CropAuto: String { return self._s[1847]! } + public var Channel_About_Title: String { return self._s[1848]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1849]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1851]!, self._r[1851]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1849]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1851]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1852]! } + public var VoiceOver_MessageContextReport: String { return self._s[1852]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1854]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1855]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_1]) + return formatWithArgumentRanges(self._s[1856]!, self._r[1856]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1855]!, self._r[1855]!, [_0]) + return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1856]!, self._r[1856]!, [_0]) + return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1857]! } - public var Presence_online: String { return self._s[1859]! } - public var PasscodeSettings_Title: String { return self._s[1860]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1861]! } - public var Web_OpenExternal: String { return self._s[1862]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1864]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1865]! } - public var LocalGroup_Title: String { return self._s[1866]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1860]! } + public var Presence_online: String { return self._s[1862]! } + public var PasscodeSettings_Title: String { return self._s[1863]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1864]! } + public var Web_OpenExternal: String { return self._s[1865]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1867]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1868]! } + public var LocalGroup_Title: String { return self._s[1869]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1868]! } - public var Map_YouAreHere: String { return self._s[1869]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1871]!, self._r[1871]!, [_0]) + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1871]! } + public var Map_YouAreHere: String { return self._s[1872]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1873]!, self._r[1873]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1872]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1873]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1874]!, self._r[1874]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0]) + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1875]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1876]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1876]! } - public var Bot_Start: String { return self._s[1877]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1878]!, self._r[1878]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1879]!, self._r[1879]!, [_0]) + public var SocksProxySetup_Username: String { return self._s[1879]! } + public var Bot_Start: String { return self._s[1880]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1880]! } - public var AccentColor_Title: String { return self._s[1882]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1883]! } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[1883]! } + public var AccentColor_Title: String { return self._s[1885]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1886]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1887]!, self._r[1887]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) + return formatWithArgumentRanges(self._s[1888]!, self._r[1888]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1886]!, self._r[1886]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1887]! } - public var Login_InfoAvatarPhoto: String { return self._s[1888]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1889]! } - public var Tour_Title4: String { return self._s[1890]! } - public var Passport_Identity_Translation: String { return self._s[1891]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1892]! } - public var Login_TermsOfServiceLabel: String { return self._s[1894]! } - public var Passport_Language_it: String { return self._s[1895]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1896]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1897]! } - public var Conversation_ClearAll: String { return self._s[1899]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1901]! } - public var TwoStepAuth_FloodError: String { return self._s[1902]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1890]! } + public var Login_InfoAvatarPhoto: String { return self._s[1891]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1892]! } + public var Tour_Title4: String { return self._s[1893]! } + public var Passport_Identity_Translation: String { return self._s[1894]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1895]! } + public var Login_TermsOfServiceLabel: String { return self._s[1897]! } + public var Passport_Language_it: String { return self._s[1898]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1899]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1900]! } + public var Conversation_ClearAll: String { return self._s[1902]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1904]! } + public var TwoStepAuth_FloodError: String { return self._s[1905]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1903]!, self._r[1903]!, [_1]) - } - public var Paint_Delete: String { return self._s[1904]! } - public var Privacy_AddNewPeer: String { return self._s[1905]! } - public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1906]!, self._r[1906]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1907]! } + public var Paint_Delete: String { return self._s[1907]! } + public var Privacy_AddNewPeer: String { return self._s[1908]! } + public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1909]!, self._r[1909]!, [_1]) + } + public var LogoutOptions_SetPasscodeText: String { return self._s[1910]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1908]!, self._r[1908]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1909]! } + public var Message_PinnedAudioMessage: String { return self._s[1912]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1910]!, self._r[1910]!, [_0]) + return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1911]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1912]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1913]! } - public var Conversation_MessageEditedLabel: String { return self._s[1914]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1915]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1916]! } + public var Notification_Mute1hMin: String { return self._s[1914]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1915]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1916]! } + public var Conversation_MessageEditedLabel: String { return self._s[1917]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1918]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1919]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1918]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1921]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1919]!, self._r[1919]!, [_1]) + return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1920]! } - public var Month_GenOctober: String { return self._s[1921]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1922]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1923]! } - public var MediaPicker_TimerTooltip: String { return self._s[1925]! } - public var SharedMedia_TitleAll: String { return self._s[1926]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1929]! } - public var Conversation_RestrictedMedia: String { return self._s[1930]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1931]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1933]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1934]! } + public var AccessDenied_LocationTracking: String { return self._s[1923]! } + public var Month_GenOctober: String { return self._s[1924]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1925]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1926]! } + public var MediaPicker_TimerTooltip: String { return self._s[1928]! } + public var SharedMedia_TitleAll: String { return self._s[1929]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1932]! } + public var Conversation_RestrictedMedia: String { return self._s[1933]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1934]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1936]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1937]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1935]!, self._r[1935]!, [_0]) + return formatWithArgumentRanges(self._s[1938]!, self._r[1938]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1938]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1940]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1941]! } + public var Conversation_SavedMessages: String { return self._s[1941]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1943]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1944]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1943]!, self._r[1943]!, [_0]) + return formatWithArgumentRanges(self._s[1946]!, self._r[1946]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1944]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1947]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_0]) + return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1946]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1947]! } + public var ReportPeer_AlertSuccess: String { return self._s[1949]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1950]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1949]! } - public var PhotoEditor_FadeTool: String { return self._s[1950]! } - public var Privacy_ContactsReset: String { return self._s[1951]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1952]! } + public var PhotoEditor_FadeTool: String { return self._s[1953]! } + public var Privacy_ContactsReset: String { return self._s[1954]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0]) + return formatWithArgumentRanges(self._s[1956]!, self._r[1956]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1954]! } - public var ChatList_Mute: String { return self._s[1955]! } - public var Permissions_CellularDataText_v0: String { return self._s[1956]! } - public var ShareMenu_SelectChats: String { return self._s[1958]! } - public var MusicPlayer_VoiceNote: String { return self._s[1959]! } - public var Conversation_RestrictedText: String { return self._s[1960]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1961]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1962]! } - public var Cache_Videos: String { return self._s[1963]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1964]! } - public var FeatureDisabled_Oops: String { return self._s[1966]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1967]! } + public var Message_PinnedVideoMessage: String { return self._s[1957]! } + public var ChatList_Mute: String { return self._s[1958]! } + public var Permissions_CellularDataText_v0: String { return self._s[1959]! } + public var ShareMenu_SelectChats: String { return self._s[1961]! } + public var MusicPlayer_VoiceNote: String { return self._s[1962]! } + public var Conversation_RestrictedText: String { return self._s[1963]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1964]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1965]! } + public var Cache_Videos: String { return self._s[1966]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1967]! } + public var FeatureDisabled_Oops: String { return self._s[1969]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1970]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1968]!, self._r[1968]!, [_0]) + return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1969]! } - public var GroupPermission_NoSendPolls: String { return self._s[1970]! } - public var Message_VideoExpired: String { return self._s[1972]! } - public var Notifications_Badge: String { return self._s[1973]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1974]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1975]! } - public var Username_InvalidTooShort: String { return self._s[1976]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1977]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1978]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1979]! } + public var Stickers_GroupStickersHelp: String { return self._s[1972]! } + public var GroupPermission_NoSendPolls: String { return self._s[1973]! } + public var Message_VideoExpired: String { return self._s[1975]! } + public var Notifications_Badge: String { return self._s[1976]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1977]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1978]! } + public var Username_InvalidTooShort: String { return self._s[1979]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1980]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1981]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1982]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1980]!, self._r[1980]!, [_1]) + return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1981]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1982]! } - public var SharedMedia_CategoryDocs: String { return self._s[1985]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1984]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1985]! } + public var SharedMedia_CategoryDocs: String { return self._s[1988]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1]) - } - public var Privacy_Forwards_NeverLink: String { return self._s[1988]! } - public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1989]!, self._r[1989]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1990]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1991]! } + public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_1]) + } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1993]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_0]) + return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1992]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1993]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1994]! } - public var Channel_UpdatePhotoItem: String { return self._s[1995]! } - public var GroupInfo_LeftStatus: String { return self._s[1996]! } - public var Watch_MessageView_Forward: String { return self._s[1998]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[1999]! } - public var Cache_ClearEmpty: String { return self._s[2001]! } - public var Localization_LanguageName: String { return self._s[2002]! } - public var WebSearch_GIFs: String { return self._s[2003]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2004]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2005]! } - public var Common_Back: String { return self._s[2006]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2007]! } + public var ChatSettings_PrivateChats: String { return self._s[1995]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1996]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1997]! } + public var Channel_UpdatePhotoItem: String { return self._s[1998]! } + public var GroupInfo_LeftStatus: String { return self._s[1999]! } + public var Watch_MessageView_Forward: String { return self._s[2001]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2002]! } + public var Cache_ClearEmpty: String { return self._s[2004]! } + public var Localization_LanguageName: String { return self._s[2005]! } + public var WebSearch_GIFs: String { return self._s[2006]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2007]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2008]! } + public var Common_Back: String { return self._s[2009]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2010]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2008]!, self._r[2008]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2011]!, self._r[2011]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2009]! } - public var Watch_Conversation_Reply: String { return self._s[2011]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2013]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2014]! } - public var Channel_BanUser_Unban: String { return self._s[2016]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2017]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2018]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2020]! } - public var Passport_Identity_Name: String { return self._s[2021]! } + public var Passport_Email_Help: String { return self._s[2012]! } + public var Watch_Conversation_Reply: String { return self._s[2014]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2016]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2017]! } + public var Channel_BanUser_Unban: String { return self._s[2019]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2020]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2021]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2023]! } + public var Passport_Identity_Name: String { return self._s[2024]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_0]) + return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2023]! } - public var Conversation_BlockUser: String { return self._s[2024]! } - public var Month_GenJanuary: String { return self._s[2025]! } - public var ChatSettings_TextSize: String { return self._s[2026]! } - public var Notification_PassportValuePhone: String { return self._s[2027]! } - public var Passport_Language_ne: String { return self._s[2028]! } - public var Notification_CallBack: String { return self._s[2029]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2030]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2026]! } + public var Conversation_BlockUser: String { return self._s[2027]! } + public var Month_GenJanuary: String { return self._s[2028]! } + public var ChatSettings_TextSize: String { return self._s[2029]! } + public var Notification_PassportValuePhone: String { return self._s[2030]! } + public var Passport_Language_ne: String { return self._s[2031]! } + public var Notification_CallBack: String { return self._s[2032]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2033]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2031]!, self._r[2031]!, [_0]) + return formatWithArgumentRanges(self._s[2034]!, self._r[2034]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2032]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2033]! } - public var Stickers_FrequentlyUsed: String { return self._s[2034]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2035]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2037]! } + public var Channel_Info_Management: String { return self._s[2035]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2036]! } + public var Stickers_FrequentlyUsed: String { return self._s[2037]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2038]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2040]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2038]!, self._r[2038]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2039]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2040]! } - public var CreatePoll_TextHeader: String { return self._s[2041]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2042]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2043]! } + public var CreatePoll_TextHeader: String { return self._s[2044]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2042]!, self._r[2042]!, [_0]) + return formatWithArgumentRanges(self._s[2045]!, self._r[2045]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2043]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2044]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2046]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2047]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2048]! } + public var PhotoEditor_QualityMedium: String { return self._s[2046]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2047]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2049]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2050]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2051]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2049]!, self._r[2049]!, [_0]) + return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2050]!, self._r[2050]!, [_1]) + return formatWithArgumentRanges(self._s[2053]!, self._r[2053]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2052]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2053]! } - public var Settings_Username: String { return self._s[2055]! } - public var Conversation_Block: String { return self._s[2057]! } - public var Wallpaper_Wallpaper: String { return self._s[2058]! } - public var SocksProxySetup_UseProxy: String { return self._s[2060]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2061]! } - public var MessageTimer_Forever: String { return self._s[2062]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2063]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2064]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2065]! } - public var Passport_Language_da: String { return self._s[2066]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2067]! } + public var Conversation_LinkDialogOpen: String { return self._s[2055]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2056]! } + public var Settings_Username: String { return self._s[2058]! } + public var Conversation_Block: String { return self._s[2060]! } + public var Wallpaper_Wallpaper: String { return self._s[2061]! } + public var SocksProxySetup_UseProxy: String { return self._s[2063]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2064]! } + public var MessageTimer_Forever: String { return self._s[2065]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2066]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2067]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2068]! } + public var Passport_Language_da: String { return self._s[2069]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2070]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2068]!, self._r[2068]!, [_0]) - } - public var Passport_Address_EditPassportRegistration: String { return self._s[2069]! } - public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2071]!, self._r[2071]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2073]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2074]! } - public var Conversation_PinnedPoll: String { return self._s[2075]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2076]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2072]! } + public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) + } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2076]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2077]! } + public var Conversation_PinnedPoll: String { return self._s[2078]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2079]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_1]) + return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2078]! } - public var Cache_ByPeerHeader: String { return self._s[2079]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2081]! } + public var Cache_ByPeerHeader: String { return self._s[2082]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_0]) + return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2081]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2084]! } - public var Notification_PinnedMessage: String { return self._s[2085]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2087]! } - public var Contacts_SortBy: String { return self._s[2088]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2084]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2087]! } + public var Notification_PinnedMessage: String { return self._s[2088]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2090]! } + public var Contacts_SortBy: String { return self._s[2091]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_1]) + return formatWithArgumentRanges(self._s[2092]!, self._r[2092]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2094]!, self._r[2094]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2092]! } - public var Watch_UserInfo_Service: String { return self._s[2093]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2095]! } - public var Conversation_Unpin: String { return self._s[2097]! } - public var CancelResetAccount_Title: String { return self._s[2098]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2099]! } + public var Call_EncryptionKey_Title: String { return self._s[2095]! } + public var Watch_UserInfo_Service: String { return self._s[2096]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2098]! } + public var Conversation_Unpin: String { return self._s[2100]! } + public var CancelResetAccount_Title: String { return self._s[2101]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2102]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2101]!, self._r[2101]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2102]! } - public var CallSettings_Title: String { return self._s[2103]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2104]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2106]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2107]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2105]! } + public var CallSettings_Title: String { return self._s[2106]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2107]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2109]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2110]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2109]! } - public var LoginPassword_PasswordHelp: String { return self._s[2110]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2111]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2112]! } - public var Checkout_TotalPaidAmount: String { return self._s[2113]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2112]! } + public var LoginPassword_PasswordHelp: String { return self._s[2113]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2114]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2115]! } + public var Checkout_TotalPaidAmount: String { return self._s[2116]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_0]) + return formatWithArgumentRanges(self._s[2117]!, self._r[2117]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2115]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2117]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2118]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2118]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2120]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2121]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2119]!, self._r[2119]!, [_1]) + return formatWithArgumentRanges(self._s[2122]!, self._r[2122]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2120]! } - public var Contacts_InviteFriends: String { return self._s[2122]! } - public var Map_ChooseLocationTitle: String { return self._s[2123]! } - public var Conversation_StopPoll: String { return self._s[2125]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2123]! } + public var Contacts_InviteFriends: String { return self._s[2125]! } + public var Map_ChooseLocationTitle: String { return self._s[2126]! } + public var Conversation_StopPoll: String { return self._s[2128]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2126]!, self._r[2126]!, [_0]) + return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) } - public var Call_Camera: String { return self._s[2127]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2128]! } - public var Calls_RatingFeedback: String { return self._s[2129]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2130]! } - public var NotificationsSound_Pulse: String { return self._s[2131]! } - public var Watch_LastSeen_Lately: String { return self._s[2132]! } - public var ReportGroupLocation_Report: String { return self._s[2135]! } - public var Widget_NoUsers: String { return self._s[2136]! } - public var Conversation_UnvotePoll: String { return self._s[2137]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2139]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2140]! } - public var NotificationsSound_Circles: String { return self._s[2141]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2143]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2144]! } - public var Proxy_TooltipUnavailable: String { return self._s[2145]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2147]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2149]! } - public var Conversation_FileDropbox: String { return self._s[2150]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2151]! } - public var Tour_Text3: String { return self._s[2153]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2155]! } - public var GroupPermission_NoSendMessages: String { return self._s[2156]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2157]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2158]! } + public var Call_Camera: String { return self._s[2130]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2131]! } + public var Calls_RatingFeedback: String { return self._s[2132]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2133]! } + public var NotificationsSound_Pulse: String { return self._s[2134]! } + public var Watch_LastSeen_Lately: String { return self._s[2135]! } + public var ReportGroupLocation_Report: String { return self._s[2138]! } + public var Widget_NoUsers: String { return self._s[2139]! } + public var Conversation_UnvotePoll: String { return self._s[2140]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2142]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2143]! } + public var NotificationsSound_Circles: String { return self._s[2144]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2146]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2147]! } + public var Proxy_TooltipUnavailable: String { return self._s[2148]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2150]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2152]! } + public var Conversation_FileDropbox: String { return self._s[2153]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2154]! } + public var Tour_Text3: String { return self._s[2156]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2158]! } + public var GroupPermission_NoSendMessages: String { return self._s[2159]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2160]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2161]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_0]) + return formatWithArgumentRanges(self._s[2163]!, self._r[2163]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2161]! } - public var Checkout_ShippingOption_Title: String { return self._s[2162]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2163]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2164]! } + public var Checkout_ShippingOption_Title: String { return self._s[2165]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2166]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2164]!, self._r[2164]!, [_0]) + return formatWithArgumentRanges(self._s[2167]!, self._r[2167]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_0]) + return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2166]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2167]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2168]! } - public var AutoDownloadSettings_Photos: String { return self._s[2170]! } - public var Appearance_PreviewIncomingText: String { return self._s[2171]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2172]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2173]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2174]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2175]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2176]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2177]! } - public var Notification_SecretChatScreenshot: String { return self._s[2178]! } - public var AccessDenied_Wallpapers: String { return self._s[2179]! } - public var Passport_Address_City: String { return self._s[2181]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2182]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2183]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2184]! } - public var AccessDenied_LocationDisabled: String { return self._s[2185]! } - public var Group_Location_Title: String { return self._s[2186]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2188]! } - public var GroupInfo_Sound: String { return self._s[2189]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2190]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2191]! } - public var Contacts_Title: String { return self._s[2192]! } - public var Passport_Language_fr: String { return self._s[2193]! } - public var Notifications_ResetAllNotifications: String { return self._s[2194]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2197]! } - public var Checkout_NewCard_Title: String { return self._s[2198]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2199]! } - public var Conversation_ForwardChats: String { return self._s[2200]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2202]! } - public var Settings_FAQ: String { return self._s[2204]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2205]! } - public var Conversation_ContextMenuForward: String { return self._s[2206]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2209]! } - public var PrivacyPolicy_Title: String { return self._s[2212]! } - public var Notifications_TextTone: String { return self._s[2213]! } - public var Profile_CreateNewContact: String { return self._s[2214]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2215]! } - public var Call_Speaker: String { return self._s[2217]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2218]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2220]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2221]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2169]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2170]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2171]! } + public var AutoDownloadSettings_Photos: String { return self._s[2173]! } + public var Appearance_PreviewIncomingText: String { return self._s[2174]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2175]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2176]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2177]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2178]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2179]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2180]! } + public var Notification_SecretChatScreenshot: String { return self._s[2181]! } + public var AccessDenied_Wallpapers: String { return self._s[2182]! } + public var Passport_Address_City: String { return self._s[2184]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2185]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2186]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2187]! } + public var AccessDenied_LocationDisabled: String { return self._s[2188]! } + public var Group_Location_Title: String { return self._s[2189]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2191]! } + public var GroupInfo_Sound: String { return self._s[2192]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2193]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2194]! } + public var Contacts_Title: String { return self._s[2195]! } + public var Passport_Language_fr: String { return self._s[2196]! } + public var Notifications_ResetAllNotifications: String { return self._s[2197]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2200]! } + public var Checkout_NewCard_Title: String { return self._s[2201]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2202]! } + public var Conversation_ForwardChats: String { return self._s[2203]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2205]! } + public var Settings_FAQ: String { return self._s[2207]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2208]! } + public var Conversation_ContextMenuForward: String { return self._s[2209]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2212]! } + public var PrivacyPolicy_Title: String { return self._s[2215]! } + public var Notifications_TextTone: String { return self._s[2216]! } + public var Profile_CreateNewContact: String { return self._s[2217]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2218]! } + public var Call_Speaker: String { return self._s[2220]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2221]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2223]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2224]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_0]) + return formatWithArgumentRanges(self._s[2225]!, self._r[2225]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2223]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2224]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2225]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2226]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2227]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2228]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2229]! } - public var Bot_Unblock: String { return self._s[2230]! } - public var TextFormat_Italic: String { return self._s[2231]! } - public var WallpaperSearch_ColorPink: String { return self._s[2232]! } - public var Settings_About_Help: String { return self._s[2233]! } - public var SearchImages_Title: String { return self._s[2234]! } - public var Weekday_Wednesday: String { return self._s[2235]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2236]! } - public var ExplicitContent_AlertTitle: String { return self._s[2237]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2226]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2227]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2228]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2229]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2230]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2231]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2232]! } + public var Bot_Unblock: String { return self._s[2233]! } + public var TextFormat_Italic: String { return self._s[2234]! } + public var WallpaperSearch_ColorPink: String { return self._s[2235]! } + public var Settings_About_Help: String { return self._s[2236]! } + public var SearchImages_Title: String { return self._s[2237]! } + public var Weekday_Wednesday: String { return self._s[2238]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2239]! } + public var ExplicitContent_AlertTitle: String { return self._s[2240]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2238]!, self._r[2238]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2241]!, self._r[2241]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2239]! } - public var Weekday_Thursday: String { return self._s[2240]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2241]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2242]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2242]! } + public var Weekday_Thursday: String { return self._s[2243]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2244]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2245]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2243]!, self._r[2243]!, [_0]) + return formatWithArgumentRanges(self._s[2246]!, self._r[2246]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2244]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2245]! } - public var Passport_RequestedInformation: String { return self._s[2246]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2247]! } - public var Conversation_EncryptionProcessing: String { return self._s[2249]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2250]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2252]! } - public var Channel_Setup_Title: String { return self._s[2253]! } - public var Conversation_SearchPlaceholder: String { return self._s[2254]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2255]! } - public var Checkout_ErrorGeneric: String { return self._s[2256]! } - public var Passport_Language_hu: String { return self._s[2257]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2247]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2248]! } + public var Passport_RequestedInformation: String { return self._s[2249]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2250]! } + public var Conversation_EncryptionProcessing: String { return self._s[2252]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2253]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2255]! } + public var Channel_Setup_Title: String { return self._s[2256]! } + public var Conversation_SearchPlaceholder: String { return self._s[2257]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2258]! } + public var Checkout_ErrorGeneric: String { return self._s[2259]! } + public var Passport_Language_hu: String { return self._s[2260]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_0]) + return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_1]) + return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2263]!, self._r[2263]!, [_0]) + return formatWithArgumentRanges(self._s[2266]!, self._r[2266]!, [_0]) } - public var Group_Location_Info: String { return self._s[2264]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2265]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2266]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2267]! } + public var Group_Location_Info: String { return self._s[2267]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2268]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2269]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2270]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_0]) + return formatWithArgumentRanges(self._s[2271]!, self._r[2271]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2269]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2270]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2271]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2272]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2273]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2274]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_0]) + return formatWithArgumentRanges(self._s[2275]!, self._r[2275]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2273]! } - public var Message_PinnedAnimationMessage: String { return self._s[2275]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2277]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2278]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2280]! } - public var Embed_PlayingInPIP: String { return self._s[2281]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2282]! } + public var Passport_Language_cs: String { return self._s[2276]! } + public var Message_PinnedAnimationMessage: String { return self._s[2278]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2280]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2281]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2283]! } + public var Embed_PlayingInPIP: String { return self._s[2284]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2285]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2283]!, self._r[2283]!, [_0]) + return formatWithArgumentRanges(self._s[2286]!, self._r[2286]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2284]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2287]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2285]!, self._r[2285]!, [_1]) + return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2286]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2287]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2288]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2289]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2290]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2291]! } + public var Notification_PaymentSent: String { return self._s[2289]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2290]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2291]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2292]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2293]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2294]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2294]!, self._r[2294]!, [_1]) + return formatWithArgumentRanges(self._s[2297]!, self._r[2297]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2295]!, self._r[2295]!, [_1]) + return formatWithArgumentRanges(self._s[2298]!, self._r[2298]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2296]!, self._r[2296]!, [_1]) + return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2298]! } - public var PasscodeSettings_HelpTop: String { return self._s[2299]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2300]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2301]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2302]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2303]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2304]! } - public var Call_Accept: String { return self._s[2306]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2307]! } - public var Month_GenMarch: String { return self._s[2309]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2310]! } - public var LoginPassword_Title: String { return self._s[2311]! } - public var Call_End: String { return self._s[2312]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2313]! } - public var VoiceOver_Chat_Contact: String { return self._s[2314]! } - public var CallSettings_Always: String { return self._s[2315]! } - public var CallFeedback_Success: String { return self._s[2316]! } - public var TwoStepAuth_SetupHint: String { return self._s[2317]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2301]! } + public var PasscodeSettings_HelpTop: String { return self._s[2302]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2303]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2304]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2305]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2306]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2307]! } + public var Call_Accept: String { return self._s[2309]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2310]! } + public var Month_GenMarch: String { return self._s[2312]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2313]! } + public var LoginPassword_Title: String { return self._s[2314]! } + public var Call_End: String { return self._s[2315]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2316]! } + public var VoiceOver_Chat_Contact: String { return self._s[2317]! } + public var CallSettings_Always: String { return self._s[2318]! } + public var CallFeedback_Success: String { return self._s[2319]! } + public var TwoStepAuth_SetupHint: String { return self._s[2320]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_1]) + return formatWithArgumentRanges(self._s[2321]!, self._r[2321]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2319]! } - public var Login_PhoneTitle: String { return self._s[2320]! } - public var Passport_FieldPhoneHelp: String { return self._s[2321]! } - public var Weekday_ShortSunday: String { return self._s[2322]! } - public var Passport_InfoFAQ_URL: String { return self._s[2323]! } - public var ContactInfo_Job: String { return self._s[2325]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2326]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2327]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2328]! } - public var Invite_ChannelsTooMuch: String { return self._s[2329]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2330]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2331]! } - public var CallFeedback_ReasonNoise: String { return self._s[2332]! } - public var Appearance_AppIconDefault: String { return self._s[2334]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2335]! } - public var MediaPicker_AddCaption: String { return self._s[2336]! } - public var CallSettings_TabIconDescription: String { return self._s[2337]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2322]! } + public var Login_PhoneTitle: String { return self._s[2323]! } + public var Passport_FieldPhoneHelp: String { return self._s[2324]! } + public var Weekday_ShortSunday: String { return self._s[2325]! } + public var Passport_InfoFAQ_URL: String { return self._s[2326]! } + public var ContactInfo_Job: String { return self._s[2328]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2329]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2330]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2331]! } + public var Invite_ChannelsTooMuch: String { return self._s[2332]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2333]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2334]! } + public var CallFeedback_ReasonNoise: String { return self._s[2335]! } + public var Appearance_AppIconDefault: String { return self._s[2337]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2338]! } + public var MediaPicker_AddCaption: String { return self._s[2339]! } + public var CallSettings_TabIconDescription: String { return self._s[2340]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2338]!, self._r[2338]!, [_0]) + return formatWithArgumentRanges(self._s[2341]!, self._r[2341]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2339]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2340]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2341]! } - public var DialogList_SearchSectionRecent: String { return self._s[2342]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2343]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2346]! } - public var LastSeen_WithinAWeek: String { return self._s[2347]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2348]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2350]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2351]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2342]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2343]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2344]! } + public var DialogList_SearchSectionRecent: String { return self._s[2345]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2346]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2349]! } + public var LastSeen_WithinAWeek: String { return self._s[2350]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2351]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2353]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2354]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2352]!, self._r[2352]!, [_0]) + return formatWithArgumentRanges(self._s[2355]!, self._r[2355]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2353]! } - public var Conversation_StatusLeftGroup: String { return self._s[2354]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2355]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2357]! } - public var GroupPermission_AddSuccess: String { return self._s[2358]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2360]! } - public var Conversation_ContextMenuCopy: String { return self._s[2361]! } - public var AccessDenied_CallMicrophone: String { return self._s[2362]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2356]! } + public var Conversation_StatusLeftGroup: String { return self._s[2357]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2358]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2360]! } + public var GroupPermission_AddSuccess: String { return self._s[2361]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2363]! } + public var Conversation_ContextMenuCopy: String { return self._s[2364]! } + public var AccessDenied_CallMicrophone: String { return self._s[2365]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2366]!, self._r[2366]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2364]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2365]! } - public var Checkout_PaymentMethod_New: String { return self._s[2366]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2367]! } - public var PhotoEditor_QualityTool: String { return self._s[2368]! } - public var Login_SendCodeViaSms: String { return self._s[2369]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2370]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2371]! } - public var Login_EmailNotConfiguredError: String { return self._s[2372]! } - public var SocksProxySetup_Status: String { return self._s[2373]! } - public var PrivacyPolicy_Accept: String { return self._s[2374]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2375]! } - public var Appearance_AppIconClassicX: String { return self._s[2376]! } + public var Login_InvalidFirstNameError: String { return self._s[2367]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2368]! } + public var Checkout_PaymentMethod_New: String { return self._s[2369]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2370]! } + public var PhotoEditor_QualityTool: String { return self._s[2371]! } + public var Login_SendCodeViaSms: String { return self._s[2372]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2373]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2374]! } + public var Login_EmailNotConfiguredError: String { return self._s[2375]! } + public var SocksProxySetup_Status: String { return self._s[2376]! } + public var PrivacyPolicy_Accept: String { return self._s[2377]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2378]! } + public var Appearance_AppIconClassicX: String { return self._s[2379]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2377]!, self._r[2377]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2380]!, self._r[2380]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2378]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2379]! } - public var AutoNightTheme_Automatic: String { return self._s[2380]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2381]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2382]! } - public var Cache_Help: String { return self._s[2383]! } - public var Group_ErrorAccessDenied: String { return self._s[2384]! } - public var Passport_Language_fa: String { return self._s[2385]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2386]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2387]! } - public var PrivacySettings_LastSeen: String { return self._s[2388]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2381]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2382]! } + public var AutoNightTheme_Automatic: String { return self._s[2383]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2384]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2385]! } + public var Cache_Help: String { return self._s[2386]! } + public var Group_ErrorAccessDenied: String { return self._s[2387]! } + public var Passport_Language_fa: String { return self._s[2388]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2389]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2390]! } + public var PrivacySettings_LastSeen: String { return self._s[2391]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2389]!, self._r[2389]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2392]!, self._r[2392]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2393]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2394]! } - public var Profile_About: String { return self._s[2395]! } - public var Channel_About_Placeholder: String { return self._s[2396]! } - public var Login_InfoTitle: String { return self._s[2397]! } + public var Preview_SaveGif: String { return self._s[2396]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2397]! } + public var Profile_About: String { return self._s[2398]! } + public var Channel_About_Placeholder: String { return self._s[2399]! } + public var Login_InfoTitle: String { return self._s[2400]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2398]!, self._r[2398]!, [_0]) - } - public var Watch_Suggestion_CantTalk: String { return self._s[2400]! } - public var ContactInfo_Title: String { return self._s[2401]! } - public var Media_ShareThisVideo: String { return self._s[2402]! } - public var Weekday_ShortFriday: String { return self._s[2403]! } - public var AccessDenied_Contacts: String { return self._s[2405]! } - public var Notification_CallIncomingShort: String { return self._s[2406]! } - public var Group_Setup_TypePublic: String { return self._s[2407]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2408]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2409]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2412]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2413]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2414]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2415]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2416]! } - public var DialogList_Typing: String { return self._s[2417]! } - public var CallFeedback_IncludeLogs: String { return self._s[2419]! } - public var Checkout_Phone: String { return self._s[2421]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2424]! } - public var Privacy_Calls_Integration: String { return self._s[2425]! } - public var Notifications_PermissionsAllow: String { return self._s[2426]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2430]! } - public var Settings_ChatSettings: String { return self._s[2431]! } - public func PUSH_MESSAGE_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2432]!, self._r[2432]!, [_1]) + return formatWithArgumentRanges(self._s[2401]!, self._r[2401]!, [_0]) } + public var Watch_Suggestion_CantTalk: String { return self._s[2403]! } + public var ContactInfo_Title: String { return self._s[2404]! } + public var Media_ShareThisVideo: String { return self._s[2405]! } + public var Weekday_ShortFriday: String { return self._s[2406]! } + public var AccessDenied_Contacts: String { return self._s[2408]! } + public var Notification_CallIncomingShort: String { return self._s[2409]! } + public var Group_Setup_TypePublic: String { return self._s[2410]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2411]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2412]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2415]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2416]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2417]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2418]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2419]! } + public var DialogList_Typing: String { return self._s[2420]! } + public var CallFeedback_IncludeLogs: String { return self._s[2422]! } + public var Checkout_Phone: String { return self._s[2424]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2427]! } + public var Privacy_Calls_Integration: String { return self._s[2428]! } + public var Notifications_PermissionsAllow: String { return self._s[2429]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2433]! } + public var Settings_ChatSettings: String { return self._s[2434]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2435]!, self._r[2435]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2435]! } + public var GroupRemoved_DeleteUser: String { return self._s[2437]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_0]) + return formatWithArgumentRanges(self._s[2438]!, self._r[2438]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2437]!, self._r[2437]!, [_1]) + return formatWithArgumentRanges(self._s[2439]!, self._r[2439]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2438]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2439]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2441]! } - public var Conversation_Unblock: String { return self._s[2442]! } - public var PrivacySettings_DataSettings: String { return self._s[2443]! } - public var Group_PublicLink_Info: String { return self._s[2444]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2445]! } + public var Login_ContinueWithLocalization: String { return self._s[2440]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2441]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2443]! } + public var Conversation_Unblock: String { return self._s[2444]! } + public var PrivacySettings_DataSettings: String { return self._s[2445]! } + public var Group_PublicLink_Info: String { return self._s[2446]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2447]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2446]!, self._r[2446]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2448]!, self._r[2448]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2449]! } - public var Call_Mute: String { return self._s[2450]! } - public var Passport_Language_dz: String { return self._s[2451]! } - public var Passport_Language_tk: String { return self._s[2452]! } + public var PrivacySettings_Passcode: String { return self._s[2451]! } + public var Call_Mute: String { return self._s[2452]! } + public var Passport_Language_dz: String { return self._s[2453]! } + public var Passport_Language_tk: String { return self._s[2454]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_0]) + return formatWithArgumentRanges(self._s[2455]!, self._r[2455]!, [_0]) } - public var Settings_Search: String { return self._s[2454]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2455]! } - public var Conversation_ContextMenuReply: String { return self._s[2456]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2457]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2458]! } - public var Tour_Title1: String { return self._s[2459]! } - public var Conversation_ClearGroupHistory: String { return self._s[2461]! } - public var WallpaperPreview_Motion: String { return self._s[2462]! } + public var Settings_Search: String { return self._s[2456]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2457]! } + public var Conversation_ContextMenuReply: String { return self._s[2458]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2459]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2460]! } + public var Tour_Title1: String { return self._s[2461]! } + public var Conversation_ClearGroupHistory: String { return self._s[2463]! } + public var WallpaperPreview_Motion: String { return self._s[2464]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) + return formatWithArgumentRanges(self._s[2465]!, self._r[2465]!, [_0]) } - public var Call_RateCall: String { return self._s[2464]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2465]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2466]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2467]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2469]! } + public var Call_RateCall: String { return self._s[2466]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2467]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2468]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2469]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2471]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2471]!, self._r[2471]!, [_0]) + return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_0]) } - public var Compose_Create: String { return self._s[2472]! } - public var Contacts_InviteToTelegram: String { return self._s[2473]! } - public var GroupInfo_Notifications: String { return self._s[2474]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2476]! } - public var Month_GenApril: String { return self._s[2477]! } - public var Appearance_AutoNightTheme: String { return self._s[2478]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2480]! } - public var Login_CodeSentSms: String { return self._s[2482]! } + public var Compose_Create: String { return self._s[2474]! } + public var Contacts_InviteToTelegram: String { return self._s[2475]! } + public var GroupInfo_Notifications: String { return self._s[2476]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2478]! } + public var Month_GenApril: String { return self._s[2479]! } + public var Appearance_AutoNightTheme: String { return self._s[2480]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2482]! } + public var Login_CodeSentSms: String { return self._s[2484]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2483]!, self._r[2483]!, [_0]) + return formatWithArgumentRanges(self._s[2485]!, self._r[2485]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2484]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2485]! } - public var Passport_Language_hr: String { return self._s[2486]! } - public var Common_ActionNotAllowedError: String { return self._s[2487]! } + public var EmptyGroupInfo_Line3: String { return self._s[2486]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2487]! } + public var Passport_Language_hr: String { return self._s[2488]! } + public var Common_ActionNotAllowedError: String { return self._s[2489]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) + return formatWithArgumentRanges(self._s[2490]!, self._r[2490]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2489]! } - public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2490]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2491]! } - public var Privacy_SecretChatsTitle: String { return self._s[2492]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2494]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2495]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2496]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2497]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2498]! } - public var Preview_DeleteGif: String { return self._s[2499]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2500]! } - public var Group_ErrorNotMutualContact: String { return self._s[2501]! } - public var Notification_MessageLifetime5s: String { return self._s[2502]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2491]! } + public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2492]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2493]! } + public var Privacy_SecretChatsTitle: String { return self._s[2494]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2496]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2497]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2498]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2499]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2500]! } + public var Preview_DeleteGif: String { return self._s[2501]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2502]! } + public var Group_ErrorNotMutualContact: String { return self._s[2503]! } + public var Notification_MessageLifetime5s: String { return self._s[2504]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2503]!, self._r[2503]!, [_0]) + return formatWithArgumentRanges(self._s[2505]!, self._r[2505]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2504]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2506]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2507]! } - public var Passport_Address_AddBankStatement: String { return self._s[2508]! } - public var Notification_CallIncoming: String { return self._s[2509]! } - public var Compose_NewGroupTitle: String { return self._s[2510]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2512]! } - public var Passport_Address_Postcode: String { return self._s[2514]! } + public var VoiceOver_Chat_Video: String { return self._s[2506]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2508]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2509]! } + public var Passport_Address_AddBankStatement: String { return self._s[2510]! } + public var Notification_CallIncoming: String { return self._s[2511]! } + public var Compose_NewGroupTitle: String { return self._s[2512]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2514]! } + public var Passport_Address_Postcode: String { return self._s[2516]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2515]!, self._r[2515]!, [_0]) + return formatWithArgumentRanges(self._s[2517]!, self._r[2517]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2516]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2517]! } - public var WallpaperColors_Title: String { return self._s[2518]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2519]! } - public var VoiceOver_MessageContextForward: String { return self._s[2520]! } - public var GroupPermission_Duration: String { return self._s[2521]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2518]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2519]! } + public var WallpaperColors_Title: String { return self._s[2520]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2521]! } + public var VoiceOver_MessageContextForward: String { return self._s[2522]! } + public var GroupPermission_Duration: String { return self._s[2523]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2522]!, self._r[2522]!, [_0]) + return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2523]! } - public var Username_Placeholder: String { return self._s[2524]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2525]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2526]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2527]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2525]! } + public var Username_Placeholder: String { return self._s[2526]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2527]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2528]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2529]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2529]!, self._r[2529]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2531]!, self._r[2531]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2530]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2531]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2532]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2533]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2534]! } - public var Conversation_ContextMenuMore: String { return self._s[2535]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2536]! } - public var CallSettings_TabIcon: String { return self._s[2537]! } - public var KeyCommand_Find: String { return self._s[2538]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2539]! } - public var Message_PinnedGame: String { return self._s[2540]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2541]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2543]! } - public var Login_CallRequestState2: String { return self._s[2545]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2547]! } + public var Passport_PasswordDescription: String { return self._s[2532]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2533]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2534]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2535]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2536]! } + public var Conversation_ContextMenuMore: String { return self._s[2537]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2538]! } + public var CallSettings_TabIcon: String { return self._s[2539]! } + public var KeyCommand_Find: String { return self._s[2540]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2541]! } + public var Message_PinnedGame: String { return self._s[2542]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2543]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2545]! } + public var Login_CallRequestState2: String { return self._s[2547]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2549]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2548]!, self._r[2548]!, [_0]) - } - public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2550]!, self._r[2550]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2551]! } - public var Conversation_InstantPagePreview: String { return self._s[2552]! } + public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2552]!, self._r[2552]!, [_0]) + } + public var WallpaperPreview_Blurred: String { return self._s[2553]! } + public var Conversation_InstantPagePreview: String { return self._s[2554]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) + return formatWithArgumentRanges(self._s[2555]!, self._r[2555]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2556]! } - public var WallpaperSearch_ColorRed: String { return self._s[2557]! } - public var GroupPermission_NoPinMessages: String { return self._s[2558]! } - public var Passport_Language_es: String { return self._s[2559]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2561]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2562]! } + public var SecretTimer_VideoDescription: String { return self._s[2558]! } + public var WallpaperSearch_ColorRed: String { return self._s[2559]! } + public var GroupPermission_NoPinMessages: String { return self._s[2560]! } + public var Passport_Language_es: String { return self._s[2561]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2563]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2564]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2563]!, self._r[2563]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2565]!, self._r[2565]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2564]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2565]! } - public var Watch_UserInfo_Unmute: String { return self._s[2566]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2567]! } - public var AccessDenied_CameraRestricted: String { return self._s[2569]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2566]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2567]! } + public var Watch_UserInfo_Unmute: String { return self._s[2568]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2569]! } + public var AccessDenied_CameraRestricted: String { return self._s[2571]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2570]!, self._r[2570]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2572]!, self._r[2572]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2572]! } - public var Settings_CopyUsername: String { return self._s[2573]! } - public var Contacts_SearchLabel: String { return self._s[2574]! } - public var Map_OpenInYandexNavigator: String { return self._s[2576]! } - public var PasscodeSettings_EncryptData: String { return self._s[2577]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2578]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2579]! } - public var DialogList_AdNoticeAlert: String { return self._s[2580]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2582]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2583]! } - public var Localization_LanguageCustom: String { return self._s[2584]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2585]! } - public var CallFeedback_Title: String { return self._s[2586]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2589]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2590]! } - public var Conversation_InfoGroup: String { return self._s[2591]! } - public var Compose_NewMessage: String { return self._s[2592]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2593]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2594]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2595]! } + public var ChatList_ReadAll: String { return self._s[2574]! } + public var Settings_CopyUsername: String { return self._s[2575]! } + public var Contacts_SearchLabel: String { return self._s[2576]! } + public var Map_OpenInYandexNavigator: String { return self._s[2578]! } + public var PasscodeSettings_EncryptData: String { return self._s[2579]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2580]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2581]! } + public var DialogList_AdNoticeAlert: String { return self._s[2582]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2584]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2585]! } + public var Localization_LanguageCustom: String { return self._s[2586]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2587]! } + public var CallFeedback_Title: String { return self._s[2588]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2591]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2592]! } + public var Conversation_InfoGroup: String { return self._s[2593]! } + public var Compose_NewMessage: String { return self._s[2594]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2595]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2596]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2597]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2596]!, self._r[2596]!, [_0]) + return formatWithArgumentRanges(self._s[2598]!, self._r[2598]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2597]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2598]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2599]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2600]! } - public var Channel_BlackList_Title: String { return self._s[2601]! } - public var UserInfo_PhoneCall: String { return self._s[2602]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2604]! } - public var State_connecting: String { return self._s[2605]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2606]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2599]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2600]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2601]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2602]! } + public var Channel_BlackList_Title: String { return self._s[2603]! } + public var UserInfo_PhoneCall: String { return self._s[2604]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2606]! } + public var State_connecting: String { return self._s[2607]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2608]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2607]!, self._r[2607]!, [_0]) + return formatWithArgumentRanges(self._s[2609]!, self._r[2609]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2608]! } - public var Passport_Identity_EditPassport: String { return self._s[2609]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2611]! } - public var Localization_EnglishLanguageName: String { return self._s[2612]! } - public var Share_AuthDescription: String { return self._s[2613]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2614]! } - public var Passport_Identity_Surname: String { return self._s[2615]! } - public var Compose_TokenListPlaceholder: String { return self._s[2616]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2617]! } - public var Settings_AboutEmpty: String { return self._s[2618]! } - public var Conversation_Unmute: String { return self._s[2619]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2621]! } + public var Notifications_GroupNotifications: String { return self._s[2610]! } + public var Passport_Identity_EditPassport: String { return self._s[2611]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2613]! } + public var Localization_EnglishLanguageName: String { return self._s[2614]! } + public var Share_AuthDescription: String { return self._s[2615]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2616]! } + public var Passport_Identity_Surname: String { return self._s[2617]! } + public var Compose_TokenListPlaceholder: String { return self._s[2618]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2619]! } + public var Settings_AboutEmpty: String { return self._s[2620]! } + public var Conversation_Unmute: String { return self._s[2621]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2623]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2622]!, self._r[2622]!, [_1]) + return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2623]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2625]! } - public var ChatSettings_Appearance: String { return self._s[2626]! } - public var Appearance_PickAccentColor: String { return self._s[2627]! } + public var Login_CodeSentCall: String { return self._s[2625]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2627]! } + public var ChatSettings_Appearance: String { return self._s[2628]! } + public var Appearance_PickAccentColor: String { return self._s[2629]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2628]!, self._r[2628]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2630]!, self._r[2630]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_1]) + return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2630]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2631]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2632]! } - public var ChatAdmins_AdminLabel: String { return self._s[2634]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2635]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2637]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2638]! } - public var Month_GenJune: String { return self._s[2639]! } - public var Watch_Location_Current: String { return self._s[2640]! } - public var Conversation_TitleMute: String { return self._s[2641]! } + public var Notification_CallMissed: String { return self._s[2632]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2633]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2634]! } + public var ChatAdmins_AdminLabel: String { return self._s[2636]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2637]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2639]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2640]! } + public var Month_GenJune: String { return self._s[2641]! } + public var Watch_Location_Current: String { return self._s[2642]! } + public var Conversation_TitleMute: String { return self._s[2643]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_1]) + return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2643]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2645]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_0]) + return formatWithArgumentRanges(self._s[2646]!, self._r[2646]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2645]! } - public var Chat_SlowmodeSendError: String { return self._s[2646]! } - public var MaskStickerSettings_Info: String { return self._s[2647]! } + public var Call_ReportPlaceholder: String { return self._s[2647]! } + public var Chat_SlowmodeSendError: String { return self._s[2648]! } + public var MaskStickerSettings_Info: String { return self._s[2649]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_0]) + return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2649]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2651]! } - public var Contacts_ShareTelegram: String { return self._s[2652]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2653]! } - public var Channel_ErrorAccessDenied: String { return self._s[2654]! } - public var UserInfo_ScamBotWarning: String { return self._s[2656]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2657]! } - public var Call_ConnectionErrorTitle: String { return self._s[2658]! } - public var UserInfo_NotificationsEnable: String { return self._s[2659]! } - public var ArchivedChats_IntroText1: String { return self._s[2660]! } - public var Tour_Text4: String { return self._s[2663]! } - public var WallpaperSearch_Recent: String { return self._s[2664]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2665]! } - public var Profile_MessageLifetime2s: String { return self._s[2667]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2668]! } - public var Notification_MessageLifetime2s: String { return self._s[2669]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2651]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2653]! } + public var Contacts_ShareTelegram: String { return self._s[2654]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2655]! } + public var Channel_ErrorAccessDenied: String { return self._s[2656]! } + public var UserInfo_ScamBotWarning: String { return self._s[2658]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2659]! } + public var Call_ConnectionErrorTitle: String { return self._s[2660]! } + public var UserInfo_NotificationsEnable: String { return self._s[2661]! } + public var ArchivedChats_IntroText1: String { return self._s[2662]! } + public var Tour_Text4: String { return self._s[2665]! } + public var WallpaperSearch_Recent: String { return self._s[2666]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2667]! } + public var Profile_MessageLifetime2s: String { return self._s[2669]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2670]! } + public var Notification_MessageLifetime2s: String { return self._s[2671]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2670]!, self._r[2670]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2672]!, self._r[2672]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2671]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2672]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2673]! } + public var Cache_ClearCache: String { return self._s[2673]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2674]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2675]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) - } - public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2679]!, self._r[2679]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2680]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2681]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2682]! } - public var ChatList_UnarchiveAction: String { return self._s[2683]! } - public var AutoNightTheme_Title: String { return self._s[2684]! } - public var InstantPage_FeedbackButton: String { return self._s[2685]! } - public var Passport_FieldAddress: String { return self._s[2686]! } - public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_1, _2]) + public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2681]!, self._r[2681]!, [_0]) } - public var Month_ShortMarch: String { return self._s[2688]! } - public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + public var LocalGroup_Text: String { return self._s[2682]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2683]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2684]! } + public var ChatList_UnarchiveAction: String { return self._s[2685]! } + public var AutoNightTheme_Title: String { return self._s[2686]! } + public var InstantPage_FeedbackButton: String { return self._s[2687]! } + public var Passport_FieldAddress: String { return self._s[2688]! } + public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2690]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2691]! } - public var Passport_FloodError: String { return self._s[2692]! } - public var SecretGif_Title: String { return self._s[2693]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2694]! } - public var Passport_Language_th: String { return self._s[2696]! } - public var Passport_Address_Address: String { return self._s[2697]! } - public var Login_InvalidLastNameError: String { return self._s[2698]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2699]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2700]! } - public var SettingsSearch_FAQ: String { return self._s[2701]! } - public var ShareMenu_Send: String { return self._s[2702]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2704]! } - public var Month_GenNovember: String { return self._s[2706]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2708]! } + public var Month_ShortMarch: String { return self._s[2690]! } + public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2691]!, self._r[2691]!, [_1, _2]) + } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2692]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2693]! } + public var Passport_FloodError: String { return self._s[2694]! } + public var SecretGif_Title: String { return self._s[2695]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2696]! } + public var Passport_Language_th: String { return self._s[2698]! } + public var Passport_Address_Address: String { return self._s[2699]! } + public var Login_InvalidLastNameError: String { return self._s[2700]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2701]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2702]! } + public var SettingsSearch_FAQ: String { return self._s[2703]! } + public var ShareMenu_Send: String { return self._s[2704]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2706]! } + public var Month_GenNovember: String { return self._s[2708]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2710]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2709]!, self._r[2709]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2711]!, self._r[2711]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2710]! } - public var NotificationsSound_Tritone: String { return self._s[2711]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2713]! } + public var Checkout_Email: String { return self._s[2712]! } + public var NotificationsSound_Tritone: String { return self._s[2713]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2715]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2716]!, self._r[2716]!, [_1]) + return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2717]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2719]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2720]!, self._r[2720]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2719]! } - public var Notification_Exceptions_Add: String { return self._s[2720]! } - public var DialogList_You: String { return self._s[2721]! } - public var MediaPicker_Send: String { return self._s[2724]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2725]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2726]! } - public var Call_AudioRouteSpeaker: String { return self._s[2727]! } - public var Watch_UserInfo_Title: String { return self._s[2728]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2729]! } - public var Appearance_AccentColor: String { return self._s[2730]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2721]! } + public var Notification_Exceptions_Add: String { return self._s[2722]! } + public var DialogList_You: String { return self._s[2723]! } + public var MediaPicker_Send: String { return self._s[2726]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2727]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2728]! } + public var Call_AudioRouteSpeaker: String { return self._s[2729]! } + public var Watch_UserInfo_Title: String { return self._s[2730]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2731]! } + public var Appearance_AccentColor: String { return self._s[2732]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2731]!, self._r[2731]!, [_0]) + return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2732]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2734]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2735]!, self._r[2735]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2734]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2735]! } - public var Notification_CallOutgoing: String { return self._s[2736]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2737]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2738]! } - public var Call_RecordingDisabledMessage: String { return self._s[2739]! } - public var Message_Game: String { return self._s[2740]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2741]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2742]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2743]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2744]! } - public var Date_DialogDateFormat: String { return self._s[2745]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2746]! } - public var Notifications_InAppNotifications: String { return self._s[2747]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2736]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2737]! } + public var Notification_CallOutgoing: String { return self._s[2738]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2739]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2740]! } + public var Call_RecordingDisabledMessage: String { return self._s[2741]! } + public var Message_Game: String { return self._s[2742]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2743]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2744]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2745]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2746]! } + public var Date_DialogDateFormat: String { return self._s[2747]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2748]! } + public var Notifications_InAppNotifications: String { return self._s[2749]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2748]!, self._r[2748]!, [_0]) + return formatWithArgumentRanges(self._s[2750]!, self._r[2750]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2749]!, self._r[2749]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2750]! } + public var NewContact_Title: String { return self._s[2752]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_0]) + return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2752]! } + public var Conversation_ViewContactDetails: String { return self._s[2754]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_1]) + return formatWithArgumentRanges(self._s[2756]!, self._r[2756]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2755]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2756]! } - public var PrivacySettings_Title: String { return self._s[2757]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2760]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2761]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2762]! } - public var Contacts_PhoneNumber: String { return self._s[2763]! } - public var Map_ShowPlaces: String { return self._s[2765]! } - public var ChatAdmins_Title: String { return self._s[2766]! } - public var InstantPage_Reference: String { return self._s[2768]! } - public var ReportGroupLocation_Text: String { return self._s[2769]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2757]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2758]! } + public var PrivacySettings_Title: String { return self._s[2759]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2762]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2763]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2764]! } + public var Contacts_PhoneNumber: String { return self._s[2765]! } + public var Map_ShowPlaces: String { return self._s[2767]! } + public var ChatAdmins_Title: String { return self._s[2768]! } + public var InstantPage_Reference: String { return self._s[2770]! } + public var ReportGroupLocation_Text: String { return self._s[2771]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2770]!, self._r[2770]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2772]!, self._r[2772]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2771]! } - public var Watch_UserInfo_Block: String { return self._s[2772]! } - public var ChatSettings_Stickers: String { return self._s[2773]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2774]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2775]! } + public var Camera_FlashOff: String { return self._s[2773]! } + public var Watch_UserInfo_Block: String { return self._s[2774]! } + public var ChatSettings_Stickers: String { return self._s[2775]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2776]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2777]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2776]!, self._r[2776]!, [_0]) + return formatWithArgumentRanges(self._s[2778]!, self._r[2778]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2777]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2778]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2779]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2780]! } - public var VoiceOver_MessageContextShare: String { return self._s[2781]! } + public var Settings_ViewPhoto: String { return self._s[2779]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2780]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2781]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2782]! } + public var VoiceOver_MessageContextShare: String { return self._s[2783]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2783]!, self._r[2783]!, [_0]) + return formatWithArgumentRanges(self._s[2785]!, self._r[2785]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2784]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2785]! } + public var Privacy_DeleteDrafts: String { return self._s[2786]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2787]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_0]) + return formatWithArgumentRanges(self._s[2788]!, self._r[2788]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2787]! } - public var DialogList_SavedMessages: String { return self._s[2788]! } - public var GroupInfo_UpgradeButton: String { return self._s[2789]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2791]! } - public var DialogList_Pin: String { return self._s[2792]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2789]! } + public var DialogList_SavedMessages: String { return self._s[2790]! } + public var GroupInfo_UpgradeButton: String { return self._s[2791]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2793]! } + public var DialogList_Pin: String { return self._s[2794]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2795]!, self._r[2795]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) + return formatWithArgumentRanges(self._s[2796]!, self._r[2796]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2795]! } - public var UserInfo_NotificationsDisable: String { return self._s[2796]! } - public var Paint_Outlined: String { return self._s[2797]! } - public var Activity_PlayingGame: String { return self._s[2798]! } - public var SearchImages_NoImagesFound: String { return self._s[2799]! } - public var SocksProxySetup_ProxyType: String { return self._s[2800]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2802]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2803]! } - public var Settings_AppLanguage: String { return self._s[2804]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2805]! } - public var Common_ChoosePhoto: String { return self._s[2806]! } - public var CallFeedback_ReasonEcho: String { return self._s[2807]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2797]! } + public var UserInfo_NotificationsDisable: String { return self._s[2798]! } + public var Paint_Outlined: String { return self._s[2799]! } + public var Activity_PlayingGame: String { return self._s[2800]! } + public var SearchImages_NoImagesFound: String { return self._s[2801]! } + public var SocksProxySetup_ProxyType: String { return self._s[2802]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2804]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2805]! } + public var Settings_AppLanguage: String { return self._s[2806]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2807]! } + public var Common_ChoosePhoto: String { return self._s[2808]! } + public var CallFeedback_ReasonEcho: String { return self._s[2809]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_1]) + return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2809]! } - public var Activity_UploadingVideo: String { return self._s[2810]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2811]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2812]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2813]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2814]! } - public var Checkout_PayWithTouchId: String { return self._s[2815]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2816]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2811]! } + public var Activity_UploadingVideo: String { return self._s[2812]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2813]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2814]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2815]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2816]! } + public var Checkout_PayWithTouchId: String { return self._s[2817]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2818]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2818]!, self._r[2818]!, [_1]) + return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2819]! } + public var Notifications_ExceptionsNone: String { return self._s[2821]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_0]) + return formatWithArgumentRanges(self._s[2822]!, self._r[2822]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2821]!, self._r[2821]!, [_1]) + return formatWithArgumentRanges(self._s[2823]!, self._r[2823]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2823]! } - public var Passport_Address_Region: String { return self._s[2826]! } - public var ChatList_DeleteChat: String { return self._s[2827]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2828]! } - public var PhotoEditor_TiltShift: String { return self._s[2829]! } - public var Settings_FAQ_URL: String { return self._s[2830]! } - public var Passport_Language_sl: String { return self._s[2831]! } - public var Settings_PrivacySettings: String { return self._s[2833]! } - public var SharedMedia_TitleLink: String { return self._s[2834]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2835]! } - public var Settings_SetProfilePhoto: String { return self._s[2836]! } - public var Channel_About_Help: String { return self._s[2837]! } - public var Contacts_PermissionsEnable: String { return self._s[2838]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2839]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2840]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2842]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2843]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2844]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2845]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2846]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2848]! } - public var Map_OpenInYandexMaps: String { return self._s[2850]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2851]! } - public var VoiceOver_MessageContextReply: String { return self._s[2852]! } - public var PhotoEditor_SaturationTool: String { return self._s[2853]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2825]! } + public var Passport_Address_Region: String { return self._s[2828]! } + public var ChatList_DeleteChat: String { return self._s[2829]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2830]! } + public var PhotoEditor_TiltShift: String { return self._s[2831]! } + public var Settings_FAQ_URL: String { return self._s[2832]! } + public var Passport_Language_sl: String { return self._s[2833]! } + public var Settings_PrivacySettings: String { return self._s[2835]! } + public var SharedMedia_TitleLink: String { return self._s[2836]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2837]! } + public var Settings_SetProfilePhoto: String { return self._s[2838]! } + public var Channel_About_Help: String { return self._s[2839]! } + public var Contacts_PermissionsEnable: String { return self._s[2840]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2841]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2842]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2844]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2845]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2846]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2847]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2848]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2850]! } + public var Map_OpenInYandexMaps: String { return self._s[2852]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2853]! } + public var VoiceOver_MessageContextReply: String { return self._s[2854]! } + public var PhotoEditor_SaturationTool: String { return self._s[2855]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2855]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2856]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2857]! } - public var Appearance_TextSize: String { return self._s[2858]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2857]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2858]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2859]! } + public var Appearance_TextSize: String { return self._s[2860]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2861]!, self._r[2861]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2860]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2862]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2862]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2864]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2863]!, self._r[2863]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2864]!, self._r[2864]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2866]!, self._r[2866]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2865]! } - public var Passport_PassportInformation: String { return self._s[2868]! } - public var WatchRemote_AlertTitle: String { return self._s[2869]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2870]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2872]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2867]! } + public var Passport_PassportInformation: String { return self._s[2870]! } + public var WatchRemote_AlertTitle: String { return self._s[2871]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2872]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2874]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2873]!, self._r[2873]!, [_0]) + return formatWithArgumentRanges(self._s[2875]!, self._r[2875]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2874]!, self._r[2874]!, [_1]) + return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2875]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2877]! } - public var AccessDenied_CameraDisabled: String { return self._s[2878]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2877]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2879]! } + public var AccessDenied_CameraDisabled: String { return self._s[2880]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) + return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2882]! } + public var PhotoEditor_ContrastTool: String { return self._s[2884]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_1]) + return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_1]) } - public var DialogList_Draft: String { return self._s[2884]! } - public var Privacy_TopPeersDelete: String { return self._s[2886]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2887]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2888]! } - public var WebSearch_RecentSectionClear: String { return self._s[2889]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2891]! } - public var Common_Done: String { return self._s[2893]! } - public var AuthSessions_EmptyText: String { return self._s[2894]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2895]! } - public var Tour_Title5: String { return self._s[2896]! } + public var DialogList_Draft: String { return self._s[2886]! } + public var Privacy_TopPeersDelete: String { return self._s[2888]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2889]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2890]! } + public var WebSearch_RecentSectionClear: String { return self._s[2891]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2893]! } + public var Common_Done: String { return self._s[2895]! } + public var AuthSessions_EmptyText: String { return self._s[2896]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2897]! } + public var Tour_Title5: String { return self._s[2898]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_0]) + return formatWithArgumentRanges(self._s[2899]!, self._r[2899]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2898]! } - public var Conversation_LinkDialogSave: String { return self._s[2899]! } - public var GroupInfo_ActionRestrict: String { return self._s[2900]! } - public var Checkout_Title: String { return self._s[2901]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2903]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2905]! } - public var Notification_RenamedGroup: String { return self._s[2906]! } - public var PeopleNearby_Groups: String { return self._s[2907]! } - public var Checkout_PayWithFaceId: String { return self._s[2908]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2909]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2911]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2912]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2913]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2900]! } + public var Conversation_LinkDialogSave: String { return self._s[2901]! } + public var GroupInfo_ActionRestrict: String { return self._s[2902]! } + public var Checkout_Title: String { return self._s[2903]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2905]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2907]! } + public var Notification_RenamedGroup: String { return self._s[2908]! } + public var PeopleNearby_Groups: String { return self._s[2909]! } + public var Checkout_PayWithFaceId: String { return self._s[2910]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2911]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2913]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2914]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2915]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_0]) + return formatWithArgumentRanges(self._s[2916]!, self._r[2916]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2916]! } + public var Profile_AddToExisting: String { return self._s[2918]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2917]!, self._r[2917]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2919]! } - public var Permissions_PrivacyPolicy: String { return self._s[2920]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2921]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2922]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2924]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2926]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2927]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2928]! } - public var VoiceOver_AttachMedia: String { return self._s[2930]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2931]! } + public var Cache_Files: String { return self._s[2921]! } + public var Permissions_PrivacyPolicy: String { return self._s[2922]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2923]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2924]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2926]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2928]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2929]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2930]! } + public var VoiceOver_AttachMedia: String { return self._s[2932]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2933]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2932]!, self._r[2932]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2934]!, self._r[2934]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2933]! } - public var Conversation_SetReminder_Title: String { return self._s[2934]! } - public var Passport_FieldAddressHelp: String { return self._s[2935]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2936]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2935]! } + public var Conversation_SetReminder_Title: String { return self._s[2936]! } + public var Passport_FieldAddressHelp: String { return self._s[2937]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2938]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2937]!, self._r[2937]!, [_0]) + return formatWithArgumentRanges(self._s[2939]!, self._r[2939]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2938]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2940]! } - public var Login_UnknownError: String { return self._s[2941]! } - public var Group_UpgradeNoticeText2: String { return self._s[2943]! } - public var Watch_Compose_AddContact: String { return self._s[2944]! } - public var Web_Error: String { return self._s[2945]! } - public var Gif_Search: String { return self._s[2946]! } - public var Profile_MessageLifetime1h: String { return self._s[2947]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2948]! } - public var Channel_Username_CheckingUsername: String { return self._s[2949]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2950]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2951]! } - public var Channel_AboutItem: String { return self._s[2952]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2954]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2955]! } - public var GroupInfo_SharedMedia: String { return self._s[2956]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2940]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2942]! } + public var Login_UnknownError: String { return self._s[2943]! } + public var Group_UpgradeNoticeText2: String { return self._s[2945]! } + public var Watch_Compose_AddContact: String { return self._s[2946]! } + public var Web_Error: String { return self._s[2947]! } + public var Gif_Search: String { return self._s[2948]! } + public var Profile_MessageLifetime1h: String { return self._s[2949]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2950]! } + public var Channel_Username_CheckingUsername: String { return self._s[2951]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2952]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2953]! } + public var Channel_AboutItem: String { return self._s[2954]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2956]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2957]! } + public var GroupInfo_SharedMedia: String { return self._s[2958]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_1]) - } - public var Call_PhoneCallInProgressMessage: String { return self._s[2958]! } - public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2960]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2961]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2962]! } - public var CreatePoll_AddOption: String { return self._s[2963]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2964]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2965]! } - public var Channel_Management_AddModerator: String { return self._s[2966]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2967]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2968]! } - public var NotificationsSound_Hello: String { return self._s[2969]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2970]! } - public var Channel_Stickers_Placeholder: String { return self._s[2972]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2960]! } + public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_1]) + } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2962]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2963]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2964]! } + public var CreatePoll_AddOption: String { return self._s[2965]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2966]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2967]! } + public var Channel_Management_AddModerator: String { return self._s[2968]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2969]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2970]! } + public var NotificationsSound_Hello: String { return self._s[2971]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2972]! } + public var Channel_Stickers_Placeholder: String { return self._s[2974]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2973]!, self._r[2973]!, [_0]) + return formatWithArgumentRanges(self._s[2975]!, self._r[2975]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2974]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2975]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2976]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2977]! } - public var AutoDownloadSettings_Channels: String { return self._s[2978]! } - public var Passport_Language_mn: String { return self._s[2979]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2982]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2983]! } - public var Passport_Language_ja: String { return self._s[2985]! } - public var Settings_About_Title: String { return self._s[2986]! } - public var Settings_NotificationsAndSounds: String { return self._s[2987]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2988]! } - public var Settings_BlockedUsers: String { return self._s[2989]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2976]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2977]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2978]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2979]! } + public var AutoDownloadSettings_Channels: String { return self._s[2980]! } + public var Passport_Language_mn: String { return self._s[2981]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2984]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2985]! } + public var Passport_Language_ja: String { return self._s[2987]! } + public var Settings_About_Title: String { return self._s[2988]! } + public var Settings_NotificationsAndSounds: String { return self._s[2989]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2990]! } + public var Settings_BlockedUsers: String { return self._s[2991]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_0]) + return formatWithArgumentRanges(self._s[2992]!, self._r[2992]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2991]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2992]! } - public var Channel_Username_Title: String { return self._s[2993]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2993]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2994]! } + public var Channel_Username_Title: String { return self._s[2995]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2994]!, self._r[2994]!, [_0]) + return formatWithArgumentRanges(self._s[2996]!, self._r[2996]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[2996]! } - public var AppleWatch_Title: String { return self._s[2997]! } - public var Activity_RecordingVideoMessage: String { return self._s[2998]! } + public var AttachmentMenu_File: String { return self._s[2998]! } + public var AppleWatch_Title: String { return self._s[2999]! } + public var Activity_RecordingVideoMessage: String { return self._s[3000]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3001]!, self._r[3001]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3000]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3001]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3002]! } - public var Common_Next: String { return self._s[3004]! } - public var Channel_Stickers_YourStickers: String { return self._s[3006]! } - public var Call_AudioRouteHeadphones: String { return self._s[3007]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3009]! } - public var Watch_Contacts_NoResults: String { return self._s[3011]! } - public var PhotoEditor_TintTool: String { return self._s[3014]! } - public var LoginPassword_ResetAccount: String { return self._s[3016]! } - public var Settings_SavedMessages: String { return self._s[3017]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3018]! } - public var Bot_GenericSupportStatus: String { return self._s[3019]! } - public var StickerPack_Add: String { return self._s[3020]! } - public var Checkout_TotalAmount: String { return self._s[3021]! } - public var Your_cards_number_is_invalid: String { return self._s[3022]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3023]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3024]! } + public var Weekday_Saturday: String { return self._s[3002]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3003]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3004]! } + public var Common_Next: String { return self._s[3006]! } + public var Channel_Stickers_YourStickers: String { return self._s[3008]! } + public var Call_AudioRouteHeadphones: String { return self._s[3009]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3011]! } + public var Watch_Contacts_NoResults: String { return self._s[3013]! } + public var PhotoEditor_TintTool: String { return self._s[3016]! } + public var LoginPassword_ResetAccount: String { return self._s[3018]! } + public var Settings_SavedMessages: String { return self._s[3019]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3020]! } + public var Bot_GenericSupportStatus: String { return self._s[3021]! } + public var StickerPack_Add: String { return self._s[3022]! } + public var Checkout_TotalAmount: String { return self._s[3023]! } + public var Your_cards_number_is_invalid: String { return self._s[3024]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3025]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3026]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3025]!, self._r[3025]!, [_0]) + return formatWithArgumentRanges(self._s[3027]!, self._r[3027]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3026]!, self._r[3026]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3028]!, self._r[3028]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3027]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3029]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3029]!, self._r[3029]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0]) + return formatWithArgumentRanges(self._s[3032]!, self._r[3032]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3031]! } - public var StickerPack_Share: String { return self._s[3032]! } - public var Passport_DeleteAddress: String { return self._s[3033]! } - public var Settings_Passport: String { return self._s[3034]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3035]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3036]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3037]! } - public var Contacts_PermissionsText: String { return self._s[3038]! } - public var Group_Setup_HistoryVisible: String { return self._s[3039]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3041]! } - public var SocksProxySetup_Title: String { return self._s[3042]! } - public var Notification_Mute1h: String { return self._s[3043]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3033]! } + public var StickerPack_Share: String { return self._s[3034]! } + public var Passport_DeleteAddress: String { return self._s[3035]! } + public var Settings_Passport: String { return self._s[3036]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3037]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3038]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3039]! } + public var Contacts_PermissionsText: String { return self._s[3040]! } + public var Group_Setup_HistoryVisible: String { return self._s[3041]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3043]! } + public var SocksProxySetup_Title: String { return self._s[3044]! } + public var Notification_Mute1h: String { return self._s[3045]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3044]!, self._r[3044]!, [_0]) + return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3045]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3047]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_1]) + return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3047]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3050]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3052]! } - public var DialogList_NoMessagesText: String { return self._s[3053]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3054]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3055]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3057]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3058]! } - public var Common_TakePhotoOrVideo: String { return self._s[3059]! } - public var Call_StatusBusy: String { return self._s[3060]! } - public var Conversation_PinnedMessage: String { return self._s[3061]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3062]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3063]! } - public var Undo_ChatCleared: String { return self._s[3064]! } - public var AppleWatch_ReplyPresets: String { return self._s[3065]! } - public var Passport_DiscardMessageDescription: String { return self._s[3067]! } - public var Login_NetworkError: String { return self._s[3068]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3049]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3052]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3054]! } + public var DialogList_NoMessagesText: String { return self._s[3055]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3056]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3057]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3059]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3060]! } + public var Common_TakePhotoOrVideo: String { return self._s[3061]! } + public var Call_StatusBusy: String { return self._s[3062]! } + public var Conversation_PinnedMessage: String { return self._s[3063]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3064]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3065]! } + public var Undo_ChatCleared: String { return self._s[3066]! } + public var AppleWatch_ReplyPresets: String { return self._s[3067]! } + public var Passport_DiscardMessageDescription: String { return self._s[3069]! } + public var Login_NetworkError: String { return self._s[3070]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3069]!, self._r[3069]!, [_0]) + return formatWithArgumentRanges(self._s[3071]!, self._r[3071]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3070]!, self._r[3070]!, [_0]) + return formatWithArgumentRanges(self._s[3072]!, self._r[3072]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3071]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3073]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3073]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3075]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) + return formatWithArgumentRanges(self._s[3077]!, self._r[3077]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3076]! } - public var VoiceOver_Chat_Music: String { return self._s[3077]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3078]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3080]! } - public var ConversationMedia_Title: String { return self._s[3081]! } - public var EncryptionKey_Title: String { return self._s[3083]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3084]! } - public var Notification_Exceptions_AddException: String { return self._s[3085]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3086]! } - public var Profile_MessageLifetime1m: String { return self._s[3087]! } + public var Call_ConnectionErrorMessage: String { return self._s[3078]! } + public var VoiceOver_Chat_Music: String { return self._s[3079]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3080]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3082]! } + public var ConversationMedia_Title: String { return self._s[3083]! } + public var EncryptionKey_Title: String { return self._s[3085]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3086]! } + public var Notification_Exceptions_AddException: String { return self._s[3087]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3088]! } + public var Profile_MessageLifetime1m: String { return self._s[3089]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_1]) + return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_1]) } - public var Month_GenMay: String { return self._s[3089]! } + public var Month_GenMay: String { return self._s[3091]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_0]) + return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3091]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3092]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3093]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3095]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3096]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3097]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3098]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3099]! } - public var Channel_JoinChannel: String { return self._s[3101]! } - public var Appearance_Animations: String { return self._s[3104]! } + public var PeopleNearby_Users: String { return self._s[3093]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3094]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3095]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3097]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3098]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3099]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3100]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3101]! } + public var Channel_JoinChannel: String { return self._s[3103]! } + public var Appearance_Animations: String { return self._s[3106]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3105]!, self._r[3105]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3107]!, self._r[3107]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3107]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3109]! } - public var Passport_Address_Street: String { return self._s[3110]! } - public var Conversation_AddContact: String { return self._s[3111]! } - public var Login_PhonePlaceholder: String { return self._s[3112]! } - public var Channel_Members_InviteLink: String { return self._s[3114]! } - public var Bot_Stop: String { return self._s[3115]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3117]! } - public var Notification_PassportValueAddress: String { return self._s[3118]! } - public var Month_ShortJuly: String { return self._s[3119]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3120]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3121]! } - public var Passport_Identity_ReverseSide: String { return self._s[3122]! } - public var Watch_Stickers_Recents: String { return self._s[3125]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3127]! } - public var Map_SendThisLocation: String { return self._s[3128]! } + public var Stickers_GroupStickers: String { return self._s[3109]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3111]! } + public var Passport_Address_Street: String { return self._s[3112]! } + public var Conversation_AddContact: String { return self._s[3113]! } + public var Login_PhonePlaceholder: String { return self._s[3114]! } + public var Channel_Members_InviteLink: String { return self._s[3116]! } + public var Bot_Stop: String { return self._s[3117]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3119]! } + public var Notification_PassportValueAddress: String { return self._s[3120]! } + public var Month_ShortJuly: String { return self._s[3121]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3122]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3123]! } + public var Passport_Identity_ReverseSide: String { return self._s[3124]! } + public var Watch_Stickers_Recents: String { return self._s[3127]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3129]! } + public var Map_SendThisLocation: String { return self._s[3130]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3129]!, self._r[3129]!, [_0]) + return formatWithArgumentRanges(self._s[3131]!, self._r[3131]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_0]) - } - public var ConvertToSupergroup_Note: String { return self._s[3131]! } - public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3133]! } + public var ConvertToSupergroup_Note: String { return self._s[3133]! } + public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0]) + } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3135]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3136]! } - public var Wallpaper_SearchShort: String { return self._s[3137]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3139]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3140]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3141]! } + public var Login_CallRequestState3: String { return self._s[3138]! } + public var Wallpaper_SearchShort: String { return self._s[3139]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3141]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3142]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3143]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3142]!, self._r[3142]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3144]!, self._r[3144]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3143]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3145]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3148]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3145]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3147]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3150]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_0]) + return formatWithArgumentRanges(self._s[3151]!, self._r[3151]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3150]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3151]! } + public var Passport_CorrectErrors: String { return self._s[3152]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3153]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) + return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3153]! } - public var Channel_DiscussionGroup: String { return self._s[3154]! } + public var Map_SendMyCurrentLocation: String { return self._s[3155]! } + public var Channel_DiscussionGroup: String { return self._s[3156]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3156]! } - public var Permissions_NotificationsText_v0: String { return self._s[3157]! } - public var Appearance_AppIcon: String { return self._s[3158]! } - public var LoginPassword_FloodError: String { return self._s[3159]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3161]! } + public var SharedMedia_SearchNoResults: String { return self._s[3158]! } + public var Permissions_NotificationsText_v0: String { return self._s[3159]! } + public var Appearance_AppIcon: String { return self._s[3160]! } + public var LoginPassword_FloodError: String { return self._s[3161]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3163]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3163]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_0]) } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3165]!, self._r[3165]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Passport_Language_bn: String { return self._s[3165]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3166]!, self._r[3166]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3169]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3171]! } - public var Contacts_PermissionsAllow: String { return self._s[3172]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3173]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3174]! } - public var WallpaperPreview_Pattern: String { return self._s[3175]! } - public var Paint_Duplicate: String { return self._s[3176]! } - public var Passport_Address_Country: String { return self._s[3177]! } - public var Notification_RenamedChannel: String { return self._s[3179]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3180]! } - public var Group_MessagePhotoUpdated: String { return self._s[3181]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3182]! } - public var Conversation_ContextMenuBan: String { return self._s[3183]! } - public var TwoStepAuth_EmailSent: String { return self._s[3184]! } - public var MessagePoll_NoVotes: String { return self._s[3185]! } - public var Passport_Language_is: String { return self._s[3186]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3188]! } - public var Tour_Text5: String { return self._s[3189]! } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3167]!, self._r[3167]!, [_0]) + } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3168]!, self._r[3168]!, [_0]) + } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3171]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3173]! } + public var Contacts_PermissionsAllow: String { return self._s[3174]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3175]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3176]! } + public var WallpaperPreview_Pattern: String { return self._s[3177]! } + public var Paint_Duplicate: String { return self._s[3178]! } + public var Passport_Address_Country: String { return self._s[3179]! } + public var Notification_RenamedChannel: String { return self._s[3181]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3182]! } + public var Group_MessagePhotoUpdated: String { return self._s[3183]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3184]! } + public var Conversation_ContextMenuBan: String { return self._s[3185]! } + public var TwoStepAuth_EmailSent: String { return self._s[3186]! } + public var MessagePoll_NoVotes: String { return self._s[3187]! } + public var Passport_Language_is: String { return self._s[3188]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3190]! } + public var Tour_Text5: String { return self._s[3191]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3191]!, self._r[3191]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3193]!, self._r[3193]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3192]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3193]! } + public var Undo_SecretChatDeleted: String { return self._s[3194]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3195]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_0]) + return formatWithArgumentRanges(self._s[3196]!, self._r[3196]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3195]! } - public var Paint_Edit: String { return self._s[3197]! } - public var Undo_DeletedGroup: String { return self._s[3200]! } - public var LoginPassword_ForgotPassword: String { return self._s[3201]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3202]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3197]! } + public var Paint_Edit: String { return self._s[3199]! } + public var Undo_DeletedGroup: String { return self._s[3202]! } + public var LoginPassword_ForgotPassword: String { return self._s[3203]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3204]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3203]!, self._r[3203]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3205]!, self._r[3205]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3204]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3205]! } - public var Passport_Language_uz: String { return self._s[3206]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3207]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3208]! } - public var Map_StopLiveLocation: String { return self._s[3210]! } - public var VoiceOver_MessageContextSend: String { return self._s[3212]! } - public var PasscodeSettings_Help: String { return self._s[3213]! } - public var NotificationsSound_Input: String { return self._s[3214]! } - public var Share_Title: String { return self._s[3217]! } - public var LogoutOptions_Title: String { return self._s[3218]! } - public var Login_TermsOfServiceAgree: String { return self._s[3219]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3220]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3221]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3222]! } - public var EnterPasscode_EnterTitle: String { return self._s[3223]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3206]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3207]! } + public var Passport_Language_uz: String { return self._s[3208]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3209]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3210]! } + public var Map_StopLiveLocation: String { return self._s[3212]! } + public var VoiceOver_MessageContextSend: String { return self._s[3214]! } + public var PasscodeSettings_Help: String { return self._s[3215]! } + public var NotificationsSound_Input: String { return self._s[3216]! } + public var Share_Title: String { return self._s[3219]! } + public var LogoutOptions_Title: String { return self._s[3220]! } + public var Login_TermsOfServiceAgree: String { return self._s[3221]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3222]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3223]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3224]! } + public var EnterPasscode_EnterTitle: String { return self._s[3225]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3224]!, self._r[3224]!, [_0]) + return formatWithArgumentRanges(self._s[3226]!, self._r[3226]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3225]! } - public var Conversation_AddToContacts: String { return self._s[3226]! } + public var Settings_CopyPhoneNumber: String { return self._s[3227]! } + public var Conversation_AddToContacts: String { return self._s[3228]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_0]) - } - public var NotificationsSound_Keys: String { return self._s[3228]! } - public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3230]! } - public var Message_Video: String { return self._s[3231]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3232]! } + public var NotificationsSound_Keys: String { return self._s[3230]! } + public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3231]!, self._r[3231]!, [_0]) + } + public var Notification_MessageLifetime1w: String { return self._s[3232]! } + public var Message_Video: String { return self._s[3233]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3234]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_1]) + return formatWithArgumentRanges(self._s[3235]!, self._r[3235]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_0]) + return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_0]) + return formatWithArgumentRanges(self._s[3239]!, self._r[3239]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3238]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3239]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3241]! } - public var PrivacyPolicy_Decline: String { return self._s[3242]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3243]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3244]! } - public var Permissions_SiriAllow_v0: String { return self._s[3246]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3247]! } + public var Passport_Language_mk: String { return self._s[3240]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3241]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3243]! } + public var PrivacyPolicy_Decline: String { return self._s[3244]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3245]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3246]! } + public var Permissions_SiriAllow_v0: String { return self._s[3248]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3249]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3250]!, self._r[3250]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) + return formatWithArgumentRanges(self._s[3251]!, self._r[3251]!, [_0]) } - public var Paint_Regular: String { return self._s[3250]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3251]! } - public var SocksProxySetup_ShareLink: String { return self._s[3252]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3253]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3255]! } - public var GroupInfo_InviteByLink: String { return self._s[3256]! } - public var MessageTimer_Custom: String { return self._s[3257]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3258]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3260]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3261]! } - public var VoiceOver_Chat_Selected: String { return self._s[3262]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3263]! } - public var Channel_Username_InvalidTaken: String { return self._s[3264]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3265]! } - public var Settings_ChatBackground: String { return self._s[3266]! } - public var Channel_Subscribers_Title: String { return self._s[3267]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3268]! } - public var Watch_ConnectionDescription: String { return self._s[3269]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3273]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3274]! } - public var EditProfile_Title: String { return self._s[3275]! } - public var NotificationsSound_Bamboo: String { return self._s[3277]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3279]! } - public var Login_SmsRequestState2: String { return self._s[3280]! } - public var Passport_Language_ar: String { return self._s[3281]! } + public var Paint_Regular: String { return self._s[3252]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3253]! } + public var SocksProxySetup_ShareLink: String { return self._s[3254]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3255]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3257]! } + public var GroupInfo_InviteByLink: String { return self._s[3258]! } + public var MessageTimer_Custom: String { return self._s[3259]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3260]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3262]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3263]! } + public var VoiceOver_Chat_Selected: String { return self._s[3264]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3265]! } + public var Channel_Username_InvalidTaken: String { return self._s[3266]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3267]! } + public var Settings_ChatBackground: String { return self._s[3268]! } + public var Channel_Subscribers_Title: String { return self._s[3269]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3270]! } + public var Watch_ConnectionDescription: String { return self._s[3271]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3275]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3276]! } + public var EditProfile_Title: String { return self._s[3277]! } + public var NotificationsSound_Bamboo: String { return self._s[3279]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3281]! } + public var Login_SmsRequestState2: String { return self._s[3282]! } + public var Passport_Language_ar: String { return self._s[3283]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_0]) + return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3283]! } - public var Conversation_MessageDialogEdit: String { return self._s[3284]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3285]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3285]! } + public var Conversation_MessageDialogEdit: String { return self._s[3286]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3287]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_1]) + return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_1]) } - public var Common_Close: String { return self._s[3287]! } - public var GroupInfo_PublicLink: String { return self._s[3288]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3289]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3290]! } + public var Common_Close: String { return self._s[3289]! } + public var GroupInfo_PublicLink: String { return self._s[3290]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3291]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3292]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3294]!, self._r[3294]!, [_0]) - } - public var UserInfo_About_Placeholder: String { return self._s[3295]! } - public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3297]! } - public var Channel_Info_Banned: String { return self._s[3299]! } + public var UserInfo_About_Placeholder: String { return self._s[3297]! } + public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3298]!, self._r[3298]!, [_0]) + } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3299]! } + public var Channel_Info_Banned: String { return self._s[3301]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_0]) + return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_0]) } - public var Appearance_Other: String { return self._s[3301]! } - public var Passport_Language_my: String { return self._s[3302]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3303]! } + public var Appearance_Other: String { return self._s[3303]! } + public var Passport_Language_my: String { return self._s[3304]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3305]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3306]!, self._r[3306]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3305]! } - public var Preview_CopyAddress: String { return self._s[3306]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3307]! } + public var Preview_CopyAddress: String { return self._s[3308]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3307]!, self._r[3307]!, [_0]) + return formatWithArgumentRanges(self._s[3309]!, self._r[3309]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3308]! } - public var UserInfo_BotSettings: String { return self._s[3309]! } - public var LiveLocation_MenuStopAll: String { return self._s[3311]! } - public var Passport_PasswordCreate: String { return self._s[3312]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3313]! } - public var Message_PinnedLocationMessage: String { return self._s[3314]! } - public var Map_Satellite: String { return self._s[3315]! } - public var Watch_Message_Unsupported: String { return self._s[3316]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3317]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3318]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3310]! } + public var UserInfo_BotSettings: String { return self._s[3311]! } + public var LiveLocation_MenuStopAll: String { return self._s[3313]! } + public var Passport_PasswordCreate: String { return self._s[3314]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3315]! } + public var Message_PinnedLocationMessage: String { return self._s[3316]! } + public var Map_Satellite: String { return self._s[3317]! } + public var Watch_Message_Unsupported: String { return self._s[3318]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3319]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3320]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3319]!, self._r[3319]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3321]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3322]! } - public var NotificationsSound_None: String { return self._s[3323]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3325]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3326]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3323]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3324]! } + public var NotificationsSound_None: String { return self._s[3325]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3327]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3328]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3327]!, self._r[3327]!, [_1]) + return formatWithArgumentRanges(self._s[3329]!, self._r[3329]!, [_1]) } - public var Cache_Indexing: String { return self._s[3328]! } - public var DialogList_RecentTitlePeople: String { return self._s[3330]! } - public var DialogList_EncryptionRejected: String { return self._s[3331]! } - public var GroupInfo_Administrators: String { return self._s[3332]! } - public var Passport_ScanPassportHelp: String { return self._s[3333]! } - public var Application_Name: String { return self._s[3334]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3335]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3337]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3338]! } + public var Cache_Indexing: String { return self._s[3330]! } + public var DialogList_RecentTitlePeople: String { return self._s[3332]! } + public var DialogList_EncryptionRejected: String { return self._s[3333]! } + public var GroupInfo_Administrators: String { return self._s[3334]! } + public var Passport_ScanPassportHelp: String { return self._s[3335]! } + public var Application_Name: String { return self._s[3336]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3337]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3339]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3340]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3339]!, self._r[3339]!, [_0]) - } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3340]!, self._r[3340]!, [_0]) - } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3342]! } - public var Privacy_ChatsTitle: String { return self._s[3343]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3344]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3345]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3346]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3347]! } - public var Group_LinkedChannel: String { return self._s[3348]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3349]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3350]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3351]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3352]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3354]! } - public var Channel_Setup_TypePublic: String { return self._s[3356]! } + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_0]) + } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3344]! } + public var Privacy_ChatsTitle: String { return self._s[3345]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3346]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3347]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3348]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3349]! } + public var Group_LinkedChannel: String { return self._s[3350]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3351]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3352]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3353]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3354]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3356]! } + public var Channel_Setup_TypePublic: String { return self._s[3358]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_0]) + return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3359]! } - public var Map_OpenInMaps: String { return self._s[3361]! } + public var Channel_TypeSetup_Title: String { return self._s[3361]! } + public var Map_OpenInMaps: String { return self._s[3363]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_1]) + return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3364]! } + public var NotificationsSound_Tremolo: String { return self._s[3366]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3367]!, self._r[3367]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3366]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3367]! } - public var Passport_PasswordHelp: String { return self._s[3368]! } - public var Login_CodeExpiredError: String { return self._s[3369]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3370]! } - public var Conversation_TitleUnmute: String { return self._s[3371]! } - public var Passport_Identity_ScansHelp: String { return self._s[3372]! } - public var Passport_Language_lo: String { return self._s[3373]! } - public var Camera_FlashAuto: String { return self._s[3374]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3375]! } - public var Common_Cancel: String { return self._s[3376]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3377]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3378]! } - public var Appearance_TintAllColors: String { return self._s[3379]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3368]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3369]! } + public var Passport_PasswordHelp: String { return self._s[3370]! } + public var Login_CodeExpiredError: String { return self._s[3371]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3372]! } + public var Conversation_TitleUnmute: String { return self._s[3373]! } + public var Passport_Identity_ScansHelp: String { return self._s[3374]! } + public var Passport_Language_lo: String { return self._s[3375]! } + public var Camera_FlashAuto: String { return self._s[3376]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3377]! } + public var Common_Cancel: String { return self._s[3378]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3379]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3380]! } + public var Appearance_TintAllColors: String { return self._s[3381]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3380]!, self._r[3380]!, [_1]) + return formatWithArgumentRanges(self._s[3382]!, self._r[3382]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3381]! } - public var ChatSettings_Title: String { return self._s[3383]! } - public var Passport_PasswordReset: String { return self._s[3384]! } - public var SocksProxySetup_TypeNone: String { return self._s[3385]! } - public var PhoneNumberHelp_Help: String { return self._s[3387]! } - public var Checkout_EnterPassword: String { return self._s[3388]! } - public var Share_AuthTitle: String { return self._s[3390]! } - public var Activity_UploadingDocument: String { return self._s[3391]! } - public var State_Connecting: String { return self._s[3392]! } - public var Profile_MessageLifetime1w: String { return self._s[3393]! } - public var Conversation_ContextMenuReport: String { return self._s[3394]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3395]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3396]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3383]! } + public var ChatSettings_Title: String { return self._s[3385]! } + public var Passport_PasswordReset: String { return self._s[3386]! } + public var SocksProxySetup_TypeNone: String { return self._s[3387]! } + public var PhoneNumberHelp_Help: String { return self._s[3389]! } + public var Checkout_EnterPassword: String { return self._s[3390]! } + public var Share_AuthTitle: String { return self._s[3392]! } + public var Activity_UploadingDocument: String { return self._s[3393]! } + public var State_Connecting: String { return self._s[3394]! } + public var Profile_MessageLifetime1w: String { return self._s[3395]! } + public var Conversation_ContextMenuReport: String { return self._s[3396]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3397]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3398]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_0]) + return formatWithArgumentRanges(self._s[3399]!, self._r[3399]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3398]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3399]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3400]! } - public var PhotoEditor_Set: String { return self._s[3401]! } - public var EmptyGroupInfo_Title: String { return self._s[3402]! } - public var Login_PadPhoneHelp: String { return self._s[3403]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3405]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3407]! } - public var NotificationsSound_Complete: String { return self._s[3408]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3409]! } - public var Group_Info_AdminLog: String { return self._s[3410]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3411]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3412]! } - public var Conversation_Admin: String { return self._s[3414]! } - public var Conversation_GifTooltip: String { return self._s[3415]! } - public var Passport_NotLoggedInMessage: String { return self._s[3416]! } + public var AuthSessions_Terminate: String { return self._s[3400]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3401]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3402]! } + public var PhotoEditor_Set: String { return self._s[3403]! } + public var EmptyGroupInfo_Title: String { return self._s[3404]! } + public var Login_PadPhoneHelp: String { return self._s[3405]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3407]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3409]! } + public var NotificationsSound_Complete: String { return self._s[3410]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3411]! } + public var Group_Info_AdminLog: String { return self._s[3412]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3413]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3414]! } + public var Conversation_Admin: String { return self._s[3416]! } + public var Conversation_GifTooltip: String { return self._s[3417]! } + public var Passport_NotLoggedInMessage: String { return self._s[3418]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3417]!, self._r[3417]!, [_0]) + return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3418]! } - public var SharedMedia_EmptyTitle: String { return self._s[3420]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3422]! } - public var Username_Help: String { return self._s[3423]! } - public var DialogList_LanguageTooltip: String { return self._s[3425]! } - public var Map_LoadError: String { return self._s[3426]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3427]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3428]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3429]! } - public var Notification_Exceptions_NewException: String { return self._s[3430]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3431]! } - public var WatchRemote_AlertText: String { return self._s[3432]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3435]! } + public var Profile_MessageLifetimeForever: String { return self._s[3420]! } + public var SharedMedia_EmptyTitle: String { return self._s[3422]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3424]! } + public var Username_Help: String { return self._s[3425]! } + public var DialogList_LanguageTooltip: String { return self._s[3427]! } + public var Map_LoadError: String { return self._s[3428]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3429]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3430]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3431]! } + public var Notification_Exceptions_NewException: String { return self._s[3432]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3433]! } + public var WatchRemote_AlertText: String { return self._s[3434]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3437]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_0]) + return formatWithArgumentRanges(self._s[3438]!, self._r[3438]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3437]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3438]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3439]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3440]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3439]!, self._r[3439]!, [_0]) + return formatWithArgumentRanges(self._s[3441]!, self._r[3441]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3442]!, self._r[3442]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3441]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3442]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3444]! } - public var ChatList_UndoArchiveText1: String { return self._s[3445]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3446]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3447]! } - public var Cache_ClearNone: String { return self._s[3448]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3449]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3450]! } + public var Group_AdminLog_EmptyText: String { return self._s[3443]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3444]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3446]! } + public var ChatList_UndoArchiveText1: String { return self._s[3447]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3448]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3449]! } + public var Cache_ClearNone: String { return self._s[3450]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3451]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3452]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_0]) - } - public var Passport_Identity_Country: String { return self._s[3452]! } - public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3453]!, self._r[3453]!, [_0]) } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3454]!, self._r[3454]!, [_0]) + public var Passport_Identity_Country: String { return self._s[3454]! } + public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3455]! } - public var AccessDenied_Settings: String { return self._s[3456]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3457]! } - public var Month_ShortMay: String { return self._s[3458]! } - public var Compose_NewGroup: String { return self._s[3459]! } - public var Group_Setup_TypePrivate: String { return self._s[3461]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3463]! } - public var Appearance_ThemeDayClassic: String { return self._s[3464]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3465]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3466]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3467]! } - public var Conversation_typing: String { return self._s[3469]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3470]! } - public var Paint_Masks: String { return self._s[3471]! } - public var Contacts_DeselectAll: String { return self._s[3472]! } - public var Username_InvalidTaken: String { return self._s[3473]! } - public var Call_StatusNoAnswer: String { return self._s[3474]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3475]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3476]! } - public var Passport_Identity_Selfie: String { return self._s[3477]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3478]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3479]! } - public var Conversation_ClearSecretHistory: String { return self._s[3480]! } - public var PeopleNearby_Description: String { return self._s[3482]! } - public var NetworkUsageSettings_Title: String { return self._s[3483]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3485]! } + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3456]!, self._r[3456]!, [_0]) + } + public var Exceptions_AddToExceptions: String { return self._s[3457]! } + public var AccessDenied_Settings: String { return self._s[3458]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3459]! } + public var Month_ShortMay: String { return self._s[3460]! } + public var Compose_NewGroup: String { return self._s[3461]! } + public var Group_Setup_TypePrivate: String { return self._s[3463]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3465]! } + public var Appearance_ThemeDayClassic: String { return self._s[3466]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3467]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3468]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3469]! } + public var Conversation_typing: String { return self._s[3471]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3472]! } + public var Paint_Masks: String { return self._s[3473]! } + public var Contacts_DeselectAll: String { return self._s[3474]! } + public var Username_InvalidTaken: String { return self._s[3475]! } + public var Call_StatusNoAnswer: String { return self._s[3476]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3477]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3478]! } + public var Passport_Identity_Selfie: String { return self._s[3479]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3480]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3481]! } + public var Conversation_ClearSecretHistory: String { return self._s[3482]! } + public var PeopleNearby_Description: String { return self._s[3484]! } + public var NetworkUsageSettings_Title: String { return self._s[3485]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3487]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3487]!, self._r[3487]!, [_0]) + return formatWithArgumentRanges(self._s[3489]!, self._r[3489]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3490]!, self._r[3490]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3490]! } - public var VoiceOver_Navigation_Search: String { return self._s[3491]! } - public var Map_LiveLocationTitle: String { return self._s[3492]! } - public var Login_InfoAvatarAdd: String { return self._s[3493]! } - public var Passport_Identity_FilesView: String { return self._s[3494]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3495]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3496]! } - public var VoiceOver_Chat_File: String { return self._s[3497]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3492]! } + public var VoiceOver_Navigation_Search: String { return self._s[3493]! } + public var Map_LiveLocationTitle: String { return self._s[3494]! } + public var Login_InfoAvatarAdd: String { return self._s[3495]! } + public var Passport_Identity_FilesView: String { return self._s[3496]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3497]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3498]! } + public var VoiceOver_Chat_File: String { return self._s[3499]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_0]) + return formatWithArgumentRanges(self._s[3500]!, self._r[3500]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3499]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3500]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3501]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3501]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3502]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3503]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3504]!, self._r[3504]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3503]! } - public var Tour_Title2: String { return self._s[3504]! } - public var Conversation_FileOpenIn: String { return self._s[3505]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3506]! } - public var Wallpaper_Set: String { return self._s[3507]! } - public var Passport_Identity_Translations: String { return self._s[3509]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3505]! } + public var Tour_Title2: String { return self._s[3506]! } + public var Conversation_FileOpenIn: String { return self._s[3507]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3508]! } + public var Wallpaper_Set: String { return self._s[3509]! } + public var Passport_Identity_Translations: String { return self._s[3511]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_0]) + return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3511]! } + public var Channel_LeaveChannel: String { return self._s[3513]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_1]) + return formatWithArgumentRanges(self._s[3514]!, self._r[3514]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3514]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3515]! } - public var Passport_Email_Delete: String { return self._s[3516]! } - public var Conversation_Mute: String { return self._s[3518]! } - public var Channel_AddBotAsAdmin: String { return self._s[3519]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3521]! } - public var Channel_Management_LabelOwner: String { return self._s[3523]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3516]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3517]! } + public var Passport_Email_Delete: String { return self._s[3518]! } + public var Conversation_Mute: String { return self._s[3520]! } + public var Channel_AddBotAsAdmin: String { return self._s[3521]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3523]! } + public var Channel_Management_LabelOwner: String { return self._s[3525]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3524]!, self._r[3524]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3525]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3526]! } - public var Common_No: String { return self._s[3527]! } - public var Weekday_Sunday: String { return self._s[3528]! } - public var Notification_Reply: String { return self._s[3529]! } - public var Conversation_ViewMessage: String { return self._s[3530]! } + public var Calls_CallTabDescription: String { return self._s[3527]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3528]! } + public var Common_No: String { return self._s[3529]! } + public var Weekday_Sunday: String { return self._s[3530]! } + public var Notification_Reply: String { return self._s[3531]! } + public var Conversation_ViewMessage: String { return self._s[3532]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3531]!, self._r[3531]!, [_0]) + return formatWithArgumentRanges(self._s[3533]!, self._r[3533]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_0]) + return formatWithArgumentRanges(self._s[3534]!, self._r[3534]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3533]! } - public var Message_PinnedDocumentMessage: String { return self._s[3534]! } - public var DialogList_TabTitle: String { return self._s[3536]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3537]! } - public var Passport_FieldEmail: String { return self._s[3538]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3539]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3540]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3541]! } - public var Privacy_Calls_P2P: String { return self._s[3542]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3535]! } + public var Message_PinnedDocumentMessage: String { return self._s[3536]! } + public var DialogList_TabTitle: String { return self._s[3538]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3539]! } + public var Passport_FieldEmail: String { return self._s[3540]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3541]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3542]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3543]! } + public var Privacy_Calls_P2P: String { return self._s[3544]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3544]!, self._r[3544]!, [_0]) + return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3545]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3547]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3548]!, self._r[3548]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3547]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3548]! } - public var Passport_InfoText: String { return self._s[3549]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3550]! } + public var Stickers_ClearRecent: String { return self._s[3549]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3550]! } + public var Passport_InfoText: String { return self._s[3551]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3552]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3551]!, self._r[3551]!, [_0]) + return formatWithArgumentRanges(self._s[3553]!, self._r[3553]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3554]!, self._r[3554]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3553]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3554]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3555]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3556]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3558]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3559]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3555]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3556]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3557]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3558]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3560]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3561]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3562]!, self._r[3562]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3562]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3564]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_0]) + return formatWithArgumentRanges(self._s[3566]!, self._r[3566]!, [_0]) } - public var DialogList_Unread: String { return self._s[3565]! } + public var DialogList_Unread: String { return self._s[3567]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3566]!, self._r[3566]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3567]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3568]! } + public var User_DeletedAccount: String { return self._s[3569]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3570]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3569]!, self._r[3569]!, [_0]) + return formatWithArgumentRanges(self._s[3571]!, self._r[3571]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3570]! } - public var SharedMedia_CategoryMedia: String { return self._s[3571]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3572]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3573]! } - public var Watch_ChatList_Compose: String { return self._s[3574]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3575]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3576]! } - public var Watch_Microphone_Access: String { return self._s[3577]! } - public var Group_Setup_HistoryHeader: String { return self._s[3578]! } - public var Map_SetThisLocation: String { return self._s[3579]! } - public var Activity_UploadingPhoto: String { return self._s[3580]! } - public var Conversation_Edit: String { return self._s[3582]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3583]! } - public var Login_TermsOfServiceDecline: String { return self._s[3584]! } - public var Message_PinnedContactMessage: String { return self._s[3585]! } + public var UserInfo_NotificationsDefault: String { return self._s[3572]! } + public var SharedMedia_CategoryMedia: String { return self._s[3573]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3574]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3575]! } + public var Watch_ChatList_Compose: String { return self._s[3576]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3577]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3578]! } + public var Watch_Microphone_Access: String { return self._s[3579]! } + public var Group_Setup_HistoryHeader: String { return self._s[3580]! } + public var Map_SetThisLocation: String { return self._s[3581]! } + public var Activity_UploadingPhoto: String { return self._s[3582]! } + public var Conversation_Edit: String { return self._s[3584]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3585]! } + public var Login_TermsOfServiceDecline: String { return self._s[3586]! } + public var Message_PinnedContactMessage: String { return self._s[3587]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3588]!, self._r[3588]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3587]!, self._r[3587]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3588]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3590]! } + public var Appearance_LargeEmoji: String { return self._s[3590]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3592]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3591]!, self._r[3591]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3593]!, self._r[3593]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3592]! } - public var Message_PinnedPhotoMessage: String { return self._s[3593]! } - public var Passport_FieldPhone: String { return self._s[3594]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3595]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3596]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3598]! } - public var Conversation_Call: String { return self._s[3599]! } - public var Common_TakePhoto: String { return self._s[3601]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3602]! } - public var Channel_NotificationLoading: String { return self._s[3603]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3594]! } + public var Message_PinnedPhotoMessage: String { return self._s[3595]! } + public var Passport_FieldPhone: String { return self._s[3596]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3597]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3598]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3600]! } + public var Conversation_Call: String { return self._s[3601]! } + public var Common_TakePhoto: String { return self._s[3603]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3604]! } + public var Channel_NotificationLoading: String { return self._s[3605]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0]) + return formatWithArgumentRanges(self._s[3606]!, self._r[3606]!, [_0]) } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_0]) + return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3606]!, self._r[3606]!, [_1]) + return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3607]! } + public var Permissions_SiriTitle_v0: String { return self._s[3609]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_0]) + return formatWithArgumentRanges(self._s[3610]!, self._r[3610]!, [_0]) } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3609]!, self._r[3609]!, [_0]) + return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3610]! } - public var Common_edit: String { return self._s[3611]! } - public var PrivacySettings_AuthSessions: String { return self._s[3612]! } - public var Month_ShortJune: String { return self._s[3613]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3614]! } - public var Call_ReportSend: String { return self._s[3615]! } - public var Watch_LastSeen_JustNow: String { return self._s[3616]! } - public var Notifications_MessageNotifications: String { return self._s[3617]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3618]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3620]! } - public var Group_Status: String { return self._s[3621]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3612]! } + public var Common_edit: String { return self._s[3613]! } + public var PrivacySettings_AuthSessions: String { return self._s[3614]! } + public var Month_ShortJune: String { return self._s[3615]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3616]! } + public var Call_ReportSend: String { return self._s[3617]! } + public var Watch_LastSeen_JustNow: String { return self._s[3618]! } + public var Notifications_MessageNotifications: String { return self._s[3619]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3620]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3622]! } + public var Group_Status: String { return self._s[3623]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3624]!, self._r[3624]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3623]! } - public var ShareMenu_ShareTo: String { return self._s[3624]! } - public var Conversation_Moderate_Ban: String { return self._s[3625]! } + public var TextFormat_AddLinkTitle: String { return self._s[3625]! } + public var ShareMenu_ShareTo: String { return self._s[3626]! } + public var Conversation_Moderate_Ban: String { return self._s[3627]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3626]!, self._r[3626]!, [_0]) + return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3627]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3628]! } + public var SharedMedia_ViewInChat: String { return self._s[3629]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3630]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_1]) + return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_0]) + return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3633]! } - public var Appearance_ReduceMotion: String { return self._s[3634]! } + public var Map_OpenInHereMaps: String { return self._s[3635]! } + public var Appearance_ReduceMotion: String { return self._s[3636]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3635]!, self._r[3635]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3637]!, self._r[3637]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3636]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3637]! } - public var PhotoEditor_Skip: String { return self._s[3638]! } - public func Call_ShortSeconds(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[3638]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3639]! } + public var PhotoEditor_Skip: String { return self._s[3640]! } + public func SharedMedia_File(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _1, _2) + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, _1, _2) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func ForwardedVideos(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func UserCount(_ value: Int32) -> String { + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func Passport_Scans(_ value: Int32) -> String { + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } public func MuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func QuickSend_Photos(_ value: Int32) -> String { + public func SharedMedia_Link(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + public func ForwardedPolls(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) } public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) } public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Passport_Scans(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func MuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) @@ -4497,191 +4497,193 @@ public final class PresentationStrings { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_SharePhoto(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareItem(_ value: Int32) -> String { + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Minutes(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _0, _1) + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { + public func Call_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) } public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } public func Conversation_StatusMembers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[87 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, _1, _2) } public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Video(_ value: Int32) -> String { + public func Notification_GameScoreSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPolls(_ value: Int32) -> String { + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift index a9203282a4..bf3f40cb61 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift @@ -586,7 +586,14 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { return } if highlighted { - strongSelf.reactionButtonPressed() + for itemNode in strongSelf.reactionNodes { + itemNode.alpha = 0.4 + } + } else { + for itemNode in strongSelf.reactionNodes { + itemNode.alpha = 1.0 + itemNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.3) + } } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 4a2c5d3a67..0f41e7eb04 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -396,7 +396,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { override func tapActionAtPoint(_ point: CGPoint, gesture: TapLongTapOrDoubleTapGesture) -> ChatMessageBubbleContentTapAction { let textNodeFrame = self.textNode.frame - if let (index, attributes) = self.textNode.attributesAtPoint(CGPoint(x: point.x - textNodeFrame.minX, y: point.y - textNodeFrame.minY)) { + if let (index, attributes) = self.textNode.attributesAtPoint(CGPoint(x: point.x - textNodeFrame.minX, y: point.y - textNodeFrame.minY)) { if let url = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { var concealed = true if let attributeText = self.textNode.attributeSubstring(name: TelegramTextAttributes.URL, index: index) { @@ -417,6 +417,9 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { return .none } } else { + if let _ = self.statusNode.hitTest(self.view.convert(point, to: self.statusNode.view), with: nil) { + return .ignore + } return .none } } diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 15581c43547a9ecd589f3acd25f4d61ad96340c7..1542380a7bbcfa7fa98b070f807dffbe852610ff 100644 GIT binary patch delta 34324 zcmZ5p2Y6IP*UnsWlif`xJzLZJCZS6YA@mdoMWlvgfk2WCDKw?2ph)KkhoTfe8=@3@ zquC49u84qLL5f{z|2wmr1pn{hOLAw<%$+-P=A8GG8J{}pfB!Lm@%>)$S7-Cf!pFzt z*UBT4y#s(Do?4zVE4()*8y~{*2jq4Jm z9|Wa?!rDa8U0uSpLxK){5JP*qgo@YbP?rq-4OCkx|6nxv-x8$1iKiGAqeYCd->ANL z@Oevc{t^*m>LMTB#*b_|(l44CZn27YXw5C{^>9q*PXKBM2eC5X={y1PyLLhy+< zL^uuV9wJWCZQT>amo&e77jcSS=$@c|r3NHl5;(*?OAhC>r=%D|oK)?um@doCkgZ3Y zeik)t`Rqv%>4(33z817=hs8L`U9V`qp?N(l;#=C(BQEJX)Q5wlZ+WB3DOW=NF~C(` z>8h74zsHXlcGL;8E+2oOzk4K!AIaJ?S^Pu=JrnhxQEcJflSG_pcvWMyn!sOZRZp{i z0W}HK`%touhCUbR^PYBbiT>$n(=KC$zrlANoaayNdqs+0X<#ph_J`nwHW5J!dc}%A zX=ATc@fRKHl`j6KbG>rJKVVpip}v9q-*%_tAWO5^2UvduW5_A5Rv#V|83`%RCrR z6iGv!;jKj`6xk?#rUC#jzky>%BvMuhST%{2Zp@7z^p}Tly^3qUM+~h4*IwtL5tBS)MBIP zzE&+(quu9hob`+d3Lflo)fKratIFkvSjgQsQ&{O(aauqZXK{IrdW(&Y_RSV{y4tt1 zaL}Ovv4#f4J@FbH$_Zcpun6^=DqAPe{KB-ZNf>Gfp5&mM!(4Ul`o^;9Rdtde8C7jn zRmD`7v&>aLv#P??ud3RmHhl`6DNNB)HJX?cNu}$2?XpHTOG7g$JBrHdoCD@es;{b) zr5V(_U$)4i+I|^Ywnpx12ff@cSUBn3e))PHnpo-b?3m2qu4>nm`tlmtq@DNuN(dDd zmX+oAFPxA+qVK>GaFb658rDBgbfmlc$7`MNX_4Wy+Aq*B+TA4EcBZ5Kb43@r(SL~O zMneWzM0cthVAgtQyeM15(Y68paXrz05NL~B4GrK8XMR&KC0kgqSLUV~$_p&FG=iz4^n z5K%@826xeiW4LzOvoC^<4{ocCz$bqYPUj~Dwu-rt6f~rxeUx|F3Z}X$rn{RO2i8t@ zJ6m}BRw^HoDMr(ZA!hwHP{z^Or>ttHkD+5jvc*`*G5#KbI*zPG(fW8$S>+B2lyazF z`D{7H2{gVaU7v`mM7ppofp!%cv~tWtHxc34hi8fc#3VXjl&V#LeIJXYjN(wOQsV>d zL?mtcDOBxTmqxp+X5)yu;chv1lWAG8O`n2JW7nREZk0<@!Qt)nDmhxtdm6&pQW6k1 z4Ucm5B;z(Xi(Rvtx7BpYFEMM?8pS)!rk3SmjfM?QW~z!&^UXLh~^hpi;%>6R7K)#&Ad`tRa@(-99TQkjXi;Kp9YP$J}+YE zfzlw+sOGRvZSp31uQXMkiRKAl@CY&ujTE!UG1MVuQ~uCYeJ*N}c=vrGfmRJQ#@vp_ zn{SMkQG+oT2FVJp2T^VW@3&=byNi3w^!?MI8su>m|?xZEdQpH`gYgnpz zF}evxJGFHR2ILQ)Fr={Ga5=|I=+dwh>piHK@_0mDrPLpuU-@-v+uuv=%Q}jsR8?lv zmxC^s_O7(h(Q^jcQx+~(&>LkAv5LMcOVC%NHcqKpatsd=Ysophvmly0JXzdN%ZJB{ zb+l`Ep4dQVhR13f!LXI#6g;A>*i7*wQpE!_aD-JnNK-~6YFjk2&x_&(y@bI~GI=sa z=Cf6bHTq(N$+8Wvks@joR=Tdd&Q;&a&D+f3ANn>lF$W-caC(Rv|ray_oXo`O|uD^W$Q+Nu) zZx4SBD{ri-ozk+4cA-+TLw{GTtG=qjSy*51u9sq7ZZ_F^Hwer$_ro~jaMx_LgnJ;6 z9W?mXXt9?nZcU1P8We#o{TEd=G`N(Ye4e&}<^?QcG#$G&RJ=%MZcWf$($+o{z4p9+ z(1_YP#d>lrU#6VVw}@A$YIMAKm6nZmYWqBD_eKtDSZ~*U+%ghT8hzRYFM^2gA z$+oYdDwBd=jHO<;#fsNy^lcg94Z8cbH1Q@qb(>9l3xfTp7}~Pi&+k@{`@Bt;Z%YOG ziXG$B-qUE+mW-A!d!OzYV-|;L!x)Qx6y4gCYNjJ&!n9+WLJVua383p^!o+b39otTv zpn|c<`Ujx2vvZk<2_5E|>7MQyQdO(;)Q1|~SZby{W5WQuUK^VQ*mZHN6R^uR&a8ii zR`FE6Ba+I-h3lW=DTd0IN43g|leBDH2JqMOOX|PfXV@;^o%0g%)E$RpT5vgO_OgM2B|S zqcA_47^wZK@s0Z+4X;d$6u(hed4~9%x|gR~|3FK*YNK3}%3S636;qu9YoMQ$*8P(f zmZ#bN0>#amt8}WnQL)|Ms4&yEs0jL^JXre&TkdN!>61eAe^HS@2lC9J;A9u@V(kxDyZwZHvnVnwPj(7hE&nz0R?XdB}{ zRn3!$j#T7{0J>3;+$|6-B?Kuguc~cy7F1(83f#4mtLha%2tuu#r~)9L`f}&Us!Er; z$ZHG)(}c<#5kjjfb44f}tW43u)JxX7{6t&wciHiksV*CoNk3Pz7Tt!#$Z%TdioodC zp&+&m9WPD|=+J_y;^=~_lV)zi$4Z4gtkm7mSmAw>1*6Cy$ALJin;Z=^cJJgA&DMr5 zzaqj-C9@zOFhVHqBa>rv2S{zSYP30^u(o`X2QDR0=#&(5GHRs2E^{?XLDS$Yt#{8> z(~&|$r`Sa*&6v_jq|xJ399p_(W=~HE6d81WN}8U9#__bZ$`Vux_*P$D)hKs(HuagB zq&eI0jHCFdg;S$qazLk)OSuGeEy669c1=yw^H6E=?A(h}Lqt2eF*QMSpoFSq(U}HR zSpcS7RgS2xAd_o3qPEiQlt1vdPdD0Jl>&tIT2*pf4-hE5?7_Z$0q7bPtMwu=Em7;; zhVxTIIIrp;0s>kq^QmN7idN8uPQM&YE2l+j{V>z@z{0sUBfU8-Tx&er5)O4#hqz!C|C<$kH%3>Z6`6FCfCMm z6Fh9+q{Lo1Jzkp#$aJ{2gQy_kPS7hcARAvg0TI!|9V%Q@>`oVxX|~&$stBxDA9thEtGw`M zSz~!)laeoP)XNPAEKprl0i_4?#e)vyI@ft?i`=!1Q=Mf~!EJ-eYn#gJ)dbFkb_f$o=1!7bM^VC52q7L z!VP`P)p!=riF!N0(dGJhfTQq+6#XvG>vlwj=2uoq`6kUBIhwnvq9HzZF{+zYveS$7 zWbG1qupv?0ONScL^!q?#k*M+b6>MwK@LSx7lB z%+=6X?%4-#cq@m`a+fu_>hhbg&09X^P3-JU@fNMPJwd!pdv0&1zXS4EIx#4MuG}6d z-Xp^u8RC6ve@BvbxD7kziF8vl$~w}9#d_s?GX~XFm(S^6HCge`Q95{s6W+Ls_<5Xc z^HTH^=rfg%?GtAHEJFnQ*UGQ@ppCSWY3sZ|?L#b*#|dSDbMDlfaB-q5xX72ie*39pa_$4SLkC(dKb=9t7?Au9m zTEF`gYSSoeh@JcwgzBg9lnz`+T^2-WXWDRBN0_`5N&zb7Kh#z`+lJyfiubG*2B{@| zz6Q0O4n1q3_ZOJ-Z}AkpW_2W8Twv6{!$Tqu4aSFV>LCJ*a>xFFvIsgmFw&5hE1!S# zXm9Q|RKOR8|NTU>7ba>yw_*DM5#!%k(wu9#+IUF6NE&-*IQ)EdcRJwbTXSck_D>t$^8j8r@qJ%9erJUCFP2GqgRk8gq+da+ zOod8UPBT*0U6J;yD3P+>aSb)GR32kdpL>HA-DT5!d};e#$wH&I?@EPR z@8VtQLZ{fflcCOg-JL4@Y0BO4y1^G7D>c(Q?hX}3din139wwB@kMZz&u^ZU2)}uF2 z=o8?r^=LC_!!lQ0qpN0;M?nRWV{yD50-7A<5}3R=N(=SnHN_%2JimHY`J9GkgCz_! zSv+(nO!)T}hk+5kT$~MbX<8Bw&7HL*PLBdXB5!RF7Mijo7?Uz{i9?S;VI=k59}_3X z5{oAVk(D`q@^PW^a0X0#4=q|i+{yj!L z5szl-u_HQAqWoG{wd9dx+I>%kNTDz8apYnnwI6u!Ow^!I&yDhTsB%a57gPO+T$tAL18j>ppD{|wiOvX!y#-jeXANO z+%sMEb6Op@?LY@4JJU`>mWBXaj$N83I?>9dHbBf{>!axPr7?h+UoMRox6t*a*`h0D z-Ipu6(K!69UvSz)v@BdAc^lcdZsf+m?rEMZSFH9nAjm z<^ElZ@mk5RQuhDXpH_mJaMVZ_{E(^!NEU3Te1%O=3SVB>3M;^5&Wd<|$)PKf^fEMv zr!BG3Ssp8_tf`^`4oFEn!uuAfxV%mo*aEUe`MY!4=qbX=*yts{W zR<^f~K~oQ>H~UCnNffxN-Sx8hSX#6)Qyb??$NJmo@X9dY&#zXd=o8Q=T^ZB1Rc0}f zx~@vo%6*k+v38JbGYJF|9^7Pp$?ht!I2IsJ1MOR7)GI;MEPjK5Qh!;M3X~eTI$2Di zZmaD;rejuHfJ|qvP7~8;`|3{mbhL=!;x!^V2ok79zNs2T@tn6n#8T{<5Us}7qb>%l ziG;^){F+3o8w65_-vmAL>*_t>ojTgGCIxWw%{4iC6X+}yA09zLYeU3LvaZe3X89^3 zHMB60+-r>hmvh!SwK=}LYNJS`!)s0Y?PwIs+n$AKQC~F^lP|w=K3!d#06&|Z;^Ak@ zr!0WTTC%~zwt_Om-Si?Qh{bf062%g_LCN|(=p=!LJ{}tha9KFJ0>T8^S@yJ4cE5H| zG}Yd3v@OGf{19b8Nv`o2L6wqlIR*+J+2i-O)mHfOcoNBh&iu-nDi6$ENx$5mrLFRn zwsJt7!mX>(nVoYsLGTV=hwy?gZJQKJ3)Tg|0k>>jf^@*GOVrl;@}YYmc79$LC78te zcKQZ6B9Ez5y568~#A6(<4inJz!f?gibPf=>3p#HAW-VaFF;P-Oh>PVcN=eIOGm+to|s7B52R& z(aQh(nCDxjs`-8#RY_F)W0Ik=e2(mP2Myfd(4RnYwo;R{bVIDR)0cJ+i=vk|go-EW z{S9g6r%*4$4IT)K;pgGOXBSFk+$fR~H%0>U-Llc9?eXQ6TM%UQhBx;5a{hNBd~LCx zsed(W0om+ndT?Ws^%*plOY|QPda1{#c#gi>m<=EoxG7eD5p=PpwAWr^9Be!MvHQSw5aO0==|n1{cY5yW4>c3-x#C4<4c!d zxslyx;Dz|6CkGOh!O6++MHk+Ug*!z`0U$X08 z=-BogcouJL&(tnr7@j~Ll{}s^qelFOV0>QDI<*HD>A+xAA$*oPy;b(-;Tf_?*K zDRk+Sm7aSzRP)j4^TtH_`QZRv!y8igMo-9S>mw%7hSDC12l^ZINCFnU=8;bEejre` zr%X~%L5}>seJ2zZ7WF9{Ci%dh-gqQlGw8f#5rp6MN1`>O&U3~HtEs&lj0w$cv?x6~ z94fogRolEA0Vs!y89s@HkILZgnn%<0Ae2Q(LnnAbX~~cwviA@a; zjEtDTvQ~f@M!g@4*CnSVH}8ZPi`3oHUWWzbEOtvfsGqy3wo;A=;pE3sv`C%Imu)xs z#-ixPV+mTc&hcO3JNBOsMh|ikiXKmax@>$rMUO*CwnAOz0tD9GHNaldzgXF9=E&75 zptD!f>Ea5Vjy!JBY&zGai70-zCq6M~hXDcOs2vFi7~irZQH$3-Ug4QLA^~cb?{HuZ zp4yQN2>9WS6kR3;q)7`X?ul?D06s8az4ze@laD`4fo(qUQ;xmZ2;6 zu1l$`OuF%eRb-QOXR78@6*PXQpU5TG&P2T(+QxcPL53IJssdK+Y1htVO9xa)0M_Ck zRc4%gQAZun&c+imgh|D6I+Nu|2T)`W{Je$6KWPJsocE+f@20w*7$t5BEOw^@PquUP zKutJ$Dkzt3QRQTYtv{vSi^_UZ*i%`e7xjE90Wsn7r&19UUiy?-FF>;_WpG&5M{9j` z>XjKoe?Aqe7os9TnO|HSAWW3G%c%A9d};A6zu5k$Zr0JO1vopWiRj>THLumIdi(Z8KEMD{)fax#0qV!@sCeit>i9yXvU5b(fDOOuu zEJINgO?#Kd(Zb!n`Y=4j(DB>M%0MlXbv)y+hzRglHF7A!>F{owHd5z>??R~i?FrRK zsb1k?rp|kU^jq;1r+if7_5{(dd(!=s*uITw_on%`lRb>l>GXtXI=v?x5oMJ6sVz5- z;`b(K<8|c%rd#($0(92y%@*bKz}{r*B=joPZfl&+6aJ9>RnS*^V?`zXz1Oa}bgoSY z<*Q^#y3!o)@i$>)KinkujpK+Ff2*R#C3t<3jJdnjKK^*);o#7SYz{QuI4PkRmNQ zp12BmC>NhI0Hpr?oK3qMT-PmvvYrnHQtkG9nzlrz+|4n3VK1ETNT~66*zUo4cz_T+ z`MgnE>S5Jm&-4Ux03j4nNI7t1O11v^5*xi47Y(=2)+DRnhk zNCnd350oPv0*6X%a}vxNP@Q3^F~(s}poh=rU#VbnJ3&AQM}g@hiU(=R&2gKJ;P(6^vbI+v433|0`j z`E$3@#Frd!ZZ3K$R&1xuFU5<8Xx~d20INT~l%+lFS^LycRgS>4NK%VT(ywvtDR6g4$eRYbz(EG2X=})V&$(J0ba9`qz2OxW#{H3qOxyQc;DGGD zKM4-V^8M}1@1h^cpe^hs_e_KA?mgPI-wtQw(ftVsO<&%hp&fyu0CLSe5TzeQv(%PF zG4}DK{T$P2etI0OI}oNH2SJ*$j1L}&1EM{7z>e&|D+e6nL$VxnXdme`8YoCA*VYxkYu&wr~j&!Y5I(0A%{>O_4ll9NhnVA+|j3nowAn^rtKa{7P)ak4i zOZOgXi&*vMLly+5Up$m1PSe>#IpPe3y=DXQ%zZ6E`x^WRcPFpjEdtuYFXW!(T_I(8 zeM5J@mW7PKy{}mjtUmTyy8b<0W|2ZDbVC39qQVJf1tr52EB!$6uiF4id%xb^@H2?y zVsprR5u=~OQB+Y&F*ne>IbE%!&Q&{5$z08k&b;LS z=oD|~>AnyxSEKiYeH3|)ejKmB$Hyp9*&PSZ^w&myte zOr76}K_I*Iog_U_bs;@p8{P@jg8by! z^^?+?obN_xVSaq(0qElK?;5qXs$6@L1mf>TIatP2`n+{J-F;>_Iqi-f!p891`a&-Ub={f`wmju^VxOrfN?{a0+dIKUq&j!&C+LGXhL>?)~8CG?d86 zRv+z@_(rZ(I)xriL@c|*VFxkwVz zi-fi#BpXe4RjLSy`SZZvwjDZQW!=>-*PJh#!o57PCqsP;IvjQ#696EKcK zKFo#3v-gJ`#RQu9VH!Z^)(?}qmV;EP-cePRQ(TS6{%o8owJRda${3r3YN=WZ5b8s6 zNk6!Vrj{t#P(jzwNhPIxWJ{O~Dmg{XK|$vbOymG0tH@cLipmsr$gs#AA4S6jdjCg> zaDl$~krgrdPd-Z3s{K^vGVMxgbV= zGsO%#@v#|!_Fq2Ef!EXeNwU`HN0-{$TJs{Bz)9bUh!ABw42SepI&mhg{v=bMg>Jhk zTkxk(Vzt?RDo@h>X(+<%xu4p_?Ns_{qJ9U6qUg|RWG8=W)aTC8fbon#8xQD_% zw^LF}5ya+y|bYTg+DOSIV^1q1J z*Qf!Wofk_Bzwk|1izm4Zt@)196)?JFgj@zfWgOCDVrc&t#`yJkQqDckx_ZLtUO}`0 zb#`@Z;p!J{#YPG_=@6SJ_hh8L88sekKmMdie^Ao#r9H?;c|KVLTeo=oEOph_Adye{ z?wrk8)LUuKNekfSk&_94o0m=|18zorX#?C`{bdBLz8I(ie-ERF43%F#=gTPgN>_iG zq(6$XDCNpN@}*IG%#Vtl=13>}ka7z)TL6!PD27&+#E|2Zzy1WCtnA(|tOl=hX(tUm zm8d=GM`xe0`gc@p@Dy!2l`MAA!Bd&=jGjN0tnWcHxVfR-Grnqz{KSJ_TWIuGA>wJO z`pTw1hgviDJS5_bGMv5Y;X>D*WKhPd6j0I&eHaIFI`17|IOieH{}Xh)Uw_McgW9(<0G_3K0gr}MwI0SQk0 zy0i8Hw0>hW?fE(caPZ*QnfgcQDN82Ym?_|!7(l|LZ!(d#So%#O(iR)Pap<3^;VxPn z7p5Rwt04c}j{}}Sv(w+``WI?ELyyOVj%ci^M%G}TDo-5nB!zvO0-V_8TRYB_-1@CU z{|clyy^HYo7{1f2L&qOO4=LzTg8u(raD(9RUerUrkHhfFPsk>>y04v2E^&$)U4 z8YR>GQI0UVbE;~a6krNOX{>U|XPpbsgYjfh*u3;y2%zJ{bFoNyoO`al2%}x+ZqeJK z-lOO#_z52brD?y!>2_4(G{^n1H~T^zwCfie0OgTi(zOJCIy*Otf-eL> zwZ&b?5Xn?{Arl^*85bP3RJ4|&ycr@k!B;+~87ZdG?h7fs)4e2;nftpM|C{ab;FtFc*^OJXOLT}%@>bO(Os(jym> z^gOgccCtE#;qf@OqsteQZS7I+fjAZQ2))9A-nz>>`16Acgw^9E>qw(6S@ljJkK!$# z0voKlX%q~2cghxhV@OE&!$lp(Nsf2^t5bmwBOdx!q~>lh zCHm9EU*oj_{?fGJ@rS{QkNg^99f$_<`;e9Fly*|#>_(XfrPRS-I`M0kHpHKDYaL|& zEz(-#C6=PN+LL$F!d=BQ^fv%UP~^g49znI&47Bk#v$+%{a{J3w#VMZrdK_o-oSPa- z$9}UTe17q_4806gsnWROg`bEJB?^X9(eLd56&L=VtdB&sgM&_sxDbh2vAsM;OGf#t zyqv4!g~5h*_}mIQ39@AV6Jj}@?5EKvO!fq!)BXt8Zu6%JMKbB0#{6MIKIh~=62v%K z`iDgu@9(i3_Q9WU90@*;7^FN>DOqw7jrlVjDWHr0bm*06i)qu9!M?+Ay&kW=v39+ER7%%gZ^u9yekR#DksN!m0ecmh19Os0d_&bcqcQ@Q7_ zwt6)lrQbA?zWgg#uf6M*ziu|(7P|5z=2vpkn?|8i)h0UR+LUmB9f#&@k zo!E$SY0s3(0DHw88QOxSUh48@gQC`=g1p9I<+ao0G|Z%vf2TQSp+e$@76(s0vL))^ z|EgAVHJj`=BB{$iq52#UM$^z2!fE0^0f4gA|HK2zuKXug+(8HaN!M^>QF?z?hx&)f zLp83-A?1@iSY|$?krvLU_lbaDj|<#;0%ZZ^|Jzqzh>oplXeJekmt$K*yZ_Aq(*5FJ zyLOj9ms^E7eRw@$XkNF)-Do5CN=s%@NkyaEn^&}$dR=L!F98Kyg12G&FTWB9K)mrv zBF^0GyCR*cr>>M}EBw`wHW_CfeATF}RBs8Vs;d#m7M*`JU0;J95SCR(U_)^B=J?fY zcuTKeO-6`6=~|w?0rg4V4HgX)yX0Dyw%MO{?^LJt=*YDI?E!z80ZkXL84=t6=UM_{ z`6_MJLKyYmO%tdA0CkH2y{gJfTZ(IN%9=;)X-pi4TSc?evYd+LQh``vBYL+%9zE37N|w+g~0V>Y#*taZ_{V)?QFcncfc($fkN%b1ckR;;vKp z_i5B8NtD0tu!t7Vtov3Zif7p%M6&jrzcgTZuz>CP0*?^FuD=NCaN4~rO6{kY@MNX1 zm9c>%s~W1jDf}<pH+J|SEF&q(!Lu1X(I}FcfKbLDF zNk4#kq$)g;!h1B~D-QB=n#k4-DwohdPo4OApM8Dty2B{WXz_jG=-U+JL(1VC@d!0; z@D&zulvn$Tgydtg57a5)Bqfh?h->mq>Eb6)j|9+@k$m1)1n3{&5jnZ1BREtS!Qvyf z>%uHP=5D%35})uyUBrq{d9E&ch|l;%U1VB5M+@aO_juO(c;nDtpji1|Il@oGX(#=8 z#uVg94)zlP;!7UoCv4&?p6MqNwKM)4c2LMO$-(@pA2h;QG)+-b>w!`uUqF%ghOhex zhxnH5{-VA99S9OBZ#e+e&tduxcuJ*9Q=<3*e?ZG0@famr^HG0c(0@{$;n*+#=`Y%f zpV?>-N!mHclEvY{edO6~2^Qq+o##>mzV#QbHsDnkc!fb^Xcs-w)#LoUguWtqO;?2K zFBybEyX-I1QCbt7f8{tMdiaey8AXEjJCtc#3(quS9{=FQvgl8LE_DkBziSks`rqg+ zS(&OhA;DLS_{@Jez$B8zzno_h?er@kh~wP5VWTcIft|1NeI|_T8t*iTJaL^*nXo1| zSPKBF2!mu$ZcH(bg;QT<5Y&U^g>ckdgbu+9AG$7kjtRROg8iCmP}yhf426V917V!< z6WyF6l))211yV41bttw#mVt77&1uCY&2e!j8ns}K=F`#Ab zA+kgf{}_SwEM^lj9YiT-M`Di*<>E+@BZl$(NSrAxL)#?YwN)hYtC7MWhVz?|V3HC1 zU8KmK0d`GF|Bbvz%4 z5}ox4pi7piS{xpY)0z_v$mNR*sH(5<9=M;x#nGaRR$<_YvxF_MaCTj@tFn@xj)o|l zY*0tN_+m6hJr%vFY(&H?3@u)nD(sGK;XEJ)f^r%t>?&<5slj6&E3>v5#sA5tYmeFT zsWs5K@d^BDj4*0$1C_X=_*4w0xsETzVDru3s92GsH5fb~%P%lMBKX=$In#|iBUYs8 zP3YH3Yi^HdTcQ#pTdkv+243)}u($fBXYntx#cZ_re*p}W(*3g6Ib0Nn-7%L-6GSX? zoCwoz2Yox32I>4s9N1|d9ucFo#sn%KpPKRc20A+T7ug#aUWU?mmA1`;ts+7!XB-_(6DxSBRoJyv1`7K=iVs>v zv}H9YrK#4cgv**UhSuiB0^E4YGbSO64K^U}?yzse2G5D(08jp>NfcDkK+sf;U@HF0omQ zocHEQY(qJM6D6_ym|cWv+ZAi5V}GH@IiFSTIavBIsA5zCD_^(c^^dUufhh4fr#i4L zckn=@9*HNo#v!^}pY*<|pd3kMWp%D{97V#5eV#(Oows!s=9?W3yZIM~XeaitBVJ@{ zd$DU)L!!gniqoG)15dt$y+H)>o_M_Y895u#IH+W3^`bv(kWpT~5)Vdyj)N0KzIa~p zTZZ<6f#!vpnG?WvFQT^uzBpSX@G-;%V_w3ulupvL98ueH!OP2hApwb^ub@^1C}IuX z^UkkwZX!N;AD1KwtJu#qiBJ{?3|v|%ay%Y`gM2U%;PjA3F7u5ztDW1n~wBPJ+mOlNTn5bp0(5T6nif*p;LCZ9K+HM{|gbR4A5`bNG(IbB9V+GRE*O z4@w3rzQ+wn`O*#>)YT*l_W1KN$@tzQ=poyi_Y~S<8yw^7$>99s9G`-ZIl;YCz?UEJ zv=r=$51CU0g64_|1Ew~~7k;9~Ayw{W90!g49FLNVlmp+Z&Ez)!f~~0{L!9IRslujz z393Z?rJbKxak z1JR!6o$11={{jjd5+viYZ}M+nK%vUwm8@G>SNM%gSQgjNE=fiWIXDX^39jQ22Ogp#xN8==xPiwEzTSukFb=cm(n*q} zl3Y0JSrMWXzA!Qp;!<=CbqNaXpU)DJS{tLh<%!MNBGjUzO2K;hy&jWYj?E9n(QD(Q zcwDwHnB@s6s>5qe{*~ zPYPuqf07MTEQqgXLw*Fa!wGH-;a*NGYbZ}}LMn&xLMOIITYkWd!@3nq6WEDR&OjX z$bm^F!+r5eK?E09O_|!*r`qG@HS>uaaSNC|AQ!;ZYHZn}ZF$^8td$MzGLYAY)6}{6 zOgrz&1q_Hc%9|VbTrMaQK;cQ1Ms^i20;lC+T9SBB9yV37oTO-8o(Bk;0z$h?hK=wh z!!~P5Gh(uqX*h5 zgSZ#}gfh{aLpzFF^nCP+%W&q!HD{3Y;ku6C@&c55?g%puce|_Q1oY*XJ3>bn8s&Xr zsjPK^S=)~-oiL34JQ&CH^#N$)Ig`c9J3+e)GH~&kmG9{cfKb8@bcRqU<%69?dtlVx@f1A_G!m^9C<~<7 zPh7^%F4*_Od1x1fRA+QScOyaSIV-~Zx?tW$@zE}DSKNx?Sh8KPBuP0m7EfNcuspKt zEGwVsLXNWh>T#&bRN-jGts^0Ei7Y~Ql6%28#N zDLavT5?zT3K8F^fl0&-!U%5EDD~3Ipi@JiVr*d^yD32;EW)7Tt7GHj(EARvk5<0d; z@zJhe-s$Kri%wJ|lkIA-sOGS4SP3`x?uKn%$4%Wt7XZ{<-LTW@L5UMj;O5dI2_VJmApEjugO>l&I z?l4=#ZF@l9-O1g1V61l;y>||T2Q?eLa&8y%(>);0m!P@w2k|dG@a^~TwI0y9_p-Ss zdRWSZJ;9U9xVooEHY^9J6fI;u7Ne~I?|$OR*bWsd`HP;AWvlo~Pk@}&?Cb?WL2^Z- z>4svXv=qwKL&_YPd z*NikY#jH}pmw=dA6ootuQfj5~TC;96EA~EJm)OjF_^f9Yb0CJ*F zv2`G31SiJ#eET5b)PF!@71NeSGWbi}G$wxJ-v?o4fAZ+9oWam_KZ7b(2JP@0 zN4@bgf{UTbJpO3m}tTs^-*QxSW};v*~vxJ+G&Qrz4_|A%WNM4gZMWi*KQCNzjl)751uy!O6N~Gqlx7A0`CoT zGA9LboeGznuzye)qc*dt2p*n)jnXB+8AT!r05rb{Hv4t1FT(QPkc8?CqH&lfB;{k` z1E_)1T>9|V7YjeV4V0UOuT}s=c#mcIa!#@6rt7FsR}b)jHX;xUyt)`N!=GO$#`+le zR5AF-$k&VEl?X7&2u(O|ks^OUi3rvLP11qO(@P-!gLzH~jHVD?SAr&?{Co-4xh;QE z0(B8C->$GRyjuYZ{6?5~JiK|_yA=E#iTYF;x*$>EG3>E4!8w&9k?-}aVp%`ic zn})%{NJIw?dDbZG|J|vQWTJzgIk;&UydTLRN|tsWKQc^&i4=Ze7_ea~dP|Dt--d}u zk;cX{=(cnaHeaQxb7>ho(-|gSuohoaR|c|7UQ!0Rn8iEF@NOrlQ(N55KbE2E9R9aV zn6+G!ltA2bI23Z8e7U-Ki_3?@tKJUJkRS^Z)fBcj$)hsz@Ls6s$j65R3wGiw!(sk( z=F}0`yBqZt=cUnK64N`_6w)_EBmG^zc>P7y&InyA)H!w6XzwWt6u9ow`}!b z=ST?uUR*R%r1b2K7fTDmlNVM}JUqW(_=G_v193@;}TSMZ)1tOj}oT%{%9|ahnua|3H?1`&jF~5_PG0R2dzF3&t255 zqt|nz`G71MgdzahKnGtK1;^qL{%aIG?nNk#RZ&>Zy%nOp1S}yV9IqBcwA!4d?7kIS zX((^I6@qmbzjP}sgfb7WT)Y(y=HVulgu@F@!C4@`bp$7l2KpF@-c!k;+qr5q(8nmA zGa44bt-M+O8qNDggMn}3v!mhv9K&I^fkDQhMS@&%F1roFB*?;zms>2$B6FYH$kG^jj_U~ha7}xv6v$!h_3J# zmP`P*-ov#MfNt)^D?8t8(T93&KeZcAhW^^7kRsBbtD_U<~+J$uR%pos&eY^-)x)0K2>j*Lx|E zJk=~o9^%T|L`fOxO#I~0X9`rb$Pw4`3mj&s2oOhSr9B$ z{WOZK5{?F|40}m+7DdpMzejVY=}?bfbN}fG_J4!Yc93Ikm2^+Bmt`+8Uwl+?T)HyoC*WCV(LI8ax{Ke zQu>0j1#Ju|DHx2a*lzM=>!`M7vC_0kcq-FMQazx_F^u;hT8x*(+=du~_ z{zQO2k`7&o;8imqS0eG4rm*RAGqBkqBR~Y>`_c^TSU8O9;joGYO^+5vh7SbilkrCE zk$JM(f@(YUPK)Aw_26JDAFUT1G+O{I_&Jp`8vuLkplFHf0Zt(XgSdK4gMiPMH#Y!5 zB=K7fV5DUJz5%|#6wu3UV)OT0)R@Y>8^K>`Jh>5jBOSFkUXQ2|Ki(*U^$a|BmO3Mq zzix!4&E$U@MR(xW&P~GR$VRO~d?f|>Lz)+70%V1{^28aSFzf?O&>6Y>Sd+-q^Uxqw z`oqoCH8)&uhezeDW7|w-SW;=wZ^A3IArj^7Ut*YcU*sV@1OJDMT;-pKZMH?SAZ-4d^j|yU&I$8_45lBdRwD^jTQmINmWEn}0CBJ{yvv zh|kRy&X^KZ;$QPEt$n>`_DVT#j)>QXqACq1{4*_bt%rGOTb(=|WpNpA0WJKF2j>8r zj|fm1UBM$v95femFp{I@V$h?|_CN5U1z3#^VEZ0n3-hEC%eq#fm zWy5oax#SIep7Tob#pBSY+Icsh2~%z+r98&-<+&Kw1P;F)Yf}#59*hgty2&HNz^-@S z4n@G(G(CV0{u9N! z?m(EZnh)IpTwcqE7K->lPtK*Htz-Kl zk4bBuF9P*ha+odqObvB5&zO&)&f(4TF~+%ka6Uqkx3jhY0^*JUb$l?Sum+Y;%aqRN z;S11W0nbPNF<|Kf3-Iisvun=H!IV$s-FLW{MEAVLM6(1v{ zCs%JJyBA>^R`KdZ;O*6Xa1j`O4WC;C@Us@A4g@9~oPDS8$6-{t+vTm%^wceZJnl}I ztM>wHW zC%IStdWugh#*FOZtBWBQcC&p6W^0d>7&f3!%(I26Qvwybdm1B3QO4TCkSB<0?_UDO zf0oZI0T(>aCSXt`Hm2VL(eNS{-h;xI*nN-aV0{@4rQ&D_a>?9DZ-na=K6nqlW0s@YH@s*$=KovXvm6Wm9iLc^ zRs5bWEeD$U0gbxcY%@l|jW}urcGgd*k#3?0UbzCE#PfK>(Nln&{VPNqG88{wfne}O zl*W?v?$~Be^d-((iQRk|<&o-uQHyEzn`9I_Z(Io{!0)_!B_`_+KC@CJSpEdDTp{T= z@!q=Hr>Q}m-1&=bt6-S^E!DqSUQZFF{{!k2bzYl!75qp4@{U!oIj*2MnpfAr4wg%M zjelGvvK`k^+UlVxb~PddJiSF&-3U;3;&Sn7fvbZ8rT4XqhSapM@1tq!0)O?NZqVDn zz)GhJQw)L1|D=v(N)2J+=hi@$ z1@NME0LOo<5g|!IXdaGX7S>kO&r$hIaKg4)B*Cb*wOpl6U*UGo5H4N|=@!cK*TT#Q z3zP!Yb7w_cJ}zs**ApzM2sti!t!?0NH@08CI!GGHxIEhmI5v)u9e`K}A*CfYP@T|U zb0$KMLnGW!3Kz|F!p=5x-2HHtSOVb=v~%yrg&uUXC1T|T_lu-LyY~}dQORR{>Ka+^ z-*N#GP%Tpy0Kc2>G5+uNOay_iW^ipU^pdK!Ptpb;*KEL-6!7W|*qMdAcZ2An z_XBCX@)~O!p&$Em^hU_p0i3@PE{%bxw7}kpFt6N*?On|KHj0kXB_NOrxFxw! zK)9S=u41krYSw$BKDYZGL^NEDiB|7DM! z9mRp0A%1Q}VOv}P6sb1aXdby4hQJsUTICU5~tbq?FZo z5PSW*Z61LCal-$Vbso@BURMIvuVvKG3`MAn>PP~C1d_qv0@w}&7q9_AAl_7rFvX$> z8DZiIo5Wex5Ie+U`?6kouR@}OK!x5UMDG#;i;W!vb{vRfhmh~Se`X|3&KZvQUoZFG zci(-tNa8%+Lq?Kpn_;$VMk)19`Z77_e$Gm88K&&n*K7&v7}+on$R8{9^O(Un3dI|J zlEnE)CSK7_5NafO=d_53F#YC}q;Cthaou>CF&}C%!6Yj1*OkK|&|AaEhCapvS-h0@)XW5o$#CFsgnZZwxsw+IsO-}25P9&Bbx=^`k>|CmXHz4j)}1ic5PYlxD##cbRx>9&~5(eI^T zG3V$9^1))bnm^ECw1MB6#jx#jr0)vE&-Vv~_8Cx6Xxj>SDFS7-Jp(k6y^nMXBqLA9 zsKD0q#MIZXOY*UFTf#nnLa8M03`uCxw3A5Vq)lWAH@3O5VF~Q;|57Z@n8?VzC7jcr zO6XGX@&BZ={+TDaOCjU)O`(c*5XCu5IYSrlZH!FAp~q&=7Rs)rJOV9Zqm9$N==jBy zQN;zn(9P(S@*T899$E%rT^eab=dL0BbB7xXrWM+#i996pm(j^ezS}=w(IwTS2d^^A zEVq|gAuw`xmsy>H*GAgBDI%}f5CdN8WXN*BYrVX>9F!@hsZ8?(P`MmjE|C+*2 zlZ--8gi#36!EKb}6~Nvm-Hr74&6F_87bY+ULIJ;+X^Tu>fzWR&`8XcODX>(ofY;n6 z)hoc_9h{M^QSF+&*;W?YDH$svD`nDuCDdXUmD+o6_w>l@mEcM_pINGdlWmZyLaJA? zkd=`d*TZQ$Ua;jpRpMF2<$aF~Ud5F6M%t>2-F4LaWc?~eyQNb>e~wAvYO8%%HRY7wQlClDj^li})o@sjtwycqM5M7d@>b3XlYg#8(tJ`P z*6{jq%EnY%+ICt7t^rEUNZ}ezkh73?v<$KSa)$d6=$ss1gWTl2e7nX&0Noh-qh~xcewKPtmG}elk{ncs5Hn?sfgm?z4dhTwImg@ zUVo9k#cbC%GP;<1(O)Aa?KGcjZJe{PW-BZZYay z-%`vI;Cy)9pO!Z<-!SWcR}6H^#0^%f;P3c9>RdQAigJ8UjSNZt2ysvK2C(ZNe7gSN^!Th;Q6=!j~gZ^kqw9GAq+ifYurF0fa zDlbBZEKk7Mo|B}M!1W?D!tc)5)C;d0E7tu0d6U=9f%-zI}#!`{!5bjiil5x_oi3%v_rRx^Ns~Jvx+ld@LWy~bpN^1ihW$G3N*hypyHZ++ukS%HrDmS;l$Y${! zZB%t6X)DJ_XUW(KmUeM^3tM=kW*!`Sw$oT6@LuU?*<_%Pmf%*zuMd&gHcslcS|LeY zY0Exon|!h0uf>c4Hg22MG5KMN@CzWY5i9E`yOWwCmnNVcuKIgZZI9(WWYRX6vPVR= z0rrnd**3QQF^Zb++1axS8v7e0#k0i75fU+5L4)-gWKV=C(V4uPmd>&#R0}5_iJyJ}+H% z0wXWT&v$a|8z|FuS}Ey+DA;tZ8j?5Km{9szzFczCjXy!0MzwVe<FPvomIApED|+6Bn`OuFr2i+}F?aCAaM zZh_AS{V!ztF7{-EtlGsIj+7(2tep5fdg0gPV8=hmm!<7)OhZTe@)d3e;xsXEHyk5F zcXKF>l^MG^SjNeU-H7U5aZ2uoJj0Fr&K8&CQ#-~4J!%^Ncu6Wp31N~`O7p?Ridj~x zrpyAFP|iciWT(1Pmy{lmlAYyT9}AsCxrtQ{GzJ;popOlG6e+Dnq-&g+6v>knz}ZyE ztAHz;CLdQo!GGnHk)yb*)mK3EUS}kU8Y3XamH+aT$%X2-K*9G7X30vxx}BO-;r!^6MZ~Ytixc& z@WM0`G*jB_VY}ax9{h34qGY@V=#hdw2-Jb@`@%HLiM4H-wO_UW!7F8tdC?ZRU98vHo@$0 zD=v@Cob7)iU+=|~N61%y9nme}XvXH7HJ>Yk_NiqIS?Q`fmnQS}!QOoezGFg;2BVbk zLy|C0YWH!9%%>PgieRPne%RE762BkyuEnO^x}mYgXO1rF5}C9gmS7nfDe^VWGQ#z= z&}CXK<@9hUl_IAY8iNd{a7PY4$$vf8j3=3D@xWM zutJd)ZaKgruP0Tbbz)?C0EV(ytb?%h8%WLare?e4S(H~`GhaH$OKGX|!zF6v6zaWw zJR}TdR_$b?Y&ZxIZ;}HC*}Bd0`9UiyVGH&7H8aoTfk{hmbE3=RmfNLPM5x(>?an~F zEo^OE5k@Omr@uo!IK=Mkl;T5{+p&w*5CUN^A)g;&oV(?_Lrkq)Jcn6=O6hx;%T1Mx z(67BR<1h!dG09lED(sRc0k+l{?VHxcMj9cK?ym+(i|eyJV$#gDcz@{}6l$`G%gFWXUd0*bE3>{Dvn5zg^yN_J3Vnl!n2 zgh!$p`Su8yeB5aw^s0wXg)$5tFwipVQ!68nLJLmHdq)ArQ&f*<8(_+hA`Uq%HKYcg z@tpzIF-ZPdilq6yiaMpwF~lh6NHdNY)EkEjmUYrGWa<~SF?HG>6X^qMUFJ(l4G4fJ zmySX1ugKkFEP9>9RKudxOYdqbUZr9>r$nN>UQKfiGP4@8driqzGP1_nYU_E&XOu}* z4>QuE20g|`>0bl;bVCYjxUc_77S(Wf`J6IO=mUk(V7ynu=)WKdY*Xf?^Kl;IzT`U- zKBoib@_A}-#0Z0K$>if!M#^pSl*w=ATIa_FXyqDa@hhi3;&=3UEB~6J$}Fokb&l^2 z-E5KnBHtW`)PEzXwVWz{r7CaLb#MEG0e9rpTIk(f+Q`rtC9=I14)kwukS-nvP_2zn zZBV}#rEle4EvL`lCFO+G8`&h(i1FL9!ldRTVC<0k zlVC%L5RBY|9zw<`HYi+%oMJCgBsm3d-qPju+;1l(rzp;a=oDM$l&hyO{C3fo+Ye-D zOP+@LYAuhSwz7M*AxoDWQxu#=71@C9S9gmd(?`e^Lxy8s7nnyoS$G-%ik5w+8Fq~P z`84z~mI}zyfsyPpki$6n!5IeamN92IJL2WNGr&j!Wjrc;H8O1l&_ua<#>$9GB137o z4W`{%8Mo)1%-pW&kc(buMMRkB^sbSGJ< zOcRH#{%!nRb`NPdZ>1$aLLuFu2Q&)(b|H^S>II1TW0Wx-4rJ5?i2394)&&+|^krm? zmK0pIV%@~)H1k!xe_%W3>AW|Jh^s`DTvjeRcvuT>PKz|-M@tvkrwcu1wCz|UL}p$A z&O&7`jxii6lEv6zM{KJ>c%LHRN8fRim5#Pmla-KRDwr~{A2PzV6Wvjdsw$;I292Gw zF1tdN4#hTEE;7S`v^CO;OY$zmw_r2l(C8ociaF zBf%pL*YSj+PLH@%j&{pOH-Lb6nN|nlCCHao*oZ_qcLO4sB)M0uXM_cYegy2<_e7ErK=n$9!kY%2$7f;bd@S^*25*I$;WkY3hCs`RiG1xluqu9+ctx2(>WMr_dR>QV+-|TO@mZA9 z6&&c-BDGljU3UfBXNLFnK|wYt|28{QGe_=U!+`anAVnGuy6%>P z^J$dE#?!bWU1j-Y%ahoR`byF5$Xq%XBLGn-d06h>U^TnTxCYj?hlJN#onlnIKsUw@ z(Wa|MW%@O4nvaogbTZP7BFE!=>V$ldU@yD^XHOC{jH_&^xCq(oB_kUlA-%+=0)TmYX6Qe9tFCjP3L+D&u*^?`cZs1!t~l%&xpK*hkA0R3y1W7F!C~sb`Z>9EnM-+pe~ZnK$F~8}pUsI4 zY_QpOKkUCCiPw3Y7$~(Dt@OtS(TJ{x{W_;HJAF+ICQ)V7zG?ibM}g3Skz$`HF^04j>o(BeE6EO$WZVhe^qGq!z;!DAiZOva6g4FG@04)9pVg zYlwRjhAVt)m}%YO=A>`fPf3U~YMLQBw4$FWa=E1vt!DI-U#f#s{e_e?@<#hhN0DwGO6xQMzHzW&E*0pozhlWY92jU&MTakHH_qk2U_NVU2{lJY6@ zZ(HMA|M3#p2og;OO7>^G!cGcOsg&Gmw8EW!N>)H4?FHhNBJ(c8DNL4&jciq+ JY`tN5{sr2s{#gJ3 delta 33928 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 NxaFE4?~K>-{{e86yt4oR From 6353b3e6ecd9b660711a49643980dad39739b332 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 27 Aug 2019 21:22:55 +0400 Subject: [PATCH 36/86] Fix contact import --- .../contents.xcworkspacedata | 2 +- .../project.pbxproj | 16 ++++++++++++++++ .../TelegramUI/DeviceContactDataManager.swift | 5 ++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Telegram-iOS.xcworkspace/contents.xcworkspacedata b/Telegram-iOS.xcworkspace/contents.xcworkspacedata index 176a24b7fc..72d25624a6 100644 --- a/Telegram-iOS.xcworkspace/contents.xcworkspacedata +++ b/Telegram-iOS.xcworkspace/contents.xcworkspacedata @@ -552,7 +552,7 @@ location = "group:submodules/SettingsUI/SettingsUI_Xcode.xcodeproj"> + location = "group:submodules/MessageReactionListUI/MessageReactionListUI_Xcode.xcodeproj"> Date: Tue, 27 Aug 2019 20:56:45 +0300 Subject: [PATCH 37/86] remove assertion [skip ci] --- .../TelegramCore/TelegramCore/BlockedPeersContext.swift | 1 - .../TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift b/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift index 37dbd9f7e3..905a52acc5 100644 --- a/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift +++ b/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift @@ -57,7 +57,6 @@ public final class BlockedPeersContext { } deinit { - assert(Queue.mainQueue().isCurrent()) self.disposable.dispose() } diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 63bc08ccc6..93c25de55a 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -231,6 +231,8 @@ D033FEB41E61F3C000644997 /* ReportPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D033FEB21E61F3C000644997 /* ReportPeer.swift */; }; D033FEB61E61F3F900644997 /* BlockedPeers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D033FEB51E61F3F900644997 /* BlockedPeers.swift */; }; D033FEB71E61F3F900644997 /* BlockedPeers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D033FEB51E61F3F900644997 /* BlockedPeers.swift */; }; + D03413F1231323CE00B555F3 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B5230FBB2B005C2E08 /* Theme.swift */; }; + D03413F3231325B300B555F3 /* Themes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B3230FB70B005C2E08 /* Themes.swift */; }; D035732F22B5C24F00F0920D /* TelegramApi.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D035732E22B5C24F00F0920D /* TelegramApi.framework */; }; D0380DBA204EF306000414AB /* MessageMediaPreuploadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0380DB9204EF306000414AB /* MessageMediaPreuploadManager.swift */; }; D0380DBB204EF306000414AB /* MessageMediaPreuploadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0380DB9204EF306000414AB /* MessageMediaPreuploadManager.swift */; }; @@ -2525,6 +2527,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D03413F3231325B300B555F3 /* Themes.swift in Sources */, + D03413F1231323CE00B555F3 /* Theme.swift in Sources */, D04D21382306ECF600609388 /* FormatPhoneNumber.m in Sources */, D021E7E82306EC03002F8BD1 /* OutgoingScheduleInfoMessageAttribute.swift in Sources */, D021E7E92306EC03002F8BD1 /* ScheduledMessages.swift in Sources */, From 357f8986306fa5bfa683c6552103f0e82310d885 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 27 Aug 2019 22:11:59 +0400 Subject: [PATCH 38/86] Fix layer --- submodules/TelegramCore/TelegramCore/Serialization.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/TelegramCore/TelegramCore/Serialization.swift b/submodules/TelegramCore/TelegramCore/Serialization.swift index 06a094ff21..acd34716b8 100644 --- a/submodules/TelegramCore/TelegramCore/Serialization.swift +++ b/submodules/TelegramCore/TelegramCore/Serialization.swift @@ -220,7 +220,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 105 + return 106 } public func parseMessage(_ data: Data!) -> Any! { From 01e5c3db3cd65c726b7227d97b60c9ec14077a22 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 27 Aug 2019 21:16:45 +0300 Subject: [PATCH 39/86] Cloud themes improvements --- Telegram-iOS/en.lproj/Localizable.strings | 23 +- .../Sources/InstantPageLayout.swift | 2 +- .../Sources/ItemListController.swift | 5 +- .../SettingsUI/Sources/DebugController.swift | 36 +- .../Themes/CreateThemeController.swift | 2 +- .../Themes/ThemeAccentColorController.swift | 7 +- .../ThemeAccentColorControllerNode.swift | 12 +- .../Themes/ThemePreviewController.swift | 74 +- .../Themes/ThemePreviewControllerNode.swift | 7 +- .../Themes/ThemeSettingsController.swift | 36 +- .../Themes/ThemeSettingsThemeItem.swift | 163 +- .../AccountIntermediateState.swift | 7 +- .../AccountStateManagementUtils.swift | 29 +- .../TelegramCore/ApplyUpdateMessage.swift | 4 +- .../TelegramCore/StickerManagement.swift | 36 +- .../TelegramCore/TelegramMediaWebpage.swift | 31 +- .../TelegramCore/TelegramCore/Themes.swift | 13 +- .../DefaultDarkPresentationTheme.swift | 1 + .../DefaultDarkTintedPresentationTheme.swift | 1 + .../Sources/DefaultDayPresentationTheme.swift | 1 + .../Sources/MakePresentationTheme.swift | 47 +- .../Sources/PresentationData.swift | 4 +- .../Sources/PresentationStrings.swift | 6473 +++++++++-------- .../Sources/PresentationTheme.swift | 6 +- .../Sources/PresentationThemeCodable.swift | 201 +- ...der.swift => PresentationThemeCoder.swift} | 453 +- .../Sources/PresentationThemeEncoder.swift | 274 - .../project.pbxproj | 12 +- .../TelegramUI/BundleResource.swift | 82 - .../TelegramUI/ChatBotInfoItem.swift | 2 +- .../TelegramUI/ChatController.swift | 7 + .../ChatControllerInteraction.swift | 6 +- .../ChatMessageAttachedContentNode.swift | 14 +- .../ChatMessageBubbleContentNode.swift | 1 + .../ChatMessageBubbleItemNode.swift | 10 +- .../ChatMessageInteractiveMediaNode.swift | 24 +- .../ChatMessageTextBubbleContentNode.swift | 2 +- .../ChatMessageWebpageBubbleContentNode.swift | 28 +- .../ChatRecentActionsControllerNode.swift | 1 + .../TelegramUI/FetchVideoThumbnail.swift | 479 -- .../TelegramUI/OpenChatMessage.swift | 30 +- .../TelegramUI/OpenResolvedUrl.swift | 43 +- .../OverlayPlayerControllerNode.swift | 1 + .../PeerMediaCollectionController.swift | 1 + .../Resources/PresentationStrings.mapping | Bin 124717 -> 124846 bytes .../TelegramAccountAuxiliaryMethods.swift | 2 - .../TelegramUI/WallpaperPreviewMedia.swift | 2 +- .../WebpagePreviewAccessoryPanelNode.swift | 2 + .../project.pbxproj | 12 +- .../Sources/PostboxKeys.swift | 2 + .../Sources/PresentationThemeSettings.swift | 63 +- .../Sources/WallpaperResources.swift | 127 + .../libtgvoip_Xcode.xcodeproj/project.pbxproj | 5 + 53 files changed, 4455 insertions(+), 4451 deletions(-) rename submodules/TelegramPresentationData/Sources/{PresentationThemeDecoder.swift => PresentationThemeCoder.swift} (53%) delete mode 100644 submodules/TelegramPresentationData/Sources/PresentationThemeEncoder.swift delete mode 100644 submodules/TelegramUI/TelegramUI/BundleResource.swift delete mode 100644 submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index a3d042db4f..f1a91c3080 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4651,15 +4651,22 @@ Any member of this group will be able to see messages in the channel."; "Appearance.ThemePreview.ChatList.8.Name" = "What"; "Appearance.ThemePreview.ChatList.8.Text" = "Hola!"; -"Appearance.ThemePreview.Chat.1.Text" = "Reminds me of a Chinese proverb: the best time to plant a tree was 20 years ago. The second best time is now."; -"Appearance.ThemePreview.Chat.1.ReplyName" = "Alex Cassio"; -"Appearance.ThemePreview.Chat.1.ReplyText" = "Mark Twain said that ☝️"; - -"Appearance.ThemePreview.Chat.2.Text" = "Mark Twain said that ☝️"; -"Appearance.ThemePreview.Chat.3.Text" = "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do, so throw off the bowlines, sail away from safe harboor, catch the trade winds in your sails."; - -"Appearance.ThemePreview.Chat.4.Text" = "Nearly missed the sunrise."; +"Appearance.ThemePreview.Chat.1.Text" = "Does he want me to, to turn from the right or turn from the left? 🤔"; +"Appearance.ThemePreview.Chat.2.ReplyName" = "Bob Harris"; +"Appearance.ThemePreview.Chat.2.Text" = "Right side. And, uh, with intensity."; +"Appearance.ThemePreview.Chat.3.Text" = "Is that everything? It seemed like he said quite a bit more than that. 😯"; "GroupInfo.Permissions.SlowmodeValue.Off" = "Off"; "Undo.ScheduledMessagesCleared" = "Scheduled messages cleared"; + +"Appearance.CreateTheme" = "Create New Theme"; + +"Conversation.Theme" = "Color Theme"; +"Conversation.ViewTheme" = "VIEW THEME"; + +"CreateTheme.Title" = "Publish Theme"; +"CreateTheme.Preview" = "PREVIEW"; +"CreateTheme.Title" = "Title"; +"CreateTheme.ShortLink" = "Short Link"; +"CreateTheme.ShortLinkInfo" = "Short Link"; diff --git a/submodules/InstantPageUI/Sources/InstantPageLayout.swift b/submodules/InstantPageUI/Sources/InstantPageLayout.swift index 1b492cd355..a6340316bc 100644 --- a/submodules/InstantPageUI/Sources/InstantPageLayout.swift +++ b/submodules/InstantPageUI/Sources/InstantPageLayout.swift @@ -627,7 +627,7 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins let frame = CGRect(origin: CGPoint(x: floor((boundingWidth - size.width) / 2.0), y: 0.0), size: size) let item: InstantPageItem if let url = url, let coverId = coverId, let image = media[coverId] as? TelegramMediaImage { - let loadedContent = TelegramMediaWebpageLoadedContent(url: url, displayUrl: url, hash: 0, type: "video", websiteName: nil, title: nil, text: nil, embedUrl: url, embedType: "video", embedSize: size, duration: nil, author: nil, image: image, file: nil, instantPage: nil) + let loadedContent = TelegramMediaWebpageLoadedContent(url: url, displayUrl: url, hash: 0, type: "video", websiteName: nil, title: nil, text: nil, embedUrl: url, embedType: "video", embedSize: size, duration: nil, author: nil, image: image, file: nil, files: nil, instantPage: nil) let content = TelegramMediaWebpageContent.Loaded(loadedContent) item = InstantPageImageItem(frame: frame, webPage: webpage, media: InstantPageMedia(index: embedIndex, media: TelegramMediaWebpage(webpageId: MediaId(namespace: Namespaces.Media.LocalWebpage, id: -1), content: content), url: nil, caption: nil, credit: nil), attributes: [], interactive: true, roundCorners: false, fit: false) diff --git a/submodules/ItemListUI/Sources/ItemListController.swift b/submodules/ItemListUI/Sources/ItemListController.swift index 81344e6c05..45d40d824c 100644 --- a/submodules/ItemListUI/Sources/ItemListController.swift +++ b/submodules/ItemListUI/Sources/ItemListController.swift @@ -295,7 +295,8 @@ open class ItemListController: ViewController, KeyShor } strongSelf.navigationButtonActions = (left: controllerState.leftNavigationButton?.action, right: controllerState.rightNavigationButton?.action, secondaryRight: controllerState.secondaryRightNavigationButton?.action) - if strongSelf.leftNavigationButtonTitleAndStyle?.0 != controllerState.leftNavigationButton?.content || strongSelf.leftNavigationButtonTitleAndStyle?.1 != controllerState.leftNavigationButton?.style { + let themeUpdated = strongSelf.theme !== controllerState.theme + if strongSelf.leftNavigationButtonTitleAndStyle?.0 != controllerState.leftNavigationButton?.content || strongSelf.leftNavigationButtonTitleAndStyle?.1 != controllerState.leftNavigationButton?.style || themeUpdated { if let leftNavigationButton = controllerState.leftNavigationButton { let item: UIBarButtonItem switch leftNavigationButton.content { @@ -345,7 +346,7 @@ open class ItemListController: ViewController, KeyShor } } - if updateRightButtonItems { + if updateRightButtonItems || themeUpdated { strongSelf.rightNavigationButtonTitleAndStyle = rightNavigationButtonTitleAndStyle.map { ($0.0, $0.1) } var items: [UIBarButtonItem] = [] var index = 0 diff --git a/submodules/SettingsUI/Sources/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift index 0c998414cc..41bfdc3e79 100644 --- a/submodules/SettingsUI/Sources/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -60,7 +60,6 @@ private enum DebugControllerEntry: ItemListNodeEntry { case optimizeDatabase(PresentationTheme) case photoPreview(PresentationTheme, Bool) case knockoutWallpaper(PresentationTheme, Bool) - case exportTheme(PresentationTheme) case versionInfo(PresentationTheme) var section: ItemListSectionId { @@ -73,7 +72,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .enableRaiseToSpeak, .keepChatNavigationStack, .skipReadHistory, .crashOnSlowQueries: return DebugControllerSection.experiments.rawValue - case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .exportTheme: + case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .optimizeDatabase, .photoPreview, .knockoutWallpaper: return DebugControllerSection.experiments.rawValue case .versionInfo: return DebugControllerSection.info.rawValue @@ -122,10 +121,8 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 18 case .knockoutWallpaper: return 19 - case .exportTheme: - return 20 case .versionInfo: - return 21 + return 20 } } @@ -476,35 +473,6 @@ private enum DebugControllerEntry: ItemListNodeEntry { }) }).start() }) - case let .exportTheme(theme): - return ItemListActionItem(theme: theme, title: "Export Theme", kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { - guard let context = arguments.context else { - return - } - - var randomId: Int64 = 0 - arc4random_buf(&randomId, 8) - let path = NSTemporaryDirectory() + "\(randomId)" - - let encoder = PresentationThemeEncoder() - guard let strings = try? encoder.encode(theme), let _ = try? strings.write(toFile: path, atomically: true, encoding: .utf8) else { - return - } - - let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled])) - controller.peerSelected = { [weak controller] peerId in - if let strongController = controller { - strongController.dismiss() - - let id = arc4random64() - let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: id), partialReference: nil, resource: LocalFileReferenceMediaResource(localFilePath: path, randomId: id), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/text", size: nil, attributes: [.FileName(fileName: "\(theme.name.string).tgios-theme")]) - let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: nil, localGroupingKey: nil) - - let _ = enqueueMessages(account: context.account, peerId: peerId, messages: [message]).start() - } - } - arguments.presentController(controller, ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet)) - }) case let .versionInfo(theme): let bundle = Bundle.main let bundleId = bundle.bundleIdentifier ?? "" diff --git a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift index 06c9b2d5c8..a6ed034380 100644 --- a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift @@ -143,7 +143,7 @@ private func createThemeControllerEntries(presentationData: PresentationData, th } public func createThemeController(context: AccountContext, theme: PresentationTheme, resource: MediaResource) -> ViewController { - let initialState = CreateThemeControllerState(mode: .create, title: "", slug: "") + let initialState = CreateThemeControllerState(mode: .create, title: theme.name.string, slug: "") let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) let updateState: ((CreateThemeControllerState) -> CreateThemeControllerState) -> Void = { f in diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift index 16dbd4b8a5..cd5c3e6d9a 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift @@ -39,7 +39,7 @@ final class ThemeAccentColorController: ViewController { color = defaultDayAccentColor } self.initialColor = color - self.initialTheme = makePresentationTheme(themeReference: currentTheme, accentColor: color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, preview: true) + self.initialTheme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: currentTheme, accentColor: color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, preview: true) self.presentationData = context.sharedContext.currentPresentationData.with { $0 } @@ -75,14 +75,15 @@ final class ThemeAccentColorController: ViewController { } }, apply: { [weak self] in if let strongSelf = self { - let _ = (updatePresentationThemeSettingsInteractively(accountManager: strongSelf.context.sharedContext.accountManager, { current in + let context = strongSelf.context + let _ = (updatePresentationThemeSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in var themeSpecificAccentColors = current.themeSpecificAccentColors let color = PresentationThemeAccentColor(baseColor: .custom, value: Int32(bitPattern: strongSelf.controllerNode.color)) themeSpecificAccentColors[current.theme.index] = color var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers - let theme = makePresentationTheme(themeReference: strongSelf.currentTheme, accentColor: UIColor(rgb: strongSelf.controllerNode.color), serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: color.baseColor) + let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: strongSelf.currentTheme, accentColor: UIColor(rgb: strongSelf.controllerNode.color), serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: color.baseColor) var chatWallpaper = current.chatWallpaper if let wallpaper = current.themeSpecificChatWallpapers[current.theme.index], wallpaper.hasWallpaper { } else { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index 3416696089..ccff1a8524 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -103,7 +103,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.colorDisposable = (self.colorValue.get() |> deliverOn(Queue.concurrentDefaultQueue()) |> map { color -> PresentationTheme in - let theme = makePresentationTheme(themeReference: currentTheme, accentColor: color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, preview: true) + let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: currentTheme, accentColor: color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, preview: true) let wallpaper = context.sharedContext.currentPresentationData.with { $0 }.chatWallpaper let _ = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: theme, wallpaper: wallpaper) @@ -244,11 +244,11 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate let otherPeerId = self.context.account.peerId var peers = SimpleDictionary() var messages = SimpleDictionary() - peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) - messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) @@ -268,10 +268,6 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local))) - //items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)), controllerInteraction: controllerInteraction, content: .message(message: , read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false)) - - let message5 = Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message5, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let messageNodes = self.messageNodes { diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index 99b8ec862f..ad45c14389 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -13,6 +13,7 @@ import CounterContollerTitleView public enum ThemePreviewSource { case theme(TelegramTheme) + case slug(String, TelegramMediaFile) case media(AnyMediaReference) } @@ -20,6 +21,7 @@ public final class ThemePreviewController: ViewController { private let context: AccountContext private let previewTheme: PresentationTheme private let source: ThemePreviewSource + private let theme = Promise() private var controllerNode: ThemePreviewControllerNode { return self.displayNode as! ThemePreviewControllerNode @@ -42,7 +44,16 @@ public final class ThemePreviewController: ViewController { let themeName: String if case let .theme(theme) = source { themeName = theme.title + self.theme.set(.single(theme)) + } else if case let .slug(slug, _) = source { + self.theme.set(getTheme(account: context.account, slug: slug) + |> map(Optional.init) + |> `catch` { _ -> Signal in + return .single(nil) + }) + themeName = previewTheme.name.string } else { + self.theme.set(.single(nil)) themeName = previewTheme.name.string } @@ -53,6 +64,7 @@ public final class ThemePreviewController: ViewController { } else { self.title = themeName } + self.statusBar.statusBarStyle = self.previewTheme.rootController.statusBarStyle.style self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) @@ -95,25 +107,50 @@ public final class ThemePreviewController: ViewController { } }, apply: { [weak self] in if let strongSelf = self { - let theme: PresentationThemeReference - if case let .theme(info) = strongSelf.source { - theme = .cloud(info) - } else { - theme = .builtin(.day) + let previewTheme = strongSelf.previewTheme + let theme: Signal + + switch strongSelf.source { + case .theme, .slug: + theme = strongSelf.theme.get() + |> take(1) + |> map { theme in + if let theme = theme { + return .cloud(theme) + } else { + return nil + } + } + case .media: + if let strings = encodePresentationTheme(previewTheme), let data = strings.data(using: .utf8) { + let resource = LocalFileMediaResource(fileId: arc4random64()) + strongSelf.context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) + + theme = .single(.local(PresentationLocalTheme(title: previewTheme.name.string, resource: resource))) + } else { + theme = .single(.builtin(.dayClassic)) + } } - let _ = (strongSelf.context.sharedContext.accountManager.transaction { transaction -> Void in - transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in - let current: PresentationThemeSettings - if let entry = entry as? PresentationThemeSettings { - current = entry - } else { - current = PresentationThemeSettings.defaultSettings - } - - return PresentationThemeSettings(chatWallpaper: .color(0xffffff), theme: theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) - }) - }).start(completed: { [weak self] in + let signal = theme + |> mapToSignal { theme -> Signal in + guard let theme = theme else { + return .complete() + } + return strongSelf.context.sharedContext.accountManager.transaction { transaction -> Void in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in + let current: PresentationThemeSettings + if let entry = entry as? PresentationThemeSettings { + current = entry + } else { + current = PresentationThemeSettings.defaultSettings + } + return PresentationThemeSettings(chatWallpaper: previewTheme.chat.defaultWallpaper, theme: theme, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: current.themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + }) + } + } + + let _ = (signal |> deliverOnMainQueue).start(completed: { [weak self] in if let strongSelf = self { strongSelf.dismiss() } @@ -147,6 +184,9 @@ public final class ThemePreviewController: ViewController { case let .theme(theme): subject = .url("https://t.me/addtheme/\(theme.slug)") preferredAction = .default + case let .slug(slug, _): + subject = .url("https://t.me/addtheme/\(slug)") + preferredAction = .default case let .media(media): subject = .media(media) preferredAction = .custom(action: ShareControllerAction(title: "Publish", action: { [weak self] in diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 40ad17ddcb..8d59494542 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -195,7 +195,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) - messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_ReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) @@ -215,11 +215,6 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local))) - //items.append(ChatMessageItem(presentationData: chatPresentationData, context: self.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local)), controllerInteraction: controllerInteraction, content: .message(message: , read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: false)) - - let message5 = Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message5, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let messageNodes = self.messageNodes { for i in 0 ..< items.count { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index 85f5b1fc3d..c694ba0a0e 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -21,8 +21,9 @@ private final class ThemeSettingsControllerArguments { let toggleLargeEmoji: (Bool) -> Void let disableAnimations: (Bool) -> Void let selectAppIcon: (String) -> Void + let presentThemeMenu: (PresentationThemeReference) -> Void - init(context: AccountContext, selectTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void) { + init(context: AccountContext, selectTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void, presentThemeMenu: @escaping (PresentationThemeReference) -> Void) { self.context = context self.selectTheme = selectTheme self.selectFontSize = selectFontSize @@ -33,6 +34,7 @@ private final class ThemeSettingsControllerArguments { self.toggleLargeEmoji = toggleLargeEmoji self.disableAnimations = disableAnimations self.selectAppIcon = selectAppIcon + self.presentThemeMenu = presentThemeMenu } } @@ -263,10 +265,10 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { case let .themeListHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .themeItem(theme, strings, themes, currentTheme, themeSpecificAccentColors, currentColor): - return ThemeSettingsThemeItem(theme: theme, strings: strings, sectionId: self.section, themes: themes, themeSpecificAccentColors: themeSpecificAccentColors, currentTheme: currentTheme, updatedTheme: { theme in + return ThemeSettingsThemeItem(context: arguments.context, theme: theme, strings: strings, sectionId: self.section, themes: themes, themeSpecificAccentColors: themeSpecificAccentColors, currentTheme: currentTheme, updatedTheme: { theme in arguments.selectTheme(theme) - }, currentColor: currentColor, updatedColor: { color in - arguments.selectAccentColor(color) + }, longTapped: { theme in + }) case let .iconHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) @@ -380,7 +382,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The chatWallpaper = themeSpecificWallpaper } else { let accentColor = current.themeSpecificAccentColors[theme.index]?.color - let theme = makePresentationTheme(themeReference: theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: current.themeSpecificAccentColors[theme.index]?.baseColor ?? .blue) + let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: current.themeSpecificAccentColors[theme.index]?.baseColor ?? .blue) chatWallpaper = theme.chat.defaultWallpaper } @@ -400,7 +402,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers - let theme = makePresentationTheme(themeReference: current.theme, accentColor: color.color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: color.baseColor) + let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: current.theme, accentColor: color.color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: color.baseColor) var chatWallpaper = current.chatWallpaper if let wallpaper = current.themeSpecificChatWallpapers[current.theme.index], wallpaper.hasWallpaper { } else { @@ -427,6 +429,8 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The currentAppIconName.set(name) context.sharedContext.applicationBindings.requestSetAlternateIconName(name, { _ in }) + }, presentThemeMenu: { theme in + }) let savedThemes = telegramThemes(postbox: context.account.postbox, network: context.account.network) @@ -444,7 +448,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The let disableAnimations = presentationData.disableAnimations let accentColor = settings.themeSpecificAccentColors[settings.theme.index]?.color - let theme = makePresentationTheme(themeReference: settings.theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: settings.themeSpecificAccentColors[settings.theme.index]?.baseColor ?? .blue, preview: true) + let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: settings.theme, accentColor: accentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: settings.themeSpecificAccentColors[settings.theme.index]?.baseColor ?? .blue, preview: true) let wallpaper: TelegramWallpaper if let themeSpecificWallpaper = settings.themeSpecificChatWallpapers[settings.theme.index] { @@ -458,7 +462,11 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The }) let defaultThemes: [PresentationThemeReference] = [.builtin(.dayClassic), .builtin(.day), .builtin(.night), .builtin(.nightAccent)] - let availableThemes = defaultThemes + savedThemes + var availableThemes = defaultThemes + if !defaultThemes.contains(settings.theme) && !savedThemes.contains(settings.theme) { + availableThemes.append(settings.theme) + } + availableThemes.append(contentsOf: savedThemes) let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Appearance_Title), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) let listState = ItemListNodeState(entries: themeSettingsControllerEntries(presentationData: presentationData, theme: theme, themeReference: settings.theme, themeSpecificAccentColors: settings.themeSpecificAccentColors, availableThemes: availableThemes, autoNightSettings: settings.automaticThemeSwitchSetting, strings: presentationData.strings, wallpaper: wallpaper, fontSize: fontSize, dateTimeFormat: dateTimeFormat, largeEmoji: largeEmoji, disableAnimations: disableAnimations, availableAppIcons: availableAppIcons, currentAppIconName: currentAppIconName), style: .blocks, ensureVisibleItemTag: focusOnItemTag, animateChanges: false) @@ -485,28 +493,22 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The arc4random_buf(&randomId, 8) let path = NSTemporaryDirectory() + "\(randomId)" - let encoder = PresentationThemeEncoder() - let theme = presentationData.theme - guard let strings = try? encoder.encode(theme), let _ = try? strings.write(toFile: path, atomically: true, encoding: .utf8) else { + guard let string = encodePresentationTheme(presentationData.theme), let _ = try? string.write(toFile: path, atomically: true, encoding: .utf8) else { return } let id = arc4random64() - let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: id), partialReference: nil, resource: LocalFileReferenceMediaResource(localFilePath: path, randomId: id), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgtheme-ios", size: nil, attributes: [.FileName(fileName: "\(theme.name.string).tgios-theme")]) + let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: id), partialReference: nil, resource: LocalFileReferenceMediaResource(localFilePath: path, randomId: id), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgtheme-ios", size: nil, attributes: [.FileName(fileName: "\(presentationData.theme.name.string).tgios-theme")]) let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: nil, localGroupingKey: nil) let _ = enqueueMessages(account: context.account, peerId: context.account.peerId, messages: [message]).start() - presentControllerImpl?(textAlertController(context: context, title: nil, text: "A new theme template has been added to your Saved Messages.", actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { + presentControllerImpl?(textAlertController(context: context, title: nil, text: "A new theme template has been created from your current theme and added to your Saved Messages.", actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { if let controller = controller, let navigationController = controller.navigationController as? NavigationController { context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(context.account.peerId))) } }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})], actionLayout: .vertical), nil) })) - items.append(ActionSheetButtonItem(title: "Upload Theme", color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - - })) actionSheet.setItemGroups([ActionSheetItemGroup(items:items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift index b5845a82ae..614eb4b493 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift @@ -3,10 +3,13 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import Postbox import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import WallpaperResources +import AccountContext private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selected: Bool) -> UIImage? { return generateImage(CGSize(width: 30.0, height: 30.0), rotatedContext: { size, context in @@ -38,85 +41,101 @@ private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selec })?.stretchableImage(withLeftCapWidth: 15, topCapHeight: 15) } -private func generateThemeIconImage(theme: PresentationThemeReference, accentColor: UIColor?) -> UIImage { - return generateImage(CGSize(width: 98.0, height: 62.0), rotatedContext: { size, context in - let bounds = CGRect(origin: CGPoint(), size: size) - - let background: UIColor - let incomingFill: UIColor - let outgoingFill: UIColor +private func themeIconImage(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + let signal: Signal<(UIColor, UIColor, UIColor), NoError> + if case let .builtin(theme) = theme { switch theme { - case let .builtin(theme): - switch theme { - case .dayClassic: - background = UIColor(rgb: 0xd6e2ee) - incomingFill = UIColor(rgb: 0xffffff) - outgoingFill = UIColor(rgb: 0xe1ffc7) - case .day: - background = .white - incomingFill = UIColor(rgb: 0xd5dde6) - outgoingFill = accentColor ?? UIColor(rgb: 0x007aff) - case .night: - background = UIColor(rgb: 0x000000) - incomingFill = UIColor(rgb: 0x1f1f1f) - outgoingFill = accentColor ?? UIColor(rgb: 0x313131) - case .nightAccent: - let accentColor = accentColor ?? UIColor(rgb: 0x007aff) - background = accentColor.withMultiplied(hue: 1.024, saturation: 0.573, brightness: 0.18) - incomingFill = accentColor.withMultiplied(hue: 1.024, saturation: 0.585, brightness: 0.25) - outgoingFill = accentColor.withMultiplied(hue: 1.019, saturation: 0.731, brightness: 0.59) - } - case let .cloud(theme): - background = UIColor(rgb: 0xd6e2ee) - incomingFill = UIColor(rgb: 0xffffff) - outgoingFill = UIColor(rgb: 0xe1ffc7) - default: - background = UIColor(rgb: 0xd6e2ee) - incomingFill = UIColor(rgb: 0xffffff) - outgoingFill = UIColor(rgb: 0xe1ffc7) + case .dayClassic: + signal = .single((UIColor(rgb: 0xd6e2ee), UIColor(rgb: 0xffffff), UIColor(rgb: 0xe1ffc7))) + case .day: + signal = .single((.white, UIColor(rgb: 0xd5dde6), accentColor ?? UIColor(rgb: 0x007aff))) + case .night: + signal = .single((.black, UIColor(rgb: 0x1f1f1f), accentColor ?? UIColor(rgb: 0x313131))) + case .nightAccent: + let accentColor = accentColor ?? UIColor(rgb: 0x007aff) + signal = .single((accentColor.withMultiplied(hue: 1.024, saturation: 0.573, brightness: 0.18), accentColor.withMultiplied(hue: 1.024, saturation: 0.585, brightness: 0.25), accentColor.withMultiplied(hue: 1.019, saturation: 0.731, brightness: 0.59))) } + } else { + var resource: MediaResource? + if case let .local(theme) = theme { + resource = theme.resource + } else if case let .cloud(theme) = theme { + resource = theme.file.resource + } + if let resource = resource { + signal = telegramThemeData(account: context.account, accountManager: context.sharedContext.accountManager, resource: resource, synchronousLoad: false) + |> mapToSignal { data -> Signal<(UIColor, UIColor, UIColor), NoError> in + if let data = data, let theme = makePresentationTheme(data: data) { + let backgroundColor: UIColor + switch theme.chat.defaultWallpaper { + case .builtin: + backgroundColor = UIColor(rgb: 0xd6e2ee) + case let .color(color): + backgroundColor = UIColor(rgb: UInt32(bitPattern: color)) + default: + backgroundColor = theme.chatList.backgroundColor + } + return .single((backgroundColor, theme.chat.message.incoming.bubble.withoutWallpaper.fill ,theme.chat.message.outgoing.bubble.withoutWallpaper.fill)) + } else { + return .complete() + } + } + } else { + signal = .never() + } + } + return signal + |> map { colors in + return { arguments in + let context = DrawingContext(size: arguments.drawingSize, scale: arguments.scale ?? 0.0, clear: arguments.emptyColor == nil) + let drawingRect = arguments.drawingRect - context.setFillColor(background.cgColor) - context.fill(bounds) - - let incoming = generateTintedImage(image: UIImage(bundleImageName: "Settings/ThemeBubble"), color: incomingFill) - let outgoing = generateTintedImage(image: UIImage(bundleImageName: "Settings/ThemeBubble"), color: outgoingFill) - - context.translateBy(x: bounds.width / 2.0, y: bounds.height / 2.0) - context.scaleBy(x: 1.0, y: -1.0) - context.translateBy(x: -bounds.width / 2.0, y: -bounds.height / 2.0) - - context.draw(incoming!.cgImage!, in: CGRect(x: 9.0, y: 34.0, width: 57.0, height: 16.0)) - - context.translateBy(x: bounds.width / 2.0, y: bounds.height / 2.0) - context.scaleBy(x: -1.0, y: 1.0) - context.translateBy(x: -bounds.width / 2.0, y: -bounds.height / 2.0) - context.draw(outgoing!.cgImage!, in: CGRect(x: 9.0, y: 12.0, width: 57.0, height: 16.0)) - })! + context.withContext { c in + c.setFillColor(colors.0.cgColor) + c.fill(drawingRect) + + let incoming = generateTintedImage(image: UIImage(bundleImageName: "Settings/ThemeBubble"), color: colors.1) + let outgoing = generateTintedImage(image: UIImage(bundleImageName: "Settings/ThemeBubble"), color: colors.2) + + c.translateBy(x: drawingRect.width / 2.0, y: drawingRect.height / 2.0) + c.scaleBy(x: 1.0, y: -1.0) + c.translateBy(x: -drawingRect.width / 2.0, y: -drawingRect.height / 2.0) + + c.draw(incoming!.cgImage!, in: CGRect(x: 9.0, y: 34.0, width: 57.0, height: 16.0)) + + c.translateBy(x: drawingRect.width / 2.0, y: drawingRect.height / 2.0) + c.scaleBy(x: -1.0, y: 1.0) + c.translateBy(x: -drawingRect.width / 2.0, y: -drawingRect.height / 2.0) + c.draw(outgoing!.cgImage!, in: CGRect(x: 9.0, y: 12.0, width: 57.0, height: 16.0)) + } + + return context + } + } } class ThemeSettingsThemeItem: ListViewItem, ItemListItem { var sectionId: ItemListSectionId + let context: AccountContext let theme: PresentationTheme let strings: PresentationStrings let themes: [PresentationThemeReference] let themeSpecificAccentColors: [Int64: PresentationThemeAccentColor] let currentTheme: PresentationThemeReference let updatedTheme: (PresentationThemeReference) -> Void - let currentColor: PresentationThemeAccentColor? - let updatedColor: (PresentationThemeAccentColor) -> Void + let longTapped: (PresentationThemeReference) -> Void let tag: ItemListItemTag? - init(theme: PresentationTheme, strings: PresentationStrings, sectionId: ItemListSectionId, themes: [PresentationThemeReference], themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], currentTheme: PresentationThemeReference, updatedTheme: @escaping (PresentationThemeReference) -> Void, currentColor: PresentationThemeAccentColor?, updatedColor: @escaping (PresentationThemeAccentColor) -> Void, tag: ItemListItemTag? = nil) { + init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings, sectionId: ItemListSectionId, themes: [PresentationThemeReference], themeSpecificAccentColors: [Int64: PresentationThemeAccentColor], currentTheme: PresentationThemeReference, updatedTheme: @escaping (PresentationThemeReference) -> Void, longTapped: @escaping (PresentationThemeReference) -> Void, tag: ItemListItemTag? = nil) { + self.context = context self.theme = theme self.strings = strings self.themes = themes self.themeSpecificAccentColors = themeSpecificAccentColors self.currentTheme = currentTheme self.updatedTheme = updatedTheme - self.currentColor = currentColor - self.updatedColor = updatedColor + self.longTapped = longTapped self.tag = tag self.sectionId = sectionId } @@ -156,15 +175,16 @@ class ThemeSettingsThemeItem: ListViewItem, ItemListItem { } private final class ThemeSettingsThemeItemIconNode : ASDisplayNode { - private let iconNode: ASImageNode + private let imageNode: TransformImageNode private let overlayNode: ASImageNode private let textNode: ASTextNode private var action: (() -> Void)? + private var longTapAction: (() -> Void)? override init() { - self.iconNode = ASImageNode() - self.iconNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 98.0, height: 62.0)) - self.iconNode.isLayerBacked = true + self.imageNode = TransformImageNode() + self.imageNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 98.0, height: 62.0)) + self.imageNode.isLayerBacked = true self.overlayNode = ASImageNode() self.overlayNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 98.0, height: 62.0)) @@ -176,15 +196,15 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode { super.init() - self.addSubnode(self.iconNode) + self.addSubnode(self.imageNode) self.addSubnode(self.overlayNode) self.addSubnode(self.textNode) } - func setup(theme: PresentationTheme, icon: UIImage, title: NSAttributedString, bordered: Bool, selected: Bool, action: @escaping () -> Void) { - self.iconNode.image = icon + func setup(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?, currentTheme: PresentationTheme, title: NSAttributedString, bordered: Bool, selected: Bool, action: @escaping () -> Void) { + self.imageNode.setSignal(themeIconImage(context: context, theme: theme, accentColor: accentColor)) self.textNode.attributedText = title - self.overlayNode.image = generateBorderImage(theme: theme, bordered: bordered, selected: selected) + self.overlayNode.image = generateBorderImage(theme: currentTheme, bordered: bordered, selected: selected) self.action = { action() } @@ -207,7 +227,12 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode { let bounds = self.bounds - self.iconNode.frame = CGRect(origin: CGPoint(x: 10.0, y: 14.0), size: CGSize(width: 98.0, height: 62.0)) + let imageSize = CGSize(width: 98.0, height: 62.0) + self.imageNode.frame = CGRect(origin: CGPoint(x: 10.0, y: 14.0), size: imageSize) + let makeLayout = self.imageNode.asyncLayout() + let applyLayout = makeLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), emptyColor: .clear)) + applyLayout() + self.overlayNode.frame = CGRect(origin: CGPoint(x: 10.0, y: 14.0), size: CGSize(width: 98.0, height: 62.0)) self.textNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 14.0 + 60.0 + 4.0 + 9.0), size: CGSize(width: bounds.size.width, height: 16.0)) } @@ -356,14 +381,14 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { case .nightAccent: name = item.strings.Appearance_ThemeCarouselTintedNight } + case let .local(theme): + name = theme.title case let .cloud(theme): name = theme.title - default: - name = nil } if let name = name { - imageNode.setup(theme: item.theme, icon: generateThemeIconImage(theme: theme, accentColor: item.themeSpecificAccentColors[theme.index]?.color), title: NSAttributedString(string: name, font: selected ? selectedTextFont : textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { [weak self, weak imageNode] in + imageNode.setup(context: item.context, theme: theme, accentColor: item.themeSpecificAccentColors[theme.index]?.color, currentTheme: item.theme, title: NSAttributedString(string: name, font: selected ? selectedTextFont : textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { [weak self, weak imageNode] in item.updatedTheme(theme) if let imageNode = imageNode { self?.scrollToNode(imageNode, animated: true) diff --git a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift index e41c667825..15599e05ba 100644 --- a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift +++ b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift @@ -105,6 +105,7 @@ enum AccountStateMutationOperation { case UpdateMinAvailableMessage(MessageId) case UpdatePeerChatInclusion(peerId: PeerId, groupId: PeerGroupId, changedGroup: Bool) case UpdatePeersNearby([PeerNearby]) + case UpdateTheme(TelegramTheme) } struct AccountMutableState { @@ -338,6 +339,10 @@ struct AccountMutableState { self.addOperation(.UpdatePeersNearby(peersNearby)) } + mutating func updateTheme(_ theme: TelegramTheme) { + self.addOperation(.UpdateTheme(theme)) + } + mutating func mergeUsers(_ users: [Api.User]) { self.addOperation(.MergeApiUsers(users)) @@ -408,7 +413,7 @@ struct AccountMutableState { mutating func addOperation(_ operation: AccountStateMutationOperation) { switch operation { - case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .ReadOutbox, .ReadGroupFeedInbox, .MergePeerPresences, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdatePeerChatUnreadMark, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby: + case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .ReadOutbox, .ReadGroupFeedInbox, .MergePeerPresences, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdatePeerChatUnreadMark, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme: break case let .AddMessages(messages, location): for message in messages { diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index 4bfaf95d0b..dc55ce209d 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -1315,7 +1315,9 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo } updatedState.deleteMessages(messageIds) case let .updateTheme(theme): - break + if let theme = TelegramTheme(apiTheme: theme) { + updatedState.updateTheme(theme) + } default: break } @@ -2030,7 +2032,7 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation]) var currentAddScheduledMessages: OptimizeAddMessagesState? for operation in operations { switch operation { - case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .MergeApiChats, .MergeApiUsers, .MergePeerPresences, .UpdatePeer, .ReadInbox, .ReadOutbox, .ReadGroupFeedInbox, .ResetReadState, .ResetIncomingReadState, .UpdatePeerChatUnreadMark, .ResetMessageTagSummary, .UpdateNotificationSettings, .UpdateGlobalNotificationSettings, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby: + case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .MergeApiChats, .MergeApiUsers, .MergePeerPresences, .UpdatePeer, .ReadInbox, .ReadOutbox, .ReadGroupFeedInbox, .ResetReadState, .ResetIncomingReadState, .UpdatePeerChatUnreadMark, .ResetMessageTagSummary, .UpdateNotificationSettings, .UpdateGlobalNotificationSettings, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme: if let currentAddMessages = currentAddMessages, !currentAddMessages.messages.isEmpty { result.append(.AddMessages(currentAddMessages.messages, currentAddMessages.location)) } @@ -2111,6 +2113,7 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP var syncRecentGifs = false var langPackDifferences: [String: [Api.LangPackDifference]] = [:] var pollLangPacks = Set() + var updatedThemes: [Int64: TelegramTheme] = [:] var delayNotificatonsUntil: Int32? var peerActivityTimestamps: [PeerId: Int32] = [:] @@ -2127,7 +2130,6 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } var wasOpearationScheduledMessegeIds: [MessageId] = [] - var addedOperationIncomingMessageIds: [MessageId] = [] for operation in finalState.state.operations { @@ -2650,6 +2652,8 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP isContactUpdates.append((peerId, value)) case let .UpdatePeersNearby(peersNearby): updatedPeersNearby = peersNearby + case let .UpdateTheme(theme): + updatedThemes[theme.id] = theme } } @@ -2934,6 +2938,25 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP }).start() } + if !updatedThemes.isEmpty { + let items = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) + let themes = items.map { entry -> TelegramTheme in + let theme = entry.contents as! TelegramTheme + if let updatedTheme = updatedThemes[theme.id] { + return updatedTheme + } else { + return theme + } + } + var entries: [OrderedItemListEntry] = [] + for theme in themes { + var intValue = Int32(entries.count) + let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) + entries.append(OrderedItemListEntry(id: id, contents: theme)) + } + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: entries) + } + addedIncomingMessageIds.append(contentsOf: addedSecretMessageIds) return AccountReplayedFinalState(state: finalState, addedIncomingMessageIds: addedIncomingMessageIds, wasScheduledMessageIds: wasScheduledMessageIds, addedSecretMessageIds: addedSecretMessageIds, updatedTypingActivities: updatedTypingActivities, updatedWebpages: updatedWebpages, updatedCalls: updatedCalls, updatedPeersNearby: updatedPeersNearby, isContactUpdates: isContactUpdates, delayNotificatonsUntil: delayNotificatonsUntil) diff --git a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift index d8f478ede5..a4f3da726e 100644 --- a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift @@ -166,7 +166,7 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes let (tags, globalTags) = tagsForStoreMessage(incoming: currentMessage.flags.contains(.Incoming), attributes: attributes, media: media, textEntities: entitiesAttribute?.entities) - if currentMessage.id.peerId.namespace == Namespaces.Peer.CloudChannel, !currentMessage.flags.contains(.Incoming) { + if currentMessage.id.peerId.namespace == Namespaces.Peer.CloudChannel, !currentMessage.flags.contains(.Incoming), !Namespaces.Message.allScheduled.contains(currentMessage.id.namespace) { let peerId = currentMessage.id.peerId if let peer = transaction.getPeer(peerId) { if let peer = peer as? TelegramChannel { @@ -188,10 +188,8 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes } } } - } - return .update(StoreMessage(id: updatedId, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: updatedTimestamp ?? currentMessage.timestamp, flags: [], tags: tags, globalTags: globalTags, localTags: currentMessage.localTags, forwardInfo: forwardInfo, authorId: currentMessage.author?.id, text: text, attributes: attributes, media: media)) }) for file in sentStickers { diff --git a/submodules/TelegramCore/TelegramCore/StickerManagement.swift b/submodules/TelegramCore/TelegramCore/StickerManagement.swift index ee7a5d68e0..8d329f235a 100644 --- a/submodules/TelegramCore/TelegramCore/StickerManagement.swift +++ b/submodules/TelegramCore/TelegramCore/StickerManagement.swift @@ -46,28 +46,28 @@ func updatedFeaturedStickerPacks(network: Network, postbox: Postbox) -> Signal retryRequest - |> mapToSignal { result -> Signal in - return postbox.transaction { transaction -> Void in - switch result { - case .featuredStickersNotModified: - break - case let .featuredStickers(_, sets, unread): - let unreadIds = Set(unread) - var updatedPacks: [FeaturedStickerPackItem] = [] - for set in sets { - var (info, items) = parsePreviewStickerSet(set) - if let previousPack = initialPackMap[info.id.id] { - if previousPack.info.hash == info.hash { - items = previousPack.topItems - } + |> retryRequest + |> mapToSignal { result -> Signal in + return postbox.transaction { transaction -> Void in + switch result { + case .featuredStickersNotModified: + break + case let .featuredStickers(_, sets, unread): + let unreadIds = Set(unread) + var updatedPacks: [FeaturedStickerPackItem] = [] + for set in sets { + var (info, items) = parsePreviewStickerSet(set) + if let previousPack = initialPackMap[info.id.id] { + if previousPack.info.hash == info.hash { + items = previousPack.topItems } - updatedPacks.append(FeaturedStickerPackItem(info: info, topItems: items, unread: unreadIds.contains(info.id.id))) } - transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, items: updatedPacks.map { OrderedItemListEntry(id: FeaturedStickerPackItemId($0.info.id.id).rawValue, contents: $0) }) - } + updatedPacks.append(FeaturedStickerPackItem(info: info, topItems: items, unread: unreadIds.contains(info.id.id))) + } + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, items: updatedPacks.map { OrderedItemListEntry(id: FeaturedStickerPackItemId($0.info.id.id).rawValue, contents: $0) }) } } + } } |> switchToLatest } diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift index 0f2424d0c6..3df9e9b6a4 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift @@ -24,9 +24,10 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable { public let image: TelegramMediaImage? public let file: TelegramMediaFile? + public let files: [TelegramMediaFile]? public let instantPage: InstantPage? - public init(url: String, displayUrl: String, hash: Int32, type: String?, websiteName: String?, title: String?, text: String?, embedUrl: String?, embedType: String?, embedSize: CGSize?, duration: Int?, author: String?, image: TelegramMediaImage?, file: TelegramMediaFile?, instantPage: InstantPage?) { + public init(url: String, displayUrl: String, hash: Int32, type: String?, websiteName: String?, title: String?, text: String?, embedUrl: String?, embedType: String?, embedSize: CGSize?, duration: Int?, author: String?, image: TelegramMediaImage?, file: TelegramMediaFile?, files: [TelegramMediaFile]?, instantPage: InstantPage?) { self.url = url self.displayUrl = displayUrl self.hash = hash @@ -41,6 +42,7 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable { self.author = author self.image = image self.file = file + self.files = files self.instantPage = instantPage } @@ -78,6 +80,8 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable { self.file = nil } + self.files = decoder.decodeOptionalObjectArrayWithDecoderForKey("fis") + if let instantPage = decoder.decodeObjectForKey("ip", decoder: { InstantPage(decoder: $0) }) as? InstantPage { self.instantPage = instantPage } else { @@ -146,6 +150,11 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable { } else { encoder.encodeNil(forKey: "fi") } + if let files = self.files { + encoder.encodeObjectArray(files, forKey: "fis") + } else { + encoder.encodeNil(forKey: "fis") + } if let instantPage = self.instantPage { encoder.encodeObject(instantPage, forKey: "ip") } else { @@ -186,6 +195,20 @@ public func ==(lhs: TelegramMediaWebpageLoadedContent, rhs: TelegramMediaWebpage return false } + if let lhsFiles = lhs.files, let rhsFiles = rhs.files { + if lhsFiles.count != rhsFiles.count { + return false + } else { + for i in 0 ..< lhsFiles.count { + if !lhsFiles[i].isEqual(to: rhsFiles[i]) { + return false + } + } + } + } else if (lhs.files == nil) != (rhs.files == nil) { + return false + } + if lhs.instantPage != rhs.instantPage { return false } @@ -308,11 +331,15 @@ func telegramMediaWebpageFromApiWebpage(_ webpage: Api.WebPage, url: String?) -> if let document = document { file = telegramMediaFileFromApiDocument(document) } + var files: [TelegramMediaFile]? + if let documents = documents { + files = documents.compactMap(telegramMediaFileFromApiDocument) + } var instantPage: InstantPage? if let cachedPage = cachedPage { instantPage = InstantPage(apiPage: cachedPage) } - return TelegramMediaWebpage(webpageId: MediaId(namespace: Namespaces.Media.CloudWebpage, id: id), content: .Loaded(TelegramMediaWebpageLoadedContent(url: url, displayUrl: displayUrl, hash: hash, type: type, websiteName: siteName, title: title, text: description, embedUrl: embedUrl, embedType: embedType, embedSize: embedSize, duration: webpageDuration, author: author, image: image, file: file, instantPage: instantPage))) + return TelegramMediaWebpage(webpageId: MediaId(namespace: Namespaces.Media.CloudWebpage, id: id), content: .Loaded(TelegramMediaWebpageLoadedContent(url: url, displayUrl: displayUrl, hash: hash, type: type, websiteName: siteName, title: title, text: description, embedUrl: embedUrl, embedType: embedType, embedSize: embedSize, duration: webpageDuration, author: author, image: image, file: file, files: files, instantPage: instantPage))) case .webPageEmpty: return nil } diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index d41b0a4918..227803c976 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -217,10 +217,19 @@ public func createTheme(account: Account, resource: MediaResource, title: String } } -public func updateTheme(account: Account, theme: TelegramTheme, title: String?, resource: MediaResource?) -> Signal { - guard title != nil || resource != nil else { +public func updateTheme(account: Account, theme: TelegramTheme, title: String?, slug: String?, resource: MediaResource?) -> Signal { + guard title != nil || slug != nil || resource != nil else { return .complete() } + var flags: Int32 = 0 + if let _ = title { + flags |= 1 << 1 + } + if let _ = slug { + flags |= 1 << 0 + } + return .never() + //return account.network.request(Api.functions.account.updateTheme(flags: flags, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: <#T##Api.InputDocument?#>)) } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index d369fb0062..b70572f3a2 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -356,6 +356,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta return PresentationTheme( name: .builtin(.night), author: "Telegram", + referenceTheme: .night, overallDarkAppearance: true, baseColor: baseColor, intro: intro, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index 6467297f85..ff7dd74cc6 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -326,6 +326,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta return PresentationTheme( name: .builtin(.nightAccent), author: "Telegram", + referenceTheme: .nightAccent, overallDarkAppearance: true, baseColor: baseColor, intro: intro, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 5f62d281b1..cda4734426 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -362,6 +362,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr return PresentationTheme( name: .builtin(day ? .day : .dayClassic), author: "Telegram", + referenceTheme: day ? .day : .dayClassic, overallDarkAppearance: false, baseColor: baseColor, intro: intro, diff --git a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift index fb65ef16a7..b4f372c735 100644 --- a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift @@ -1,25 +1,40 @@ import Foundation import UIKit +import Postbox import TelegramUIPreferences -public func makePresentationTheme(themeReference: PresentationThemeReference, accentColor: UIColor?, serviceBackgroundColor: UIColor, baseColor: PresentationThemeBaseColor?, preview: Bool = false) -> PresentationTheme { +public func makeDefaultPresentationTheme(reference: PresentationBuiltinThemeReference, accentColor: UIColor?, serviceBackgroundColor: UIColor, baseColor: PresentationThemeBaseColor?, preview: Bool = false) -> PresentationTheme { let theme: PresentationTheme - switch themeReference { - case let .builtin(reference): - switch reference { - case .dayClassic: - theme = makeDefaultDayPresentationTheme(serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: false, preview: preview) - case .night: - theme = makeDarkPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) - case .nightAccent: - theme = makeDarkAccentPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) - case .day: - theme = makeDefaultDayPresentationTheme(accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: true, preview: preview) - } - case let .local(resource): - theme = makeDefaultDayPresentationTheme(serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: false, preview: preview) - case let .cloud(info): + switch reference { + case .dayClassic: theme = makeDefaultDayPresentationTheme(serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: false, preview: preview) + case .night: + theme = makeDarkPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) + case .nightAccent: + theme = makeDarkAccentPresentationTheme(accentColor: accentColor, baseColor: baseColor, preview: preview) + case .day: + theme = makeDefaultDayPresentationTheme(accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, day: true, preview: preview) + } + return theme +} + +public func makePresentationTheme(mediaBox: MediaBox, themeReference: PresentationThemeReference, accentColor: UIColor?, serviceBackgroundColor: UIColor, baseColor: PresentationThemeBaseColor?, preview: Bool = false) -> PresentationTheme { + let theme: PresentationTheme + switch themeReference { + case let .builtin(reference): + theme = makeDefaultPresentationTheme(reference: reference, accentColor: accentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, preview: preview) + case let .local(info): + if let path = mediaBox.completedResourcePath(info.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let loadedTheme = makePresentationTheme(data: data) { + theme = loadedTheme + } else { + theme = makeDefaultPresentationTheme(reference: .dayClassic, accentColor: nil, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, preview: preview) + } + case let .cloud(info): + if let path = mediaBox.completedResourcePath(info.file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let loadedTheme = makePresentationTheme(data: data) { + theme = loadedTheme + } else { + theme = makeDefaultPresentationTheme(reference: .dayClassic, accentColor: nil, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, preview: preview) + } } return theme } diff --git a/submodules/TelegramPresentationData/Sources/PresentationData.swift b/submodules/TelegramPresentationData/Sources/PresentationData.swift index bee81a651c..e9bdad40b0 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationData.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationData.swift @@ -260,7 +260,7 @@ public func currentPresentationDataAndSettings(accountManager: AccountManager) - } let effectiveAccentColor = themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.color - themeValue = makePresentationTheme(themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.baseColor ?? .blue) + themeValue = makePresentationTheme(mediaBox: accountManager.mediaBox, themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.baseColor ?? .blue) if effectiveTheme != themeSettings.theme { switch effectiveChatWallpaper { @@ -526,7 +526,7 @@ public func updatedPresentationData(accountManager: AccountManager, applicationI } let effectiveAccentColor = themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.color - let themeValue = makePresentationTheme(themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.baseColor ?? .blue) + let themeValue = makePresentationTheme(mediaBox: accountManager.mediaBox, themeReference: effectiveTheme, accentColor: effectiveAccentColor, serviceBackgroundColor: serviceBackgroundColor, baseColor: themeSettings.themeSpecificAccentColors[effectiveTheme.index]?.baseColor ?? .blue) if effectiveTheme != themeSettings.theme && themeSettings.themeSpecificChatWallpapers[effectiveTheme.index] == nil { switch effectiveChatWallpaper { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 34a16f9c57..834281f376 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -687,4004 +687,4009 @@ public final class PresentationStrings { public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[454]! } public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[455]! } public var ChangePhoneNumberCode_Code: String { return self._s[456]! } + public var Appearance_CreateTheme: String { return self._s[457]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[457]!, self._r[457]!, [_0]) + return formatWithArgumentRanges(self._s[458]!, self._r[458]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[458]! } - public var HashtagSearch_AllChats: String { return self._s[459]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[461]! } + public var TwoStepAuth_SetupEmail: String { return self._s[459]! } + public var HashtagSearch_AllChats: String { return self._s[460]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[462]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[462]!, self._r[462]!, [_0]) + return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[464]! } + public var PhotoEditor_QualityHigh: String { return self._s[465]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[465]!, self._r[465]!, [_0]) + return formatWithArgumentRanges(self._s[466]!, self._r[466]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[466]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[467]! } - public var Message_LiveLocation: String { return self._s[468]! } - public var Cache_LowDiskSpaceText: String { return self._s[469]! } - public var Conversation_SendMessage: String { return self._s[470]! } - public var AuthSessions_EmptyTitle: String { return self._s[471]! } - public var Privacy_PhoneNumber: String { return self._s[472]! } - public var PeopleNearby_CreateGroup: String { return self._s[473]! } - public var CallSettings_UseLessData: String { return self._s[474]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[475]! } - public var Stickers_AddToFavorites: String { return self._s[476]! } - public var PhotoEditor_QualityLow: String { return self._s[477]! } - public var Watch_UserInfo_Unblock: String { return self._s[478]! } - public var Settings_Logout: String { return self._s[479]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[467]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[468]! } + public var Message_LiveLocation: String { return self._s[469]! } + public var Cache_LowDiskSpaceText: String { return self._s[470]! } + public var Conversation_SendMessage: String { return self._s[471]! } + public var AuthSessions_EmptyTitle: String { return self._s[472]! } + public var Privacy_PhoneNumber: String { return self._s[473]! } + public var PeopleNearby_CreateGroup: String { return self._s[474]! } + public var CallSettings_UseLessData: String { return self._s[475]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[476]! } + public var Stickers_AddToFavorites: String { return self._s[477]! } + public var PhotoEditor_QualityLow: String { return self._s[478]! } + public var Watch_UserInfo_Unblock: String { return self._s[479]! } + public var Settings_Logout: String { return self._s[480]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[480]!, self._r[480]!, [_1]) + return formatWithArgumentRanges(self._s[481]!, self._r[481]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[481]! } - public var ChannelInfo_Stats: String { return self._s[482]! } - public var TextFormat_Link: String { return self._s[483]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[482]! } + public var ChannelInfo_Stats: String { return self._s[483]! } + public var TextFormat_Link: String { return self._s[484]! } public func Date_ChatDateHeader(_ _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 func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[485]!, self._r[485]!, [_0]) + return formatWithArgumentRanges(self._s[486]!, self._r[486]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[486]! } - public var Group_Setup_TypePublicHelp: String { return self._s[487]! } - public var Passport_Scans_UploadNew: String { return self._s[488]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[489]! } - public var DialogList_Title: String { return self._s[492]! } - public var NotificationSettings_ContactJoined: String { return self._s[493]! } - public var GroupInfo_LabelAdmin: String { return self._s[494]! } - public var KeyCommand_ChatInfo: String { return self._s[495]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[496]! } - public var Call_ReportIncludeLog: String { return self._s[497]! } + public var Watch_Notification_Joined: String { return self._s[487]! } + public var Group_Setup_TypePublicHelp: String { return self._s[488]! } + public var Passport_Scans_UploadNew: String { return self._s[489]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[490]! } + public var DialogList_Title: String { return self._s[493]! } + public var NotificationSettings_ContactJoined: String { return self._s[494]! } + public var GroupInfo_LabelAdmin: String { return self._s[495]! } + public var KeyCommand_ChatInfo: String { return self._s[496]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[497]! } + public var Call_ReportIncludeLog: String { return self._s[498]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[500]!, self._r[500]!, [_0]) + return formatWithArgumentRanges(self._s[501]!, self._r[501]!, [_0]) } - public var LocalGroup_IrrelevantWarning: String { return self._s[501]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[502]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[503]! } - public var Message_Sticker: String { return self._s[504]! } - public var LastSeen_JustNow: String { return self._s[506]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[508]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[509]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[510]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[511]! } - public var TwoStepAuth_Email: String { return self._s[512]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[513]! } - public var PhotoEditor_BlurToolOff: String { return self._s[514]! } - public var Message_PinnedStickerMessage: String { return self._s[515]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[516]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[517]! } - public var Passport_DiscardMessageTitle: String { return self._s[518]! } - public var Privacy_PaymentsTitle: String { return self._s[519]! } - public var Channel_DiscussionGroup_Header: String { return self._s[521]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[522]! } - public var Appearance_ColorTheme: String { return self._s[523]! } - public var UserInfo_ShareContact: String { return self._s[524]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[525]! } - public var Common_More: String { return self._s[526]! } - public var Watch_Message_Call: String { return self._s[527]! } - public var Profile_EncryptionKey: String { return self._s[530]! } - public var Privacy_TopPeers: String { return self._s[531]! } - public var Conversation_StopPollConfirmation: String { return self._s[532]! } - public var Privacy_TopPeersWarning: String { return self._s[534]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[535]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[536]! } - public var DialogList_SearchSectionMessages: String { return self._s[539]! } - public var Appearance_ThemePreview_ChatList_8_Name: String { return self._s[540]! } - public var Notifications_ChannelNotifications: String { return self._s[541]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[542]! } - public var Passport_Language_sk: String { return self._s[543]! } - public var Notification_MessageLifetime1h: String { return self._s[544]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[545]! } - public var Call_ReportSkip: String { return self._s[547]! } - public var Cache_ServiceFiles: String { return self._s[548]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[549]! } - public var VoiceOver_Chat_YourFile: String { return self._s[550]! } - public var Map_Hybrid: String { return self._s[551]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[553]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[555]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[556]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[557]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[560]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[502]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[503]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[504]! } + public var Message_Sticker: String { return self._s[505]! } + public var LastSeen_JustNow: String { return self._s[507]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[509]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[510]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[511]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[512]! } + public var TwoStepAuth_Email: String { return self._s[513]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[514]! } + public var PhotoEditor_BlurToolOff: String { return self._s[515]! } + public var Message_PinnedStickerMessage: String { return self._s[516]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[517]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[518]! } + public var Passport_DiscardMessageTitle: String { return self._s[519]! } + public var Privacy_PaymentsTitle: String { return self._s[520]! } + public var Channel_DiscussionGroup_Header: String { return self._s[522]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[523]! } + public var Appearance_ColorTheme: String { return self._s[524]! } + public var UserInfo_ShareContact: String { return self._s[525]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[526]! } + public var Common_More: String { return self._s[527]! } + public var Watch_Message_Call: String { return self._s[528]! } + public var Profile_EncryptionKey: String { return self._s[531]! } + public var Privacy_TopPeers: String { return self._s[532]! } + public var Conversation_StopPollConfirmation: String { return self._s[533]! } + public var Privacy_TopPeersWarning: String { return self._s[535]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[536]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[537]! } + public var DialogList_SearchSectionMessages: String { return self._s[540]! } + public var Appearance_ThemePreview_ChatList_8_Name: String { return self._s[541]! } + public var Notifications_ChannelNotifications: String { return self._s[542]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[543]! } + public var Passport_Language_sk: String { return self._s[544]! } + public var Notification_MessageLifetime1h: String { return self._s[545]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[546]! } + public var Call_ReportSkip: String { return self._s[548]! } + public var Cache_ServiceFiles: String { return self._s[549]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[550]! } + public var VoiceOver_Chat_YourFile: String { return self._s[551]! } + public var Map_Hybrid: String { return self._s[552]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[554]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[556]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[557]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[558]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[561]! } public func PUSH_MESSAGE_AUDIO(_ _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 Channel_Username_CreatePrivateLinkHelp: String { return self._s[563]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[564]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[564]!, self._r[564]!, [_1, _2]) + return formatWithArgumentRanges(self._s[565]!, self._r[565]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[565]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[566]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[567]! } - public var UserInfo_ShareBot: String { return self._s[570]! } + public var Conversation_LiveLocationYou: String { return self._s[566]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[567]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[568]! } + public var UserInfo_ShareBot: String { return self._s[571]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[571]!, self._r[571]!, [_1, _2]) + return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[572]! } - public var Message_Audio: String { return self._s[573]! } - public var Passport_Language_lt: String { return self._s[574]! } + public var PhotoEditor_ShadowsTint: String { return self._s[573]! } + public var Message_Audio: String { return self._s[574]! } + public var Passport_Language_lt: String { return self._s[575]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[575]!, self._r[575]!, [_0]) + return formatWithArgumentRanges(self._s[576]!, self._r[576]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[576]! } - public var Conversation_FileICloudDrive: String { return self._s[577]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[578]! } + public var Permissions_SiriText_v0: String { return self._s[577]! } + public var Conversation_FileICloudDrive: String { return self._s[578]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[579]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[579]!, self._r[579]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[580]!, self._r[580]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[580]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[581]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[581]!, self._r[581]!, [_0]) + return formatWithArgumentRanges(self._s[582]!, self._r[582]!, [_0]) } - public var Channel_SignMessages: String { return self._s[582]! } + public var Channel_SignMessages: String { return self._s[583]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_1]) + return formatWithArgumentRanges(self._s[584]!, self._r[584]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[584]! } - public var Passport_ScanPassport: String { return self._s[585]! } - public var Watch_Suggestion_Thanks: String { return self._s[586]! } - public var BlockedUsers_AddNew: String { return self._s[587]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[585]! } + public var Passport_ScanPassport: String { return self._s[586]! } + public var Watch_Suggestion_Thanks: String { return self._s[587]! } + public var BlockedUsers_AddNew: String { return self._s[588]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[588]!, self._r[588]!, [_1, _2]) + return formatWithArgumentRanges(self._s[589]!, self._r[589]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[589]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[590]! } - public var Month_GenJuly: String { return self._s[591]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[592]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[594]! } - public var Notification_ChannelInviterSelf: String { return self._s[595]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[596]! } + public var Watch_Message_Invoice: String { return self._s[590]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[591]! } + public var Month_GenJuly: String { return self._s[592]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[593]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[595]! } + public var Notification_ChannelInviterSelf: String { return self._s[596]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[597]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[597]!, self._r[597]!, [_1, _2]) + return formatWithArgumentRanges(self._s[598]!, self._r[598]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[598]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[599]! } + public var CheckoutInfo_Title: String { return self._s[599]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[600]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[600]!, self._r[600]!, [_0]) + return formatWithArgumentRanges(self._s[601]!, self._r[601]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[601]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[602]! } - public var Passport_Language_de: String { return self._s[603]! } - public var Update_Title: String { return self._s[604]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[605]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[606]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[607]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[608]! } - public var NotificationsSound_Telegraph: String { return self._s[609]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[610]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[611]! } + public var Passport_Identity_MainPage: String { return self._s[602]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[603]! } + public var Passport_Language_de: String { return self._s[604]! } + public var Update_Title: String { return self._s[605]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[606]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[607]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[608]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[609]! } + public var NotificationsSound_Telegraph: String { return self._s[610]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[611]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[612]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[612]!, self._r[612]!, [_0]) + return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[613]! } - public var Conversation_ForwardTitle: String { return self._s[614]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[615]! } + public var Stickers_SuggestAll: String { return self._s[614]! } + public var Conversation_ForwardTitle: String { return self._s[615]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[616]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[616]!, self._r[616]!, [_0]) + return formatWithArgumentRanges(self._s[617]!, self._r[617]!, [_0]) } - public var Calls_NewCall: String { return self._s[617]! } - public var Call_StatusEnded: String { return self._s[618]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[619]! } - public var Settings_ProxyConnected: String { return self._s[620]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[621]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[622]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[623]! } - public var Passport_PasswordPlaceholder: String { return self._s[624]! } - public var Message_PinnedInvoice: String { return self._s[625]! } - public var Passport_Identity_IssueDate: String { return self._s[626]! } - public var Passport_Language_pl: String { return self._s[627]! } + public var Calls_NewCall: String { return self._s[618]! } + public var Call_StatusEnded: String { return self._s[619]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[620]! } + public var Settings_ProxyConnected: String { return self._s[621]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[622]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[623]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[624]! } + public var Passport_PasswordPlaceholder: String { return self._s[625]! } + public var Message_PinnedInvoice: String { return self._s[626]! } + public var Passport_Identity_IssueDate: String { return self._s[627]! } + public var Passport_Language_pl: String { return self._s[628]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[628]!, self._r[628]!, [_0]) + return formatWithArgumentRanges(self._s[629]!, self._r[629]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[629]! } - public var Call_StatusConnecting: String { return self._s[630]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[630]! } + public var Call_StatusConnecting: String { return self._s[631]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[631]!, self._r[631]!, [_0]) + return formatWithArgumentRanges(self._s[632]!, self._r[632]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[633]! } - public var Common_Edit: String { return self._s[634]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[635]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[634]! } + public var Common_Edit: String { return self._s[635]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[636]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[636]!, self._r[636]!, [_0]) + return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[637]! } - public var PrivateDataSettings_Title: String { return self._s[638]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[639]! } - public var ChatList_Read: String { return self._s[640]! } - public var Undo_ChatClearedForBothSides: String { return self._s[641]! } - public var GroupPermission_SectionTitle: String { return self._s[642]! } + public var GroupInfo_ChatAdmins: String { return self._s[638]! } + public var PrivateDataSettings_Title: String { return self._s[639]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[640]! } + public var ChatList_Read: String { return self._s[641]! } + public var Undo_ChatClearedForBothSides: String { return self._s[642]! } + public var GroupPermission_SectionTitle: String { return self._s[643]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_1, _2]) + return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[645]! } - public var Update_UpdateApp: String { return self._s[646]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[647]! } - public var Settings_Appearance: String { return self._s[648]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[651]! } - public var Watch_Location_Access: String { return self._s[652]! } - public var ShareMenu_CopyShareLink: String { return self._s[654]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[655]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[646]! } + public var Update_UpdateApp: String { return self._s[647]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[648]! } + public var Settings_Appearance: String { return self._s[649]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[652]! } + public var Watch_Location_Access: String { return self._s[653]! } + public var ShareMenu_CopyShareLink: String { return self._s[655]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[656]! } + public var Conversation_Theme: String { return self._s[658]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[657]!, self._r[657]!, [_0]) + return formatWithArgumentRanges(self._s[659]!, self._r[659]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[658]! } - public var Weekday_ShortWednesday: String { return self._s[659]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[660]! } - public var Undo_LeftGroup: String { return self._s[663]! } - public var Conversation_LinkDialogCopy: String { return self._s[664]! } - public var KeyCommand_FocusOnInputField: String { return self._s[666]! } - public var Contacts_SelectAll: String { return self._s[667]! } - public var Preview_SaveToCameraRoll: String { return self._s[668]! } - public var PrivacySettings_PasscodeOff: String { return self._s[669]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[670]! } - public var Wallpaper_Title: String { return self._s[671]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[672]! } - public var AccessDenied_Camera: String { return self._s[673]! } - public var Watch_Compose_CurrentLocation: String { return self._s[674]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[676]! } + public var Notifications_ClassicTones: String { return self._s[660]! } + public var Weekday_ShortWednesday: String { return self._s[661]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[662]! } + public var Undo_LeftGroup: String { return self._s[665]! } + public var Conversation_LinkDialogCopy: String { return self._s[666]! } + public var KeyCommand_FocusOnInputField: String { return self._s[668]! } + public var Contacts_SelectAll: String { return self._s[669]! } + public var Preview_SaveToCameraRoll: String { return self._s[670]! } + public var PrivacySettings_PasscodeOff: String { return self._s[671]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[672]! } + public var Wallpaper_Title: String { return self._s[673]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[674]! } + public var AccessDenied_Camera: String { return self._s[675]! } + public var Watch_Compose_CurrentLocation: String { return self._s[676]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[678]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[677]!, self._r[677]!, [_0]) + return formatWithArgumentRanges(self._s[679]!, self._r[679]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[678]! } - public var Passport_Language_ro: String { return self._s[679]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[680]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[680]! } + public var Passport_Language_ro: String { return self._s[681]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[682]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[681]!, self._r[681]!, [_0]) + return formatWithArgumentRanges(self._s[683]!, self._r[683]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[682]! } - public var State_ConnectingToProxy: String { return self._s[683]! } - public var Calls_RatingTitle: String { return self._s[684]! } - public var Generic_ErrorMoreInfo: String { return self._s[685]! } - public var Appearance_PreviewReplyText: String { return self._s[686]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[687]! } - public var SharedMedia_CategoryLinks: String { return self._s[688]! } - public var Calls_Missed: String { return self._s[689]! } - public var Cache_Photos: String { return self._s[693]! } - public var GroupPermission_NoAddMembers: String { return self._s[694]! } - public var ScheduledMessages_Title: String { return self._s[695]! } + public var Login_CancelPhoneVerification: String { return self._s[684]! } + public var State_ConnectingToProxy: String { return self._s[685]! } + public var Calls_RatingTitle: String { return self._s[686]! } + public var Generic_ErrorMoreInfo: String { return self._s[687]! } + public var Appearance_PreviewReplyText: String { return self._s[688]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[689]! } + public var SharedMedia_CategoryLinks: String { return self._s[690]! } + public var Calls_Missed: String { return self._s[691]! } + public var Cache_Photos: String { return self._s[695]! } + public var GroupPermission_NoAddMembers: String { return self._s[696]! } + public var ScheduledMessages_Title: String { return self._s[697]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[696]!, self._r[696]!, [_0]) + return formatWithArgumentRanges(self._s[698]!, self._r[698]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[697]! } - public var Settings_ProxyDisabled: String { return self._s[698]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[699]! } + public var Settings_ProxyDisabled: String { return self._s[700]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[701]!, self._r[701]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_0]) + return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_0]) } - public var Appearance_Title: String { return self._s[702]! } + public var Appearance_Title: String { return self._s[704]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_0]) + return formatWithArgumentRanges(self._s[706]!, self._r[706]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[705]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[706]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[707]! } - public var Preview_DeletePhoto: String { return self._s[708]! } - public var Appearance_AppIconFilledX: String { return self._s[709]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[710]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[707]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[708]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[709]! } + public var Preview_DeletePhoto: String { return self._s[710]! } + public var Appearance_AppIconFilledX: String { return self._s[711]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[712]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[711]!, self._r[711]!, [_0]) + return formatWithArgumentRanges(self._s[713]!, self._r[713]!, [_0]) } - public var Appearance_ThemePreview_Chat_1_ReplyText: String { return self._s[713]! } - public var Coub_TapForSound: String { return self._s[714]! } - public var Map_LocatingError: String { return self._s[715]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[717]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[718]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[719]! } - public var Passport_ForgottenPassword: String { return self._s[720]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[721]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[722]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[724]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[725]! } - public var Message_Location: String { return self._s[726]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[727]! } - public var Channel_Management_Title: String { return self._s[728]! } - public var DialogList_SearchSectionDialogs: String { return self._s[730]! } - public var Compose_NewChannel_Members: String { return self._s[731]! } + public var Coub_TapForSound: String { return self._s[715]! } + public var Map_LocatingError: String { return self._s[716]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[718]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[719]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[720]! } + public var Passport_ForgottenPassword: String { return self._s[721]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[722]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[723]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[725]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[726]! } + public var Message_Location: String { return self._s[727]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[728]! } + public var Channel_Management_Title: String { return self._s[729]! } + public var DialogList_SearchSectionDialogs: String { return self._s[731]! } + public var Compose_NewChannel_Members: String { return self._s[732]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[732]!, self._r[732]!, [_0]) + return formatWithArgumentRanges(self._s[733]!, self._r[733]!, [_0]) } - public var GroupInfo_Location: String { return self._s[733]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[734]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[735]! } - public var PhotoEditor_WarmthTool: String { return self._s[736]! } - public var Passport_Language_tr: String { return self._s[737]! } + public var GroupInfo_Location: String { return self._s[734]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[735]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[736]! } + public var PhotoEditor_WarmthTool: String { return self._s[737]! } + public var Passport_Language_tr: String { return self._s[738]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[738]!, self._r[738]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[739]!, self._r[739]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[740]! } - public var Watch_PhotoView_Title: String { return self._s[741]! } - public var Passport_Phone_Delete: String { return self._s[742]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[743]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[744]! } - public var GroupInfo_Permissions: String { return self._s[745]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[746]! } - public var Profile_ShareContactButton: String { return self._s[747]! } - public var ChatSettings_Other: String { return self._s[748]! } - public var UserInfo_NotificationsDisabled: String { return self._s[749]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[750]! } - public var LastSeen_WithinAMonth: String { return self._s[751]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[752]! } - public var Conversation_ReportGroupLocation: String { return self._s[753]! } - public var Conversation_EncryptionCanceled: String { return self._s[754]! } - public var MediaPicker_GroupDescription: String { return self._s[755]! } - public var WebSearch_Images: String { return self._s[756]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[741]! } + public var Watch_PhotoView_Title: String { return self._s[742]! } + public var Passport_Phone_Delete: String { return self._s[743]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[744]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[745]! } + public var GroupInfo_Permissions: String { return self._s[746]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[747]! } + public var Profile_ShareContactButton: String { return self._s[748]! } + public var ChatSettings_Other: String { return self._s[749]! } + public var UserInfo_NotificationsDisabled: String { return self._s[750]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[751]! } + public var LastSeen_WithinAMonth: String { return self._s[752]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[753]! } + public var Conversation_ReportGroupLocation: String { return self._s[754]! } + public var Conversation_EncryptionCanceled: String { return self._s[755]! } + public var MediaPicker_GroupDescription: String { return self._s[756]! } + public var WebSearch_Images: String { return self._s[757]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[757]!, self._r[757]!, [_0]) + return formatWithArgumentRanges(self._s[758]!, self._r[758]!, [_0]) } - public var Message_Photo: String { return self._s[758]! } - public var PasscodeSettings_HelpBottom: String { return self._s[759]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[760]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[761]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[762]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[763]! } - public var NotificationsSound_Calypso: String { return self._s[764]! } - public var Map_Map: String { return self._s[765]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[767]! } - public var ChatSettings_TextSizeUnits: String { return self._s[768]! } + public var Message_Photo: String { return self._s[759]! } + public var PasscodeSettings_HelpBottom: String { return self._s[760]! } + public var CreateTheme_ShortLink: String { return self._s[761]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[762]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[763]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[764]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[765]! } + public var NotificationsSound_Calypso: String { return self._s[766]! } + public var Map_Map: String { return self._s[767]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[769]! } + public var ChatSettings_TextSizeUnits: String { return self._s[770]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[769]!, self._r[769]!, [_0]) + return formatWithArgumentRanges(self._s[771]!, self._r[771]!, [_0]) } - public var Common_of: String { return self._s[770]! } - public var Conversation_ForwardContacts: String { return self._s[773]! } + public var Common_of: String { return self._s[772]! } + public var Conversation_ForwardContacts: String { return self._s[775]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_0]) + return formatWithArgumentRanges(self._s[777]!, self._r[777]!, [_0]) } - public var Passport_Language_hy: String { return self._s[776]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[777]! } - public var AutoDownloadSettings_Reset: String { return self._s[778]! } - public var Paint_ClearConfirm: String { return self._s[779]! } - public var Camera_VideoMode: String { return self._s[780]! } + public var Passport_Language_hy: String { return self._s[778]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[779]! } + public var AutoDownloadSettings_Reset: String { return self._s[780]! } + public var Paint_ClearConfirm: String { return self._s[781]! } + public var Camera_VideoMode: String { return self._s[782]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_0]) + return formatWithArgumentRanges(self._s[783]!, self._r[783]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[782]! } - public var Conversation_ViewBackground: String { return self._s[783]! } - public var Passport_Language_el: String { return self._s[784]! } - public var PhotoEditor_Original: String { return self._s[785]! } - public var Settings_FAQ_Button: String { return self._s[787]! } - public var Channel_Setup_PublicNoLink: String { return self._s[789]! } - public var Conversation_UnsupportedMedia: String { return self._s[790]! } - public var Conversation_SlideToCancel: String { return self._s[791]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[792]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[793]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[794]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[795]! } - public var AutoNightTheme_NotAvailable: String { return self._s[796]! } - public var Conversation_Owner: String { return self._s[797]! } - public var Common_Create: String { return self._s[798]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[799]! } - public var Localization_ChooseLanguage: String { return self._s[801]! } - public var Settings_Proxy: String { return self._s[804]! } - public var Privacy_TopPeersHelp: String { return self._s[805]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[806]! } - public var Chat_UnsendMyMessages: String { return self._s[807]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[784]! } + public var Conversation_ViewBackground: String { return self._s[785]! } + public var Passport_Language_el: String { return self._s[786]! } + public var PhotoEditor_Original: String { return self._s[787]! } + public var Settings_FAQ_Button: String { return self._s[789]! } + public var Channel_Setup_PublicNoLink: String { return self._s[791]! } + public var Conversation_UnsupportedMedia: String { return self._s[792]! } + public var Conversation_SlideToCancel: String { return self._s[793]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[794]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[795]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[796]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[797]! } + public var AutoNightTheme_NotAvailable: String { return self._s[798]! } + public var Conversation_Owner: String { return self._s[799]! } + public var Common_Create: String { return self._s[800]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[801]! } + public var Localization_ChooseLanguage: String { return self._s[803]! } + public var Settings_Proxy: String { return self._s[806]! } + public var Privacy_TopPeersHelp: String { return self._s[807]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[808]! } + public var Chat_UnsendMyMessages: String { return self._s[809]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[808]!, self._r[808]!, [_0]) + return formatWithArgumentRanges(self._s[810]!, self._r[810]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[809]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[811]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[811]!, self._r[811]!, [_0]) + return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[812]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[813]! } - public var Cache_Title: String { return self._s[814]! } + public var Contacts_SortedByPresence: String { return self._s[814]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[815]! } + public var Cache_Title: String { return self._s[816]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) + return formatWithArgumentRanges(self._s[817]!, self._r[817]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[816]! } - public var Channel_Moderator_Title: String { return self._s[817]! } - public var InstantPage_AutoNightTheme: String { return self._s[819]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[818]! } + public var Channel_Moderator_Title: String { return self._s[819]! } + public var InstantPage_AutoNightTheme: String { return self._s[821]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[822]!, self._r[822]!, [_1]) + return formatWithArgumentRanges(self._s[824]!, self._r[824]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[823]! } - public var Undo_Undo: String { return self._s[825]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[826]! } - public var TwoStepAuth_RemovePassword: String { return self._s[827]! } - public var Common_Delete: String { return self._s[828]! } - public var Contacts_AddPeopleNearby: String { return self._s[830]! } - public var Conversation_ContextMenuDelete: String { return self._s[831]! } - public var SocksProxySetup_Credentials: String { return self._s[832]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[834]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[837]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[838]! } - public var Passport_Language_id: String { return self._s[840]! } - public var WallpaperSearch_ColorTeal: String { return self._s[841]! } - public var ChannelIntro_Title: String { return self._s[842]! } + public var Passport_Scans_Upload: String { return self._s[825]! } + public var Undo_Undo: String { return self._s[827]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[828]! } + public var TwoStepAuth_RemovePassword: String { return self._s[829]! } + public var Common_Delete: String { return self._s[830]! } + public var Contacts_AddPeopleNearby: String { return self._s[832]! } + public var Conversation_ContextMenuDelete: String { return self._s[833]! } + public var SocksProxySetup_Credentials: String { return self._s[834]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[836]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[839]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[840]! } + public var Passport_Language_id: String { return self._s[842]! } + public var WallpaperSearch_ColorTeal: String { return self._s[843]! } + public var ChannelIntro_Title: String { return self._s[844]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[843]!, self._r[843]!, [_0]) + return formatWithArgumentRanges(self._s[845]!, self._r[845]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[845]! } - public var VoiceOver_Chat_Reply: String { return self._s[846]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[847]! } - public var Channel_Info_Description: String { return self._s[848]! } - public var Stickers_FavoriteStickers: String { return self._s[849]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[850]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[851]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[852]! } - public var Group_PublicLink_Placeholder: String { return self._s[853]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[854]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[847]! } + public var VoiceOver_Chat_Reply: String { return self._s[848]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[849]! } + public var Channel_Info_Description: String { return self._s[850]! } + public var Stickers_FavoriteStickers: String { return self._s[851]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[852]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[853]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[854]! } + public var Group_PublicLink_Placeholder: String { return self._s[855]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[856]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[855]!, self._r[855]!, [_1]) + return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_1]) } - public var TextFormat_Underline: String { return self._s[856]! } + public var TextFormat_Underline: String { return self._s[858]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_1, _2]) + return formatWithArgumentRanges(self._s[859]!, self._r[859]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_0]) + return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[859]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[861]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1, _2]) + return formatWithArgumentRanges(self._s[862]!, self._r[862]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[861]! } - public var Passport_Language_uk: String { return self._s[862]! } - public var StickerPack_HideStickers: String { return self._s[864]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[865]! } + public var GroupPermission_Delete: String { return self._s[863]! } + public var Passport_Language_uk: String { return self._s[864]! } + public var StickerPack_HideStickers: String { return self._s[866]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[867]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[866]!, self._r[866]!, [_1, _2]) + return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[867]! } + public var Activity_UploadingVideoMessage: String { return self._s[869]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_0]) + return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[869]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[870]! } - public var Settings_CallSettings: String { return self._s[871]! } - public var Camera_SquareMode: String { return self._s[872]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[873]! } - public var GroupInfo_SharedMediaNone: String { return self._s[874]! } + public var Channel_TitleInfo: String { return self._s[871]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[872]! } + public var Settings_CallSettings: String { return self._s[873]! } + public var Camera_SquareMode: String { return self._s[874]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[875]! } + public var GroupInfo_SharedMediaNone: String { return self._s[876]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_1]) + return formatWithArgumentRanges(self._s[877]!, self._r[877]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[876]! } - public var Application_Update: String { return self._s[878]! } - public var Month_ShortJanuary: String { return self._s[879]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[880]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[881]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[882]! } - public var Passport_Address_Street2Placeholder: String { return self._s[883]! } + public var Bot_GenericBotStatus: String { return self._s[878]! } + public var Application_Update: String { return self._s[880]! } + public var Month_ShortJanuary: String { return self._s[881]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[882]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[883]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[884]! } + public var Passport_Address_Street2Placeholder: String { return self._s[885]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_0]) + return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[885]! } - public var Appearance_PreviewOutgoingText: String { return self._s[886]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[887]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[889]! } - public var Map_Directions: String { return self._s[890]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[892]! } - public var Appearance_ThemeDay: String { return self._s[893]! } - public var LogoutOptions_LogOut: String { return self._s[894]! } - public var Group_PublicLink_Title: String { return self._s[896]! } - public var Channel_AddBotErrorNoRights: String { return self._s[897]! } - public var Passport_Identity_AddPassport: String { return self._s[898]! } - public var LocalGroup_ButtonTitle: String { return self._s[899]! } - public var Call_Message: String { return self._s[900]! } - public var PhotoEditor_ExposureTool: String { return self._s[901]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[903]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[905]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[906]! } - public var Appearance_Preview: String { return self._s[907]! } - public var Compose_ChannelMembers: String { return self._s[908]! } - public var Conversation_DeleteManyMessages: String { return self._s[909]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[910]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[911]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[912]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[915]! } - public var Conversation_UpdateTelegram: String { return self._s[916]! } + public var NetworkUsageSettings_Cellular: String { return self._s[887]! } + public var Appearance_PreviewOutgoingText: String { return self._s[888]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[889]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[891]! } + public var Map_Directions: String { return self._s[892]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[894]! } + public var Appearance_ThemeDay: String { return self._s[895]! } + public var LogoutOptions_LogOut: String { return self._s[896]! } + public var Group_PublicLink_Title: String { return self._s[898]! } + public var Channel_AddBotErrorNoRights: String { return self._s[899]! } + public var Passport_Identity_AddPassport: String { return self._s[900]! } + public var LocalGroup_ButtonTitle: String { return self._s[901]! } + public var Call_Message: String { return self._s[902]! } + public var PhotoEditor_ExposureTool: String { return self._s[903]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[905]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[907]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[908]! } + public var Appearance_Preview: String { return self._s[909]! } + public var Compose_ChannelMembers: String { return self._s[910]! } + public var Conversation_DeleteManyMessages: String { return self._s[911]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[912]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[913]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[914]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[917]! } + public var Conversation_UpdateTelegram: String { return self._s[918]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[917]!, self._r[917]!, [_0]) + return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[918]!, self._r[918]!, [_1]) + return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[919]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[920]! } + public var GroupInfo_Administrators_Title: String { return self._s[921]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[922]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_0]) + return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_0]) } - public var Tour_Title3: String { return self._s[922]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[923]! } - public var Clipboard_SendPhoto: String { return self._s[927]! } - public var MediaPicker_Videos: String { return self._s[928]! } - public var Passport_Email_Title: String { return self._s[929]! } + public var Tour_Title3: String { return self._s[924]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[925]! } + public var Clipboard_SendPhoto: String { return self._s[929]! } + public var MediaPicker_Videos: String { return self._s[930]! } + public var Passport_Email_Title: String { return self._s[931]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[930]!, self._r[930]!, [_0]) + return formatWithArgumentRanges(self._s[932]!, self._r[932]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[931]! } - public var Conversation_MessageDialogDelete: String { return self._s[932]! } - public var Privacy_Calls_CustomHelp: String { return self._s[934]! } - public var Message_Wallpaper: String { return self._s[935]! } - public var MemberSearch_BotSection: String { return self._s[936]! } - public var GroupInfo_SetSound: String { return self._s[937]! } - public var Core_ServiceUserStatus: String { return self._s[938]! } - public var LiveLocationUpdated_JustNow: String { return self._s[939]! } - public var Call_StatusFailed: String { return self._s[940]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[941]! } - public var TwoStepAuth_SetPassword: String { return self._s[942]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[943]! } + public var StickerPacksSettings_Title: String { return self._s[933]! } + public var Conversation_MessageDialogDelete: String { return self._s[934]! } + public var Privacy_Calls_CustomHelp: String { return self._s[936]! } + public var Message_Wallpaper: String { return self._s[937]! } + public var MemberSearch_BotSection: String { return self._s[938]! } + public var GroupInfo_SetSound: String { return self._s[939]! } + public var Core_ServiceUserStatus: String { return self._s[940]! } + public var LiveLocationUpdated_JustNow: String { return self._s[941]! } + public var Call_StatusFailed: String { return self._s[942]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[943]! } + public var TwoStepAuth_SetPassword: String { return self._s[944]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[945]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[945]!, self._r[945]!, [_0]) + return formatWithArgumentRanges(self._s[947]!, self._r[947]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[946]! } - public var Profile_Username: String { return self._s[947]! } - public var Bot_DescriptionTitle: String { return self._s[948]! } - public var MaskStickerSettings_Title: String { return self._s[949]! } - public var SharedMedia_CategoryOther: String { return self._s[950]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[951]! } - public var Common_NotNow: String { return self._s[952]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[953]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[954]! } - public var Map_Location: String { return self._s[955]! } - public var Invitation_JoinGroup: String { return self._s[956]! } - public var AutoDownloadSettings_Title: String { return self._s[958]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[959]! } - public var Channel_ErrorAddBlocked: String { return self._s[960]! } - public var Conversation_UnblockUser: String { return self._s[961]! } - public var Watch_Bot_Restart: String { return self._s[962]! } - public var TwoStepAuth_Title: String { return self._s[963]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[964]! } - public var Checkout_ShippingMethod: String { return self._s[965]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[966]! } + public var Calls_SubmitRating: String { return self._s[948]! } + public var Profile_Username: String { return self._s[949]! } + public var Bot_DescriptionTitle: String { return self._s[950]! } + public var MaskStickerSettings_Title: String { return self._s[951]! } + public var SharedMedia_CategoryOther: String { return self._s[952]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[953]! } + public var Common_NotNow: String { return self._s[954]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[955]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[956]! } + public var Map_Location: String { return self._s[957]! } + public var Invitation_JoinGroup: String { return self._s[958]! } + public var AutoDownloadSettings_Title: String { return self._s[960]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[961]! } + public var Channel_ErrorAddBlocked: String { return self._s[962]! } + public var Conversation_UnblockUser: String { return self._s[963]! } + public var Watch_Bot_Restart: String { return self._s[964]! } + public var TwoStepAuth_Title: String { return self._s[965]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[966]! } + public var Checkout_ShippingMethod: String { return self._s[967]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[968]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[967]!, self._r[967]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_0]) + return formatWithArgumentRanges(self._s[971]!, self._r[971]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[970]!, self._r[970]!, [_0]) + return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[971]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[972]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[973]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[974]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[975]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[976]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[977]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[978]! } - public var Checkout_PaymentMethod_Title: String { return self._s[979]! } - public var SocksProxySetup_Connection: String { return self._s[980]! } - public var Group_MessagePhotoRemoved: String { return self._s[981]! } - public var Channel_Stickers_NotFound: String { return self._s[983]! } - public var Group_About_Help: String { return self._s[984]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[985]! } - public var PeopleNearby_Title: String { return self._s[987]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[973]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[974]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[975]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[976]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[977]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[978]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[979]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[980]! } + public var Checkout_PaymentMethod_Title: String { return self._s[981]! } + public var SocksProxySetup_Connection: String { return self._s[982]! } + public var Group_MessagePhotoRemoved: String { return self._s[983]! } + public var Channel_Stickers_NotFound: String { return self._s[985]! } + public var Group_About_Help: String { return self._s[986]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[987]! } + public var PeopleNearby_Title: String { return self._s[989]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[988]!, self._r[988]!, [_1]) + return formatWithArgumentRanges(self._s[990]!, self._r[990]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[990]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[991]! } - public var SocksProxySetup_Password: String { return self._s[992]! } - public var Notifications_PermissionsEnable: String { return self._s[993]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[995]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[992]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[993]! } + public var SocksProxySetup_Password: String { return self._s[994]! } + public var Notifications_PermissionsEnable: String { return self._s[995]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[997]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[996]!, self._r[996]!, [_1]) + return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_0]) + return formatWithArgumentRanges(self._s[1000]!, self._r[1000]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[999]! } - public var ArchivedPacksAlert_Title: String { return self._s[1000]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1001]! } + public var ArchivedPacksAlert_Title: String { return self._s[1002]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1003]!, self._r[1003]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1002]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1004]! } - public var Conversation_StatusTyping: String { return self._s[1005]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1006]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1007]! } - public var UserInfo_CreateNewContact: String { return self._s[1008]! } - public var Passport_Identity_FrontSide: String { return self._s[1009]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1010]! } - public var Calls_CallTabTitle: String { return self._s[1011]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1012]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1004]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1006]! } + public var Conversation_StatusTyping: String { return self._s[1007]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1008]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1009]! } + public var UserInfo_CreateNewContact: String { return self._s[1010]! } + public var Passport_Identity_FrontSide: String { return self._s[1011]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1012]! } + public var Calls_CallTabTitle: String { return self._s[1013]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1014]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1014]!, self._r[1014]!, [_0]) + return formatWithArgumentRanges(self._s[1016]!, self._r[1016]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1015]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1016]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1017]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1018]! } - public var Paint_Stickers: String { return self._s[1019]! } - public var Privacy_GroupsAndChannels: String { return self._s[1020]! } - public var UserInfo_AddContact: String { return self._s[1022]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1017]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1018]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1019]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1020]! } + public var Paint_Stickers: String { return self._s[1021]! } + public var Privacy_GroupsAndChannels: String { return self._s[1022]! } + public var UserInfo_AddContact: String { return self._s[1024]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1023]!, self._r[1023]!, [_0]) + return formatWithArgumentRanges(self._s[1025]!, self._r[1025]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1025]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1027]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_0]) + return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1028]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1029]! } - public var BlockedUsers_BlockUser: String { return self._s[1030]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1031]! } - public var MediaPicker_UngroupDescription: String { return self._s[1032]! } - public var Watch_NoConnection: String { return self._s[1033]! } - public var Month_GenSeptember: String { return self._s[1034]! } - public var Conversation_ViewGroup: String { return self._s[1035]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1038]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1039]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1040]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1041]! } - public var MediaPicker_CameraRoll: String { return self._s[1043]! } - public var Month_GenAugust: String { return self._s[1044]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1045]! } - public var SharedMedia_EmptyText: String { return self._s[1046]! } - public var Map_ShareLiveLocation: String { return self._s[1047]! } - public var Calls_All: String { return self._s[1048]! } - public var Appearance_ThemeNight: String { return self._s[1051]! } - public var Conversation_HoldForAudio: String { return self._s[1052]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1055]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1056]! } - public var SocksProxySetup_Secret: String { return self._s[1057]! } + public var DialogList_NoMessagesTitle: String { return self._s[1030]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1031]! } + public var BlockedUsers_BlockUser: String { return self._s[1032]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1033]! } + public var MediaPicker_UngroupDescription: String { return self._s[1034]! } + public var Watch_NoConnection: String { return self._s[1035]! } + public var Month_GenSeptember: String { return self._s[1036]! } + public var Conversation_ViewGroup: String { return self._s[1037]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1040]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1041]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1042]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1043]! } + public var MediaPicker_CameraRoll: String { return self._s[1045]! } + public var Month_GenAugust: String { return self._s[1046]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1047]! } + public var SharedMedia_EmptyText: String { return self._s[1048]! } + public var Map_ShareLiveLocation: String { return self._s[1049]! } + public var Calls_All: String { return self._s[1050]! } + public var Appearance_ThemeNight: String { return self._s[1053]! } + public var Conversation_HoldForAudio: String { return self._s[1054]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1057]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1058]! } + public var SocksProxySetup_Secret: String { return self._s[1059]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1058]!, self._r[1058]!, [_0]) + return formatWithArgumentRanges(self._s[1060]!, self._r[1060]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1060]! } - public var Conversation_Location: String { return self._s[1061]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1062]! } + public var Conversation_Location: String { return self._s[1063]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1064]!, self._r[1064]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1064]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1065]! } - public var Notifications_PermissionsText: String { return self._s[1066]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1067]! } - public var Call_Flip: String { return self._s[1068]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1070]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1072]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1074]! } - public var Channel_TooMuchBots: String { return self._s[1076]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1077]! } - public var Login_InvalidCodeError: String { return self._s[1078]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1079]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1066]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1067]! } + public var Notifications_PermissionsText: String { return self._s[1068]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1069]! } + public var Call_Flip: String { return self._s[1070]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1072]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1074]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1076]! } + public var Channel_TooMuchBots: String { return self._s[1078]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1079]! } + public var Login_InvalidCodeError: String { return self._s[1080]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1081]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1080]!, self._r[1080]!, [_0]) + return formatWithArgumentRanges(self._s[1082]!, self._r[1082]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1081]!, self._r[1081]!, [_0]) + return formatWithArgumentRanges(self._s[1083]!, self._r[1083]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1082]! } - public var Call_CallInProgressTitle: String { return self._s[1083]! } - public var Month_ShortSeptember: String { return self._s[1084]! } - public var Watch_ChannelInfo_Title: String { return self._s[1085]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1088]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1089]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1090]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1091]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1092]! } - public var PhotoEditor_CropReset: String { return self._s[1093]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1095]! } - public var Channel_Management_LabelEditor: String { return self._s[1096]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1098]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1099]! } - public var UserInfo_Title: String { return self._s[1100]! } - public var ChatList_HideAction: String { return self._s[1101]! } - public var AccessDenied_Title: String { return self._s[1102]! } - public var DialogList_SearchLabel: String { return self._s[1103]! } - public var Group_Setup_HistoryHidden: String { return self._s[1104]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1105]! } - public var State_Updating: String { return self._s[1107]! } - public var Contacts_TabTitle: String { return self._s[1108]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1110]! } - public var GroupInfo_GroupHistory: String { return self._s[1111]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1112]! } - public var Wallpaper_SetColor: String { return self._s[1113]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1114]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1115]! } - public var Chat_AttachmentLimitReached: String { return self._s[1116]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1117]! } - public var Contacts_NotRegisteredSection: String { return self._s[1118]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1084]! } + public var Call_CallInProgressTitle: String { return self._s[1085]! } + public var Month_ShortSeptember: String { return self._s[1086]! } + public var Watch_ChannelInfo_Title: String { return self._s[1087]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1090]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1091]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1092]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1093]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1094]! } + public var PhotoEditor_CropReset: String { return self._s[1095]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1097]! } + public var Channel_Management_LabelEditor: String { return self._s[1098]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1100]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1101]! } + public var UserInfo_Title: String { return self._s[1102]! } + public var ChatList_HideAction: String { return self._s[1103]! } + public var AccessDenied_Title: String { return self._s[1104]! } + public var DialogList_SearchLabel: String { return self._s[1105]! } + public var Group_Setup_HistoryHidden: String { return self._s[1106]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1107]! } + public var State_Updating: String { return self._s[1109]! } + public var Contacts_TabTitle: String { return self._s[1110]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1112]! } + public var GroupInfo_GroupHistory: String { return self._s[1113]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1114]! } + public var Wallpaper_SetColor: String { return self._s[1115]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1116]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1117]! } + public var Chat_AttachmentLimitReached: String { return self._s[1118]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1119]! } + public var Contacts_NotRegisteredSection: String { return self._s[1120]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1119]!, self._r[1119]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1121]!, self._r[1121]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1120]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1121]! } - public var SocksProxySetup_Connecting: String { return self._s[1122]! } - public var ExplicitContent_AlertChannel: String { return self._s[1123]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1124]! } - public var Conversation_Contact: String { return self._s[1125]! } - public var Login_CodeExpired: String { return self._s[1126]! } - public var Passport_DiscardMessageAction: String { return self._s[1127]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1128]! } + public var Paint_Clear: String { return self._s[1122]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1123]! } + public var SocksProxySetup_Connecting: String { return self._s[1124]! } + public var ExplicitContent_AlertChannel: String { return self._s[1125]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1126]! } + public var Conversation_Contact: String { return self._s[1127]! } + public var Login_CodeExpired: String { return self._s[1128]! } + public var Passport_DiscardMessageAction: String { return self._s[1129]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1130]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1129]!, self._r[1129]!, [_0]) + return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1130]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1131]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1132]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1133]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_0]) + return formatWithArgumentRanges(self._s[1134]!, self._r[1134]!, [_0]) } - public var Month_ShortApril: String { return self._s[1133]! } - public var AuthSessions_CurrentSession: String { return self._s[1134]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1137]! } - public var WallpaperPreview_CropTopText: String { return self._s[1139]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1140]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1141]! } + public var Month_ShortApril: String { return self._s[1135]! } + public var AuthSessions_CurrentSession: String { return self._s[1136]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1139]! } + public var WallpaperPreview_CropTopText: String { return self._s[1141]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1142]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1143]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1142]!, self._r[1142]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1144]!, self._r[1144]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1143]! } - public var Channel_Setup_TypePrivate: String { return self._s[1145]! } - public var Forward_ChannelReadOnly: String { return self._s[1148]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1149]! } - public var AddContact_SharedContactException: String { return self._s[1150]! } - public var UserInfo_BotPrivacy: String { return self._s[1152]! } - public var Notification_PassportValueEmail: String { return self._s[1153]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1154]! } - public var GroupPermission_NewTitle: String { return self._s[1155]! } - public var CallFeedback_ReasonDropped: String { return self._s[1156]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1157]! } - public var Channel_SignMessages_Help: String { return self._s[1159]! } - public var Undo_ChatDeleted: String { return self._s[1161]! } - public var Conversation_ChatBackground: String { return self._s[1162]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1163]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1164]! } - public var Passport_Language_pt: String { return self._s[1165]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1166]! } - public var NotificationsSound_Popcorn: String { return self._s[1169]! } - public var AutoNightTheme_Disabled: String { return self._s[1170]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1171]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1172]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1173]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1174]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1145]! } + public var Channel_Setup_TypePrivate: String { return self._s[1147]! } + public var Forward_ChannelReadOnly: String { return self._s[1150]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1151]! } + public var AddContact_SharedContactException: String { return self._s[1152]! } + public var UserInfo_BotPrivacy: String { return self._s[1154]! } + public var Notification_PassportValueEmail: String { return self._s[1155]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1156]! } + public var GroupPermission_NewTitle: String { return self._s[1157]! } + public var CallFeedback_ReasonDropped: String { return self._s[1158]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1159]! } + public var Channel_SignMessages_Help: String { return self._s[1161]! } + public var Undo_ChatDeleted: String { return self._s[1163]! } + public var Conversation_ChatBackground: String { return self._s[1164]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1165]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1166]! } + public var Passport_Language_pt: String { return self._s[1167]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1168]! } + public var NotificationsSound_Popcorn: String { return self._s[1171]! } + public var AutoNightTheme_Disabled: String { return self._s[1172]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1173]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1174]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1175]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1176]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1175]!, self._r[1175]!, [_0]) + return formatWithArgumentRanges(self._s[1177]!, self._r[1177]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1176]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1177]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1179]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1178]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1179]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1181]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1180]!, self._r[1180]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1182]!, self._r[1182]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1183]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1184]! } - public var Compose_NewEncryptedChat: String { return self._s[1185]! } - public var Login_CodeFloodError: String { return self._s[1186]! } - public var Calls_TabTitle: String { return self._s[1187]! } - public var Privacy_ProfilePhoto: String { return self._s[1188]! } - public var Passport_Language_he: String { return self._s[1189]! } + public var SocksProxySetup_Hostname: String { return self._s[1185]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1186]! } + public var Compose_NewEncryptedChat: String { return self._s[1187]! } + public var Login_CodeFloodError: String { return self._s[1188]! } + public var Calls_TabTitle: String { return self._s[1189]! } + public var Privacy_ProfilePhoto: String { return self._s[1190]! } + public var Passport_Language_he: String { return self._s[1191]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1190]!, self._r[1190]!, [_0]) - } - public var GroupPermission_Title: String { return self._s[1191]! } - public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1192]!, self._r[1192]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1193]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1194]! } - public var Tour_Text1: String { return self._s[1195]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1196]! } - public var Month_ShortFebruary: String { return self._s[1197]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1198]! } - public var NotificationsSound_Glass: String { return self._s[1199]! } - public var Appearance_ThemeNightBlue: String { return self._s[1200]! } - public var CheckoutInfo_Pay: String { return self._s[1201]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1203]! } - public var Call_CallAgain: String { return self._s[1205]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1206]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1207]! } - public var Passport_InvalidPasswordError: String { return self._s[1208]! } - public var Watch_Message_Game: String { return self._s[1209]! } - public var Stickers_Install: String { return self._s[1210]! } - public var VoiceOver_Chat_Message: String { return self._s[1211]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1212]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1214]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1215]! } - public var AuthSessions_OtherSessions: String { return self._s[1216]! } - public var Channel_Username_Help: String { return self._s[1217]! } - public var Camera_Title: String { return self._s[1218]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1220]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1221]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1222]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1223]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1224]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1225]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1226]! } - public var Conversation_RestrictedStickers: String { return self._s[1227]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1229]! } - public var UserInfo_TelegramCall: String { return self._s[1231]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1232]! } - public var CreatePoll_OptionsHeader: String { return self._s[1233]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1234]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1235]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1236]! } - public var Appearance_ThemePreview_Chat_1_ReplyName: String { return self._s[1237]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1238]! } + public var GroupPermission_Title: String { return self._s[1193]! } + public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1194]!, self._r[1194]!, [_0]) + } + public var GroupPermission_NoChangeInfo: String { return self._s[1195]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1196]! } + public var Tour_Text1: String { return self._s[1197]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1198]! } + public var Month_ShortFebruary: String { return self._s[1199]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1200]! } + public var NotificationsSound_Glass: String { return self._s[1201]! } + public var Appearance_ThemeNightBlue: String { return self._s[1202]! } + public var CheckoutInfo_Pay: String { return self._s[1203]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1205]! } + public var Call_CallAgain: String { return self._s[1207]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1208]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1209]! } + public var Passport_InvalidPasswordError: String { return self._s[1210]! } + public var Watch_Message_Game: String { return self._s[1211]! } + public var Stickers_Install: String { return self._s[1212]! } + public var VoiceOver_Chat_Message: String { return self._s[1213]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1214]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1216]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1217]! } + public var AuthSessions_OtherSessions: String { return self._s[1218]! } + public var Channel_Username_Help: String { return self._s[1219]! } + public var Camera_Title: String { return self._s[1220]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1222]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1223]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1224]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1225]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1226]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1227]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1228]! } + public var Conversation_RestrictedStickers: String { return self._s[1229]! } + public var CreateTheme_Preview: String { return self._s[1230]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1232]! } + public var UserInfo_TelegramCall: String { return self._s[1234]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1235]! } + public var CreatePoll_OptionsHeader: String { return self._s[1236]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1237]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1238]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1239]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1240]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1239]!, self._r[1239]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1241]!, self._r[1241]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1240]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1241]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1242]! } - public var Conversation_MessageDialogRetry: String { return self._s[1243]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1244]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1245]! } - public var Group_Setup_TypeHeader: String { return self._s[1246]! } - public var Paint_RecentStickers: String { return self._s[1247]! } - public var PhotoEditor_GrainTool: String { return self._s[1248]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1249]! } - public var EmptyGroupInfo_Line4: String { return self._s[1250]! } - public var Watch_AuthRequired: String { return self._s[1252]! } + public var Settings_SaveEditedPhotos: String { return self._s[1242]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1243]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1244]! } + public var Conversation_MessageDialogRetry: String { return self._s[1245]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1246]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1247]! } + public var Group_Setup_TypeHeader: String { return self._s[1248]! } + public var Paint_RecentStickers: String { return self._s[1249]! } + public var PhotoEditor_GrainTool: String { return self._s[1250]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1251]! } + public var EmptyGroupInfo_Line4: String { return self._s[1252]! } + public var Watch_AuthRequired: String { return self._s[1254]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1253]!, self._r[1253]!, [_0]) + return formatWithArgumentRanges(self._s[1255]!, self._r[1255]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1254]! } - public var ChannelIntro_Text: String { return self._s[1255]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1256]! } - public var GroupPermission_NoSendMedia: String { return self._s[1257]! } - public var Calls_AddTab: String { return self._s[1258]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1259]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1260]! } - public var Notification_MessageLifetime1d: String { return self._s[1261]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1262]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1263]! } - public var Passport_Identity_GenderFemale: String { return self._s[1264]! } - public var BlockedUsers_BlockTitle: String { return self._s[1265]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1256]! } + public var ChannelIntro_Text: String { return self._s[1257]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1258]! } + public var GroupPermission_NoSendMedia: String { return self._s[1259]! } + public var Calls_AddTab: String { return self._s[1260]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1261]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1262]! } + public var Notification_MessageLifetime1d: String { return self._s[1263]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1264]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1265]! } + public var Passport_Identity_GenderFemale: String { return self._s[1266]! } + public var BlockedUsers_BlockTitle: String { return self._s[1267]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1266]!, self._r[1266]!, [_1]) + return formatWithArgumentRanges(self._s[1268]!, self._r[1268]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1267]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1268]! } - public var ChatList_ArchiveAction: String { return self._s[1269]! } - public var AutoNightTheme_Scheduled: String { return self._s[1270]! } + public var Weekday_Yesterday: String { return self._s[1269]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1270]! } + public var ChatList_ArchiveAction: String { return self._s[1271]! } + public var AutoNightTheme_Scheduled: String { return self._s[1272]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1272]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1274]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1275]!, self._r[1275]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1274]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1275]! } + public var CreatePoll_Create: String { return self._s[1276]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1277]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1276]!, self._r[1276]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1278]!, self._r[1278]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1277]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1278]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1280]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1279]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1280]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1282]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_1]) + return formatWithArgumentRanges(self._s[1283]!, self._r[1283]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1282]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1283]! } + public var Preview_OpenInInstagram: String { return self._s[1284]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1285]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1284]!, self._r[1284]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1286]!, self._r[1286]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1286]! } - public var ArchivedChats_IntroText3: String { return self._s[1287]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1288]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1289]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1290]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1288]! } + public var ArchivedChats_IntroText3: String { return self._s[1289]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1290]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1291]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1292]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1291]!, self._r[1291]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1293]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1294]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1295]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1296]! } - public var Gif_NoGifsFound: String { return self._s[1297]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1298]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1299]! } - public var GroupInfo_ActionPromote: String { return self._s[1300]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1301]! } - public var GroupInfo_Permissions_Title: String { return self._s[1302]! } - public var Permissions_ContactsText_v0: String { return self._s[1303]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1304]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1307]! } - public var Passport_FieldEmailHelp: String { return self._s[1308]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1295]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1296]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1297]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1298]! } + public var Gif_NoGifsFound: String { return self._s[1299]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1300]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1301]! } + public var GroupInfo_ActionPromote: String { return self._s[1302]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1303]! } + public var GroupInfo_Permissions_Title: String { return self._s[1304]! } + public var Permissions_ContactsText_v0: String { return self._s[1305]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1306]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1309]! } + public var Passport_FieldEmailHelp: String { return self._s[1310]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1309]!, self._r[1309]!, [_0]) + return formatWithArgumentRanges(self._s[1311]!, self._r[1311]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1310]! } - public var Weekday_ShortSaturday: String { return self._s[1311]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1312]! } - public var Watch_Conversation_UserInfo: String { return self._s[1313]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1314]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1315]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1316]! } - public var PhotoEditor_VignetteTool: String { return self._s[1317]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1318]! } - public var Passport_Language_et: String { return self._s[1319]! } - public var AppUpgrade_Running: String { return self._s[1320]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1322]! } - public var Passport_Language_bg: String { return self._s[1323]! } - public var Stickers_NoStickersFound: String { return self._s[1325]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1312]! } + public var Weekday_ShortSaturday: String { return self._s[1313]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1314]! } + public var Watch_Conversation_UserInfo: String { return self._s[1315]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1316]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1317]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1318]! } + public var PhotoEditor_VignetteTool: String { return self._s[1319]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1320]! } + public var Passport_Language_et: String { return self._s[1321]! } + public var AppUpgrade_Running: String { return self._s[1322]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1324]! } + public var Passport_Language_bg: String { return self._s[1325]! } + public var Stickers_NoStickersFound: String { return self._s[1327]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1329]!, self._r[1329]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1328]!, self._r[1328]!, [_0]) + return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_0]) } - public var Settings_About: String { return self._s[1329]! } + public var Settings_About: String { return self._s[1331]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1332]! } - public var Group_ErrorAddBlocked: String { return self._s[1333]! } + public var KeyCommand_NewMessage: String { return self._s[1334]! } + public var Group_ErrorAddBlocked: String { return self._s[1335]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_0]) + return formatWithArgumentRanges(self._s[1336]!, self._r[1336]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1335]! } - public var ReportGroupLocation_Title: String { return self._s[1336]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1337]! } - public var Cache_ClearProgress: String { return self._s[1338]! } + public var Map_LocationTitle: String { return self._s[1337]! } + public var ReportGroupLocation_Title: String { return self._s[1338]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1339]! } + public var Cache_ClearProgress: String { return self._s[1340]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1339]!, self._r[1339]!, [_0]) + return formatWithArgumentRanges(self._s[1341]!, self._r[1341]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1340]! } - public var Passport_UpdateRequiredError: String { return self._s[1341]! } + public var GroupRemoved_AddToGroup: String { return self._s[1342]! } + public var Passport_UpdateRequiredError: String { return self._s[1343]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_1]) + return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1344]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1345]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1346]! } - public var Passport_Language_ka: String { return self._s[1347]! } - public var Call_Decline: String { return self._s[1348]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1349]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1346]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1347]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1348]! } + public var Passport_Language_ka: String { return self._s[1349]! } + public var Call_Decline: String { return self._s[1350]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1351]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_0]) + return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1353]! } + public var CallFeedback_Send: String { return self._s[1355]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1356]!, self._r[1356]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1355]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1357]! } - public var Passport_DeletePassport: String { return self._s[1358]! } - public var Appearance_AppIconFilled: String { return self._s[1359]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1360]! } - public var Month_ShortDecember: String { return self._s[1361]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1363]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1357]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1359]! } + public var Passport_DeletePassport: String { return self._s[1360]! } + public var Appearance_AppIconFilled: String { return self._s[1361]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1362]! } + public var Month_ShortDecember: String { return self._s[1363]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1365]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1364]!, self._r[1364]!, [_0]) + return formatWithArgumentRanges(self._s[1366]!, self._r[1366]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1365]! } - public var Conversation_EncryptedDescription1: String { return self._s[1366]! } - public var Conversation_EncryptedDescription2: String { return self._s[1367]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1368]! } - public var Conversation_EncryptedDescription3: String { return self._s[1369]! } - public var PhotoEditor_SharpenTool: String { return self._s[1370]! } + public var Channel_Stickers_Searching: String { return self._s[1367]! } + public var Conversation_EncryptedDescription1: String { return self._s[1368]! } + public var Conversation_EncryptedDescription2: String { return self._s[1369]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1370]! } + public var Conversation_EncryptedDescription3: String { return self._s[1371]! } + public var PhotoEditor_SharpenTool: String { return self._s[1372]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_0]) + return formatWithArgumentRanges(self._s[1373]!, self._r[1373]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1373]! } - public var Channel_Members_AddMembers: String { return self._s[1374]! } - public var Wallpaper_Search: String { return self._s[1375]! } - public var Weekday_Friday: String { return self._s[1376]! } - public var Privacy_ContactsSync: String { return self._s[1377]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1378]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1379]! } + public var Conversation_EncryptedDescription4: String { return self._s[1375]! } + public var Channel_Members_AddMembers: String { return self._s[1376]! } + public var Wallpaper_Search: String { return self._s[1377]! } + public var Weekday_Friday: String { return self._s[1378]! } + public var Privacy_ContactsSync: String { return self._s[1379]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1380]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1381]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_0]) + return formatWithArgumentRanges(self._s[1382]!, self._r[1382]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1381]! } - public var Passport_Identity_GenderMale: String { return self._s[1382]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1383]! } + public var Passport_Identity_GenderMale: String { return self._s[1384]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1383]!, self._r[1383]!, [_0]) + return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1384]! } - public var Conversation_JumpToDate: String { return self._s[1385]! } - public var Contacts_GlobalSearch: String { return self._s[1386]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1387]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1388]! } - public var Profile_MessageLifetime1d: String { return self._s[1389]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1386]! } + public var Conversation_JumpToDate: String { return self._s[1387]! } + public var Contacts_GlobalSearch: String { return self._s[1388]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1389]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1390]! } + public var Profile_MessageLifetime1d: String { return self._s[1391]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1390]!, self._r[1390]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1392]!, self._r[1392]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1393]! } + public var StickerPack_BuiltinPackName: String { return self._s[1395]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1396]!, self._r[1396]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1395]! } - public var Passport_InfoTitle: String { return self._s[1397]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1398]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1397]! } + public var Passport_InfoTitle: String { return self._s[1399]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1400]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_0]) + return formatWithArgumentRanges(self._s[1404]!, self._r[1404]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1403]!, self._r[1403]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1405]!, self._r[1405]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1404]! } - public var Profile_BotInfo: String { return self._s[1405]! } - public var Watch_Compose_CreateMessage: String { return self._s[1406]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1407]! } - public var Month_ShortNovember: String { return self._s[1408]! } - public var Conversation_ScamWarning: String { return self._s[1409]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1410]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1411]! } - public var NotificationsSound_Chime: String { return self._s[1412]! } - public var Passport_Language_ko: String { return self._s[1414]! } - public var InviteText_URL: String { return self._s[1415]! } - public var TextFormat_Monospace: String { return self._s[1416]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1406]! } + public var Profile_BotInfo: String { return self._s[1407]! } + public var Watch_Compose_CreateMessage: String { return self._s[1408]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1409]! } + public var Month_ShortNovember: String { return self._s[1410]! } + public var Conversation_ScamWarning: String { return self._s[1411]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1412]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1413]! } + public var NotificationsSound_Chime: String { return self._s[1414]! } + public var Passport_Language_ko: String { return self._s[1416]! } + public var InviteText_URL: String { return self._s[1417]! } + public var TextFormat_Monospace: String { return self._s[1418]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1418]!, self._r[1418]!, [_0]) + return formatWithArgumentRanges(self._s[1420]!, self._r[1420]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1421]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1422]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1423]! } - public var Your_card_has_expired: String { return self._s[1424]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1425]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1426]! } - public var Conversation_Report: String { return self._s[1430]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1431]! } - public var Notification_MessageLifetime1m: String { return self._s[1432]! } - public var Privacy_ContactsTitle: String { return self._s[1433]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1434]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1435]! } - public var Channel_Members_Title: String { return self._s[1436]! } - public var Map_OpenInWaze: String { return self._s[1437]! } - public var Login_PhoneBannedError: String { return self._s[1438]! } + public var Passport_InfoLearnMore: String { return self._s[1423]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1424]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1425]! } + public var Your_card_has_expired: String { return self._s[1426]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1427]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1428]! } + public var Conversation_Report: String { return self._s[1432]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1433]! } + public var Notification_MessageLifetime1m: String { return self._s[1434]! } + public var Privacy_ContactsTitle: String { return self._s[1435]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1436]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1437]! } + public var Channel_Members_Title: String { return self._s[1438]! } + public var Map_OpenInWaze: String { return self._s[1439]! } + public var Login_PhoneBannedError: String { return self._s[1440]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_0]) + return formatWithArgumentRanges(self._s[1441]!, self._r[1441]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1440]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1441]! } - public var Common_OK: String { return self._s[1442]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1443]! } - public var Cache_Music: String { return self._s[1444]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1445]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1446]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1447]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1442]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1443]! } + public var Common_OK: String { return self._s[1444]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1445]! } + public var Cache_Music: String { return self._s[1446]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1447]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1448]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1449]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1]) + return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1449]!, self._r[1449]!, [_0]) + return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_0]) } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_0]) + return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1452]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1453]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1455]! } - public var State_ConnectingToProxyInfo: String { return self._s[1456]! } - public var Message_VideoMessage: String { return self._s[1458]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1459]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1460]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1461]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1462]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1463]! } - public var Activity_RecordingAudio: String { return self._s[1464]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1465]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1466]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1454]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1455]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1457]! } + public var State_ConnectingToProxyInfo: String { return self._s[1458]! } + public var Message_VideoMessage: String { return self._s[1460]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1461]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1462]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1463]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1464]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1465]! } + public var Activity_RecordingAudio: String { return self._s[1466]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1467]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1468]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1468]!, self._r[1468]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1470]!, self._r[1470]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_0]) + return formatWithArgumentRanges(self._s[1474]!, self._r[1474]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1473]! } - public var UserInfo_AddPhone: String { return self._s[1474]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1475]! } + public var Conversation_ApplyLocalization: String { return self._s[1475]! } + public var UserInfo_AddPhone: String { return self._s[1476]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1477]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0]) + return formatWithArgumentRanges(self._s[1478]!, self._r[1478]!, [_0]) } - public var Passport_Scans: String { return self._s[1478]! } - public var BlockedUsers_Unblock: String { return self._s[1479]! } + public var Passport_Scans: String { return self._s[1480]! } + public var BlockedUsers_Unblock: String { return self._s[1481]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_1]) + return formatWithArgumentRanges(self._s[1482]!, self._r[1482]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1481]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1482]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1483]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1484]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1485]! } + public var Channel_Management_LabelCreator: String { return self._s[1483]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1484]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1485]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1486]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1487]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1486]!, self._r[1486]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1488]!, self._r[1488]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1487]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1488]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1489]! } - public var ChannelIntro_CreateChannel: String { return self._s[1490]! } - public var Conversation_UnreadMessages: String { return self._s[1491]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1492]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1493]! } - public var Notification_GroupActivated: String { return self._s[1494]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1495]! } + public var Login_PhoneNumberHelp: String { return self._s[1489]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1490]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1491]! } + public var ChannelIntro_CreateChannel: String { return self._s[1492]! } + public var Conversation_UnreadMessages: String { return self._s[1493]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1494]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1495]! } + public var Notification_GroupActivated: String { return self._s[1496]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1497]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1496]!, self._r[1496]!, [_0]) + return formatWithArgumentRanges(self._s[1498]!, self._r[1498]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1497]!, self._r[1497]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1499]!, self._r[1499]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1499]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1501]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) + return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1501]! } - public var CallFeedback_AddComment: String { return self._s[1502]! } + public var Undo_DeletedChannel: String { return self._s[1503]! } + public var CallFeedback_AddComment: String { return self._s[1504]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1503]!, self._r[1503]!, [_0]) - } - public var Document_TargetConfirmationFormat: String { return self._s[1504]! } - public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1506]! } + public var Document_TargetConfirmationFormat: String { return self._s[1506]! } + public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1507]!, self._r[1507]!, [_0]) + } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1508]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1507]!, self._r[1507]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1509]!, self._r[1509]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1508]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1509]! } + public var Contacts_SortByName: String { return self._s[1510]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1511]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1512]! } - public var ScheduledMessages_EditTime: String { return self._s[1513]! } - public var Conversation_ClearSelfHistory: String { return self._s[1514]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1515]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1516]! } - public var Stickers_SuggestNone: String { return self._s[1517]! } - public var ChatSettings_Cache: String { return self._s[1518]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1519]! } - public var Media_ShareThisPhoto: String { return self._s[1520]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1521]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1522]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1523]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1524]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1525]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1526]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1527]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1529]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1530]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1531]! } - public var Map_OpenIn: String { return self._s[1532]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1514]! } + public var ScheduledMessages_EditTime: String { return self._s[1515]! } + public var Conversation_ClearSelfHistory: String { return self._s[1516]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1517]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1518]! } + public var Stickers_SuggestNone: String { return self._s[1519]! } + public var ChatSettings_Cache: String { return self._s[1520]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1521]! } + public var Media_ShareThisPhoto: String { return self._s[1522]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1523]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1524]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1525]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1526]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1527]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1528]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1529]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1531]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1532]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1533]! } + public var Map_OpenIn: String { return self._s[1534]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_1]) + return formatWithArgumentRanges(self._s[1537]!, self._r[1537]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1536]!, self._r[1536]!, [_0]) + return formatWithArgumentRanges(self._s[1538]!, self._r[1538]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1537]! } - public var MessagePoll_LabelClosed: String { return self._s[1538]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1540]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1541]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1542]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1543]! } - public var Login_SelectCountry_Title: String { return self._s[1544]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1545]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1539]! } + public var MessagePoll_LabelClosed: String { return self._s[1540]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1542]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1543]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1544]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1545]! } + public var Login_SelectCountry_Title: String { return self._s[1546]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1547]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1548]!, self._r[1548]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1547]! } - public var Watch_Suggestion_BRB: String { return self._s[1548]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1549]! } - public var Contacts_PermissionsTitle: String { return self._s[1550]! } - public var Conversation_RestrictedInline: String { return self._s[1551]! } - public var StickerPack_ViewPack: String { return self._s[1553]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1549]! } + public var Watch_Suggestion_BRB: String { return self._s[1550]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1551]! } + public var Contacts_PermissionsTitle: String { return self._s[1552]! } + public var Conversation_RestrictedInline: String { return self._s[1553]! } + public var StickerPack_ViewPack: String { return self._s[1555]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1554]!, self._r[1554]!, [_0]) + return formatWithArgumentRanges(self._s[1556]!, self._r[1556]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1556]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1559]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1561]! } - public var Channel_Info_Stickers: String { return self._s[1562]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1563]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1564]! } - public var Passport_DeletePersonalDetails: String { return self._s[1565]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1566]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1567]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1568]! } - public var Conversation_SearchNoResults: String { return self._s[1570]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1571]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1572]! } - public var Login_Code: String { return self._s[1573]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1574]! } - public var Weekday_ShortThursday: String { return self._s[1575]! } - public var Resolve_ErrorNotFound: String { return self._s[1577]! } - public var LastSeen_Offline: String { return self._s[1578]! } - public var PeopleNearby_NoMembers: String { return self._s[1579]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1580]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1581]! } - public var GroupInfo_Title: String { return self._s[1583]! } - public var NotificationsSound_Note: String { return self._s[1584]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1585]! } - public var Watch_Message_Poll: String { return self._s[1586]! } - public var Privacy_Calls: String { return self._s[1587]! } + public var Compose_NewChannel: String { return self._s[1558]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1561]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1563]! } + public var Channel_Info_Stickers: String { return self._s[1564]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1565]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1566]! } + public var Passport_DeletePersonalDetails: String { return self._s[1567]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1568]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1569]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1570]! } + public var Conversation_SearchNoResults: String { return self._s[1572]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1573]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1574]! } + public var Login_Code: String { return self._s[1575]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1576]! } + public var Weekday_ShortThursday: String { return self._s[1577]! } + public var Resolve_ErrorNotFound: String { return self._s[1579]! } + public var LastSeen_Offline: String { return self._s[1580]! } + public var PeopleNearby_NoMembers: String { return self._s[1581]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1582]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1583]! } + public var GroupInfo_Title: String { return self._s[1585]! } + public var NotificationsSound_Note: String { return self._s[1586]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1587]! } + public var Watch_Message_Poll: String { return self._s[1588]! } + public var Privacy_Calls: String { return self._s[1589]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1588]!, self._r[1588]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1590]!, self._r[1590]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1589]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1590]! } - public var Notifications_Reset: String { return self._s[1591]! } - public var Conversation_Pin: String { return self._s[1592]! } - public var Passport_Language_lv: String { return self._s[1593]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1594]! } - public var BlockedUsers_Info: String { return self._s[1595]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1597]! } - public var Watch_Conversation_Unblock: String { return self._s[1599]! } + public var Month_ShortAugust: String { return self._s[1591]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1592]! } + public var Notifications_Reset: String { return self._s[1593]! } + public var Conversation_Pin: String { return self._s[1594]! } + public var Passport_Language_lv: String { return self._s[1595]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1596]! } + public var BlockedUsers_Info: String { return self._s[1597]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1599]! } + public var Watch_Conversation_Unblock: String { return self._s[1601]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1600]!, self._r[1600]!, [_0]) + return formatWithArgumentRanges(self._s[1602]!, self._r[1602]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1601]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1602]! } + public var CloudStorage_Title: String { return self._s[1603]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1604]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_0]) + return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1604]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1605]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1606]! } - public var Passport_Address_EditBankStatement: String { return self._s[1607]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1606]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1607]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1608]! } + public var Passport_Address_EditBankStatement: String { return self._s[1609]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1610]!, self._r[1610]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1609]! } - public var ShareMenu_Comment: String { return self._s[1610]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1611]! } - public var Notifications_PermissionsTitle: String { return self._s[1612]! } - public var GroupPermission_NoSendLinks: String { return self._s[1613]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1614]! } - public var Settings_Support: String { return self._s[1615]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1616]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1617]! } - public var Privacy_Forwards_Preview: String { return self._s[1618]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1619]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1620]! } - public var Common_Select: String { return self._s[1622]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1623]! } - public var WallpaperSearch_ColorGray: String { return self._s[1625]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1626]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1627]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1628]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1629]! } - public var Widget_AuthRequired: String { return self._s[1630]! } - public var Camera_FlashOn: String { return self._s[1631]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1632]! } - public var Watch_Suggestion_OK: String { return self._s[1633]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1611]! } + public var ShareMenu_Comment: String { return self._s[1612]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1613]! } + public var Notifications_PermissionsTitle: String { return self._s[1614]! } + public var GroupPermission_NoSendLinks: String { return self._s[1615]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1616]! } + public var Settings_Support: String { return self._s[1617]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1618]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1619]! } + public var Privacy_Forwards_Preview: String { return self._s[1620]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1621]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1622]! } + public var Common_Select: String { return self._s[1624]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1625]! } + public var WallpaperSearch_ColorGray: String { return self._s[1627]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1628]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1629]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1630]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1631]! } + public var Widget_AuthRequired: String { return self._s[1632]! } + public var Camera_FlashOn: String { return self._s[1633]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1634]! } + public var Watch_Suggestion_OK: String { return self._s[1635]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1635]!, self._r[1635]!, [_0]) - } - public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1637]!, self._r[1637]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1638]! } - public var DialogList_AdLabel: String { return self._s[1639]! } - public var WatchRemote_NotificationText: String { return self._s[1640]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1641]! } - public var Conversation_ReportSpam: String { return self._s[1642]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1643]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1645]! } - public var PhoneLabel_Title: String { return self._s[1646]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1647]! } - public var Settings_ChangePhoneNumber: String { return self._s[1648]! } - public var Notifications_ExceptionsTitle: String { return self._s[1649]! } - public var Notifications_AlertTones: String { return self._s[1650]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1651]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1652]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1653]! } - public var VoiceOver_Chat_Photo: String { return self._s[1655]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1656]! } - public var ReportPeer_ReasonOther: String { return self._s[1657]! } - public var KeyCommand_ScrollDown: String { return self._s[1659]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1660]! } + public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1639]!, self._r[1639]!, [_0]) + } + public var TextFormat_Strikethrough: String { return self._s[1640]! } + public var DialogList_AdLabel: String { return self._s[1641]! } + public var WatchRemote_NotificationText: String { return self._s[1642]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1643]! } + public var Conversation_ReportSpam: String { return self._s[1644]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1645]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1647]! } + public var PhoneLabel_Title: String { return self._s[1648]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1649]! } + public var Settings_ChangePhoneNumber: String { return self._s[1650]! } + public var Notifications_ExceptionsTitle: String { return self._s[1651]! } + public var Notifications_AlertTones: String { return self._s[1652]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1653]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1654]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1655]! } + public var VoiceOver_Chat_Photo: String { return self._s[1657]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1658]! } + public var ReportPeer_ReasonOther: String { return self._s[1659]! } + public var KeyCommand_ScrollDown: String { return self._s[1661]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1662]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1661]!, self._r[1661]!, [_0]) + return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1662]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1663]! } - public var AuthSessions_LogOut: String { return self._s[1664]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1665]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1666]! } - public var Passport_Phone_Title: String { return self._s[1667]! } - public var Settings_PhoneNumber: String { return self._s[1668]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1664]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1665]! } + public var AuthSessions_LogOut: String { return self._s[1666]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1667]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1668]! } + public var Passport_Phone_Title: String { return self._s[1669]! } + public var Settings_PhoneNumber: String { return self._s[1670]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1669]!, self._r[1669]!, [_0]) + return formatWithArgumentRanges(self._s[1671]!, self._r[1671]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1670]! } - public var WebSearch_SearchNoResults: String { return self._s[1671]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1673]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1674]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1675]! } - public var PhotoEditor_CurvesTool: String { return self._s[1676]! } - public var Checkout_PaymentMethod: String { return self._s[1678]! } + public var NotificationsSound_Alert: String { return self._s[1672]! } + public var WebSearch_SearchNoResults: String { return self._s[1673]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1675]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1676]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1677]! } + public var PhotoEditor_CurvesTool: String { return self._s[1678]! } + public var Checkout_PaymentMethod: String { return self._s[1680]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1679]!, self._r[1679]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1681]!, self._r[1681]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1680]! } - public var Camera_PhotoMode: String { return self._s[1683]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1685]! } - public var CallSettings_OnMobile: String { return self._s[1686]! } - public var Tour_Text2: String { return self._s[1687]! } + public var Contacts_AccessDeniedError: String { return self._s[1682]! } + public var Camera_PhotoMode: String { return self._s[1685]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1687]! } + public var CallSettings_OnMobile: String { return self._s[1688]! } + public var Tour_Text2: String { return self._s[1689]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1690]!, self._r[1690]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1690]! } - public var Permissions_Skip: String { return self._s[1691]! } - public var SecretImage_Title: String { return self._s[1692]! } - public var Watch_MessageView_Title: String { return self._s[1693]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1694]! } - public var AttachmentMenu_Poll: String { return self._s[1695]! } + public var DialogList_EncryptionProcessing: String { return self._s[1692]! } + public var Permissions_Skip: String { return self._s[1693]! } + public var SecretImage_Title: String { return self._s[1694]! } + public var Watch_MessageView_Title: String { return self._s[1695]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1696]! } + public var AttachmentMenu_Poll: String { return self._s[1697]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1696]!, self._r[1696]!, [_0]) + return formatWithArgumentRanges(self._s[1698]!, self._r[1698]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1697]!, self._r[1697]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1699]!, self._r[1699]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1698]! } - public var WallpaperPreview_Title: String { return self._s[1699]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1700]! } - public var Settings_ProxyConnecting: String { return self._s[1701]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1703]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1704]! } - public var Profile_MessageLifetime5s: String { return self._s[1705]! } - public var Username_InvalidCharacters: String { return self._s[1706]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1707]! } - public var ScheduledMessages_ClearAll: String { return self._s[1708]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1709]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1710]! } - public var Settings_AddAccount: String { return self._s[1711]! } - public var Notification_CreatedChannel: String { return self._s[1714]! } + public var Notification_CallCanceled: String { return self._s[1700]! } + public var WallpaperPreview_Title: String { return self._s[1701]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1702]! } + public var Settings_ProxyConnecting: String { return self._s[1703]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1705]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1706]! } + public var Profile_MessageLifetime5s: String { return self._s[1707]! } + public var Username_InvalidCharacters: String { return self._s[1708]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1709]! } + public var ScheduledMessages_ClearAll: String { return self._s[1710]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1711]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1712]! } + public var Settings_AddAccount: String { return self._s[1713]! } + public var Notification_CreatedChannel: String { return self._s[1716]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1717]!, self._r[1717]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1717]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1718]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1719]! } - public var Contacts_TopSection: String { return self._s[1720]! } + public var Passcode_AppLockedAlert: String { return self._s[1719]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1720]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1721]! } + public var Contacts_TopSection: String { return self._s[1722]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1723]!, self._r[1723]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_0]) + return formatWithArgumentRanges(self._s[1724]!, self._r[1724]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1723]! } - public var UserInfo_TapToCall: String { return self._s[1724]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1726]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1727]! } - public var Common_Search: String { return self._s[1728]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1729]! } + public var ReportPeer_ReasonSpam: String { return self._s[1725]! } + public var UserInfo_TapToCall: String { return self._s[1726]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1728]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1729]! } + public var Common_Search: String { return self._s[1730]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1731]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1730]!, self._r[1730]!, [_0]) + return formatWithArgumentRanges(self._s[1732]!, self._r[1732]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1731]! } - public var Message_InvoiceLabel: String { return self._s[1732]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1733]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1734]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1733]! } + public var Message_InvoiceLabel: String { return self._s[1734]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1735]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1736]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) + return formatWithArgumentRanges(self._s[1737]!, self._r[1737]!, [_0]) } - public var Conversation_Info: String { return self._s[1736]! } - public var Login_InfoDeletePhoto: String { return self._s[1737]! } - public var Passport_Language_vi: String { return self._s[1739]! } - public var UserInfo_ScamUserWarning: String { return self._s[1740]! } - public var Conversation_Search: String { return self._s[1741]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1742]! } - public var ReportPeer_ReasonPornography: String { return self._s[1743]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1744]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1745]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1746]! } - public var Channel_Setup_TypeHeader: String { return self._s[1747]! } - public var AuthSessions_LoggedIn: String { return self._s[1748]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1749]! } - public var Login_SmsRequestState3: String { return self._s[1750]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1751]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1752]! } - public var Join_ChannelsTooMuch: String { return self._s[1753]! } - public var Channel_Edit_LinkItem: String { return self._s[1754]! } - public var Privacy_Calls_P2PNever: String { return self._s[1755]! } - public var Conversation_AddToReadingList: String { return self._s[1757]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1758]! } - public var Message_Animation: String { return self._s[1759]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1760]! } - public var Map_Unknown: String { return self._s[1761]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1762]! } + public var Conversation_Info: String { return self._s[1738]! } + public var Login_InfoDeletePhoto: String { return self._s[1739]! } + public var Passport_Language_vi: String { return self._s[1741]! } + public var UserInfo_ScamUserWarning: String { return self._s[1742]! } + public var Conversation_Search: String { return self._s[1743]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1744]! } + public var ReportPeer_ReasonPornography: String { return self._s[1745]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1746]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1747]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1748]! } + public var Channel_Setup_TypeHeader: String { return self._s[1749]! } + public var AuthSessions_LoggedIn: String { return self._s[1750]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1751]! } + public var Login_SmsRequestState3: String { return self._s[1752]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1753]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1754]! } + public var Join_ChannelsTooMuch: String { return self._s[1755]! } + public var Channel_Edit_LinkItem: String { return self._s[1756]! } + public var Privacy_Calls_P2PNever: String { return self._s[1757]! } + public var Conversation_AddToReadingList: String { return self._s[1759]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1760]! } + public var Message_Animation: String { return self._s[1761]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1762]! } + public var Map_Unknown: String { return self._s[1763]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1764]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1763]!, self._r[1763]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1765]!, self._r[1765]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1764]!, self._r[1764]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1766]!, self._r[1766]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1765]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1766]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1767]! } + public var Call_StatusRequesting: String { return self._s[1767]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1768]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1769]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1770]!, self._r[1770]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_0]) + return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_0]) } - public var Update_Skip: String { return self._s[1770]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1771]! } - public var Message_PinnedPollMessage: String { return self._s[1772]! } - public var BlockedUsers_Title: String { return self._s[1773]! } + public var Update_Skip: String { return self._s[1772]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1773]! } + public var Message_PinnedPollMessage: String { return self._s[1774]! } + public var BlockedUsers_Title: String { return self._s[1775]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_1]) + return formatWithArgumentRanges(self._s[1776]!, self._r[1776]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1775]! } - public var NotificationsSound_Bell: String { return self._s[1776]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1777]! } - public var Weekday_Monday: String { return self._s[1778]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1779]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1780]! } - public var ChatSettings_Groups: String { return self._s[1781]! } + public var Username_CheckingUsername: String { return self._s[1777]! } + public var NotificationsSound_Bell: String { return self._s[1778]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1779]! } + public var Weekday_Monday: String { return self._s[1780]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1781]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1782]! } + public var ChatSettings_Groups: String { return self._s[1783]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) + return formatWithArgumentRanges(self._s[1784]!, self._r[1784]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1783]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1785]! } - public var ChatList_Unmute: String { return self._s[1786]! } - public var PhotoEditor_CurvesAll: String { return self._s[1787]! } - public var Weekday_ShortTuesday: String { return self._s[1788]! } - public var DialogList_Read: String { return self._s[1789]! } - public var Appearance_AppIconClassic: String { return self._s[1790]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1791]! } - public var Passport_Identity_Gender: String { return self._s[1792]! } + public var Your_card_was_declined: String { return self._s[1785]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1787]! } + public var ChatList_Unmute: String { return self._s[1788]! } + public var PhotoEditor_CurvesAll: String { return self._s[1789]! } + public var Weekday_ShortTuesday: String { return self._s[1790]! } + public var DialogList_Read: String { return self._s[1791]! } + public var Appearance_AppIconClassic: String { return self._s[1792]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1793]! } + public var Passport_Identity_Gender: String { return self._s[1794]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1793]!, self._r[1793]!, [_0]) + return formatWithArgumentRanges(self._s[1795]!, self._r[1795]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1794]! } + public var Target_SelectGroup: String { return self._s[1796]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_0]) + return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0]) } - public var Passport_Language_en: String { return self._s[1797]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1798]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1799]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1800]! } - public var ScheduledMessages_SendNow: String { return self._s[1801]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1803]! } - public var Login_InfoHelp: String { return self._s[1804]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1805]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1806]! } + public var Passport_Language_en: String { return self._s[1799]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1800]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1801]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1802]! } + public var ScheduledMessages_SendNow: String { return self._s[1803]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1805]! } + public var Login_InfoHelp: String { return self._s[1806]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1807]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1808]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1810]! } - public var CreatePoll_Title: String { return self._s[1811]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1812]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1813]! } - public var UserInfo_GroupsInCommon: String { return self._s[1814]! } - public var Call_AudioRouteHide: String { return self._s[1815]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1817]! } + public var SocksProxySetup_AddProxy: String { return self._s[1812]! } + public var CreatePoll_Title: String { return self._s[1813]! } + public var Conversation_ViewTheme: String { return self._s[1814]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1815]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1816]! } + public var UserInfo_GroupsInCommon: String { return self._s[1817]! } + public var Call_AudioRouteHide: String { return self._s[1818]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1820]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_0]) + return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1819]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1820]! } - public var Notifications_Title: String { return self._s[1821]! } - public var Group_Username_InvalidTooShort: String { return self._s[1822]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1823]! } + public var TextFormat_Bold: String { return self._s[1822]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1823]! } + public var Notifications_Title: String { return self._s[1824]! } + public var Group_Username_InvalidTooShort: String { return self._s[1825]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1826]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1827]!, self._r[1827]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1826]! } - public var Stickers_SuggestAdded: String { return self._s[1827]! } - public var Login_CountryCode: String { return self._s[1828]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1829]! } - public var Map_GetDirections: String { return self._s[1830]! } - public var Login_PhoneFloodError: String { return self._s[1831]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1829]! } + public var Stickers_SuggestAdded: String { return self._s[1830]! } + public var Login_CountryCode: String { return self._s[1831]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1832]! } + public var Map_GetDirections: String { return self._s[1833]! } + public var Login_PhoneFloodError: String { return self._s[1834]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1832]!, self._r[1832]!, [_0]) + return formatWithArgumentRanges(self._s[1835]!, self._r[1835]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1834]! } - public var Group_Location_ChangeLocation: String { return self._s[1835]! } - public var Notification_GroupInviterSelf: String { return self._s[1836]! } - public var InstantPage_TapToOpenLink: String { return self._s[1837]! } + public var Settings_SetUsername: String { return self._s[1837]! } + public var Group_Location_ChangeLocation: String { return self._s[1838]! } + public var Notification_GroupInviterSelf: String { return self._s[1839]! } + public var InstantPage_TapToOpenLink: String { return self._s[1840]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_0]) + return formatWithArgumentRanges(self._s[1841]!, self._r[1841]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1839]! } - public var SecretChat_Title: String { return self._s[1840]! } - public var Group_UpgradeNoticeText1: String { return self._s[1841]! } - public var AuthSessions_Title: String { return self._s[1842]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1842]! } + public var SecretChat_Title: String { return self._s[1843]! } + public var Group_UpgradeNoticeText1: String { return self._s[1844]! } + public var AuthSessions_Title: String { return self._s[1845]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_0]) + return formatWithArgumentRanges(self._s[1846]!, self._r[1846]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1844]! } - public var Channel_About_Title: String { return self._s[1845]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1846]! } + public var PhotoEditor_CropAuto: String { return self._s[1847]! } + public var Channel_About_Title: String { return self._s[1848]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1849]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1851]!, self._r[1851]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1849]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1851]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1852]! } + public var VoiceOver_MessageContextReport: String { return self._s[1852]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1854]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1855]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_1]) + return formatWithArgumentRanges(self._s[1856]!, self._r[1856]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1855]!, self._r[1855]!, [_0]) + return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1856]!, self._r[1856]!, [_0]) + return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1857]! } - public var Presence_online: String { return self._s[1859]! } - public var PasscodeSettings_Title: String { return self._s[1860]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1861]! } - public var Web_OpenExternal: String { return self._s[1862]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1864]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1865]! } - public var LocalGroup_Title: String { return self._s[1866]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1860]! } + public var Presence_online: String { return self._s[1862]! } + public var PasscodeSettings_Title: String { return self._s[1863]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1864]! } + public var Web_OpenExternal: String { return self._s[1865]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1867]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1868]! } + public var LocalGroup_Title: String { return self._s[1869]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1868]! } - public var Map_YouAreHere: String { return self._s[1869]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1871]!, self._r[1871]!, [_0]) + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1871]! } + public var Map_YouAreHere: String { return self._s[1872]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1873]!, self._r[1873]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1872]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1873]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1874]!, self._r[1874]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0]) + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1875]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1876]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1876]! } - public var Bot_Start: String { return self._s[1877]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1878]!, self._r[1878]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1879]!, self._r[1879]!, [_0]) + public var SocksProxySetup_Username: String { return self._s[1879]! } + public var Bot_Start: String { return self._s[1880]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1880]! } - public var AccentColor_Title: String { return self._s[1882]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1883]! } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[1883]! } + public var AccentColor_Title: String { return self._s[1885]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1886]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1887]!, self._r[1887]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) + return formatWithArgumentRanges(self._s[1888]!, self._r[1888]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1886]!, self._r[1886]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1887]! } - public var Login_InfoAvatarPhoto: String { return self._s[1888]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1889]! } - public var Tour_Title4: String { return self._s[1890]! } - public var Passport_Identity_Translation: String { return self._s[1891]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1892]! } - public var Login_TermsOfServiceLabel: String { return self._s[1894]! } - public var Passport_Language_it: String { return self._s[1895]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1896]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1897]! } - public var Conversation_ClearAll: String { return self._s[1899]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1901]! } - public var TwoStepAuth_FloodError: String { return self._s[1902]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1890]! } + public var Login_InfoAvatarPhoto: String { return self._s[1891]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1892]! } + public var Tour_Title4: String { return self._s[1893]! } + public var Passport_Identity_Translation: String { return self._s[1894]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1895]! } + public var Login_TermsOfServiceLabel: String { return self._s[1897]! } + public var Passport_Language_it: String { return self._s[1898]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1899]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1900]! } + public var Conversation_ClearAll: String { return self._s[1902]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1904]! } + public var TwoStepAuth_FloodError: String { return self._s[1905]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1903]!, self._r[1903]!, [_1]) - } - public var Paint_Delete: String { return self._s[1904]! } - public var Privacy_AddNewPeer: String { return self._s[1905]! } - public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1906]!, self._r[1906]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1907]! } + public var Paint_Delete: String { return self._s[1907]! } + public var Privacy_AddNewPeer: String { return self._s[1908]! } + public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1909]!, self._r[1909]!, [_1]) + } + public var LogoutOptions_SetPasscodeText: String { return self._s[1910]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1908]!, self._r[1908]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1909]! } + public var Message_PinnedAudioMessage: String { return self._s[1912]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1910]!, self._r[1910]!, [_0]) + return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1911]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1912]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1913]! } - public var Conversation_MessageEditedLabel: String { return self._s[1914]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1915]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1916]! } + public var Notification_Mute1hMin: String { return self._s[1914]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1915]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1916]! } + public var Conversation_MessageEditedLabel: String { return self._s[1917]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1918]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1919]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1918]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1921]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1919]!, self._r[1919]!, [_1]) + return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1920]! } - public var Month_GenOctober: String { return self._s[1921]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1922]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1923]! } - public var MediaPicker_TimerTooltip: String { return self._s[1925]! } - public var SharedMedia_TitleAll: String { return self._s[1926]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1929]! } - public var Conversation_RestrictedMedia: String { return self._s[1930]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1931]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1933]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1934]! } + public var AccessDenied_LocationTracking: String { return self._s[1923]! } + public var Month_GenOctober: String { return self._s[1924]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1925]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1926]! } + public var MediaPicker_TimerTooltip: String { return self._s[1928]! } + public var SharedMedia_TitleAll: String { return self._s[1929]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1932]! } + public var Conversation_RestrictedMedia: String { return self._s[1933]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1934]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1936]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1937]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1935]!, self._r[1935]!, [_0]) + return formatWithArgumentRanges(self._s[1938]!, self._r[1938]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1938]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1940]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1941]! } + public var Conversation_SavedMessages: String { return self._s[1941]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1943]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1944]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1943]!, self._r[1943]!, [_0]) + return formatWithArgumentRanges(self._s[1946]!, self._r[1946]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1944]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1947]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_0]) + return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1946]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1947]! } + public var ReportPeer_AlertSuccess: String { return self._s[1949]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1950]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1949]! } - public var PhotoEditor_FadeTool: String { return self._s[1950]! } - public var Privacy_ContactsReset: String { return self._s[1951]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1952]! } + public var PhotoEditor_FadeTool: String { return self._s[1953]! } + public var Privacy_ContactsReset: String { return self._s[1954]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0]) + return formatWithArgumentRanges(self._s[1956]!, self._r[1956]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1954]! } - public var ChatList_Mute: String { return self._s[1955]! } - public var Permissions_CellularDataText_v0: String { return self._s[1956]! } - public var ShareMenu_SelectChats: String { return self._s[1958]! } - public var MusicPlayer_VoiceNote: String { return self._s[1959]! } - public var Conversation_RestrictedText: String { return self._s[1960]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1961]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1962]! } - public var Cache_Videos: String { return self._s[1963]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1964]! } - public var FeatureDisabled_Oops: String { return self._s[1966]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1967]! } + public var Message_PinnedVideoMessage: String { return self._s[1957]! } + public var ChatList_Mute: String { return self._s[1958]! } + public var Permissions_CellularDataText_v0: String { return self._s[1959]! } + public var ShareMenu_SelectChats: String { return self._s[1961]! } + public var MusicPlayer_VoiceNote: String { return self._s[1962]! } + public var Conversation_RestrictedText: String { return self._s[1963]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1964]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1965]! } + public var Cache_Videos: String { return self._s[1966]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1967]! } + public var FeatureDisabled_Oops: String { return self._s[1969]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1970]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1968]!, self._r[1968]!, [_0]) + return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1969]! } - public var GroupPermission_NoSendPolls: String { return self._s[1970]! } - public var Message_VideoExpired: String { return self._s[1972]! } - public var Notifications_Badge: String { return self._s[1973]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1974]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1975]! } - public var Username_InvalidTooShort: String { return self._s[1976]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1977]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1978]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1979]! } + public var Stickers_GroupStickersHelp: String { return self._s[1972]! } + public var GroupPermission_NoSendPolls: String { return self._s[1973]! } + public var Message_VideoExpired: String { return self._s[1975]! } + public var Notifications_Badge: String { return self._s[1976]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1977]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1978]! } + public var Username_InvalidTooShort: String { return self._s[1979]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1980]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1981]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1982]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1980]!, self._r[1980]!, [_1]) + return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1981]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1982]! } - public var SharedMedia_CategoryDocs: String { return self._s[1985]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1984]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1985]! } + public var SharedMedia_CategoryDocs: String { return self._s[1988]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1]) - } - public var Privacy_Forwards_NeverLink: String { return self._s[1988]! } - public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1989]!, self._r[1989]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1990]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1991]! } + public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_1]) + } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1993]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_0]) + return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1992]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1993]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1994]! } - public var Channel_UpdatePhotoItem: String { return self._s[1995]! } - public var GroupInfo_LeftStatus: String { return self._s[1996]! } - public var Watch_MessageView_Forward: String { return self._s[1998]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[1999]! } - public var Cache_ClearEmpty: String { return self._s[2001]! } - public var Localization_LanguageName: String { return self._s[2002]! } - public var WebSearch_GIFs: String { return self._s[2003]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2004]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2005]! } - public var Common_Back: String { return self._s[2006]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2007]! } + public var ChatSettings_PrivateChats: String { return self._s[1995]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1996]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1997]! } + public var Channel_UpdatePhotoItem: String { return self._s[1998]! } + public var GroupInfo_LeftStatus: String { return self._s[1999]! } + public var Watch_MessageView_Forward: String { return self._s[2001]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2002]! } + public var Cache_ClearEmpty: String { return self._s[2004]! } + public var Localization_LanguageName: String { return self._s[2005]! } + public var WebSearch_GIFs: String { return self._s[2006]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2007]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2008]! } + public var Common_Back: String { return self._s[2009]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2010]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2008]!, self._r[2008]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2011]!, self._r[2011]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2009]! } - public var Watch_Conversation_Reply: String { return self._s[2011]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2013]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2014]! } - public var Channel_BanUser_Unban: String { return self._s[2016]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2017]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2018]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2020]! } - public var Passport_Identity_Name: String { return self._s[2021]! } + public var Passport_Email_Help: String { return self._s[2012]! } + public var Watch_Conversation_Reply: String { return self._s[2014]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2016]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2017]! } + public var Channel_BanUser_Unban: String { return self._s[2019]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2020]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2021]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2023]! } + public var Passport_Identity_Name: String { return self._s[2024]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_0]) + return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2023]! } - public var Conversation_BlockUser: String { return self._s[2024]! } - public var Month_GenJanuary: String { return self._s[2025]! } - public var ChatSettings_TextSize: String { return self._s[2026]! } - public var Notification_PassportValuePhone: String { return self._s[2027]! } - public var Passport_Language_ne: String { return self._s[2028]! } - public var Notification_CallBack: String { return self._s[2029]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2030]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2026]! } + public var Conversation_BlockUser: String { return self._s[2027]! } + public var Month_GenJanuary: String { return self._s[2028]! } + public var ChatSettings_TextSize: String { return self._s[2029]! } + public var Notification_PassportValuePhone: String { return self._s[2030]! } + public var Passport_Language_ne: String { return self._s[2031]! } + public var Notification_CallBack: String { return self._s[2032]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2033]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2031]!, self._r[2031]!, [_0]) + return formatWithArgumentRanges(self._s[2034]!, self._r[2034]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2032]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2033]! } - public var Stickers_FrequentlyUsed: String { return self._s[2034]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2035]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2037]! } + public var Channel_Info_Management: String { return self._s[2035]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2036]! } + public var Stickers_FrequentlyUsed: String { return self._s[2037]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2038]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2040]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2038]!, self._r[2038]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2039]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2040]! } - public var CreatePoll_TextHeader: String { return self._s[2041]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2042]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2043]! } + public var CreatePoll_TextHeader: String { return self._s[2044]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2042]!, self._r[2042]!, [_0]) + return formatWithArgumentRanges(self._s[2045]!, self._r[2045]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2043]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2044]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2046]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2047]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2048]! } + public var PhotoEditor_QualityMedium: String { return self._s[2046]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2047]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2049]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2050]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2051]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2049]!, self._r[2049]!, [_0]) + return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2050]!, self._r[2050]!, [_1]) + return formatWithArgumentRanges(self._s[2053]!, self._r[2053]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2052]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2053]! } - public var Settings_Username: String { return self._s[2055]! } - public var Conversation_Block: String { return self._s[2057]! } - public var Wallpaper_Wallpaper: String { return self._s[2058]! } - public var SocksProxySetup_UseProxy: String { return self._s[2060]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2061]! } - public var MessageTimer_Forever: String { return self._s[2062]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2063]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2064]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2065]! } - public var Passport_Language_da: String { return self._s[2066]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2067]! } + public var Conversation_LinkDialogOpen: String { return self._s[2055]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2056]! } + public var Settings_Username: String { return self._s[2058]! } + public var Conversation_Block: String { return self._s[2060]! } + public var Wallpaper_Wallpaper: String { return self._s[2061]! } + public var SocksProxySetup_UseProxy: String { return self._s[2063]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2064]! } + public var MessageTimer_Forever: String { return self._s[2065]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2066]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2067]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2068]! } + public var Passport_Language_da: String { return self._s[2069]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2070]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2068]!, self._r[2068]!, [_0]) - } - public var Passport_Address_EditPassportRegistration: String { return self._s[2069]! } - public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2071]!, self._r[2071]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2073]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2074]! } - public var Conversation_PinnedPoll: String { return self._s[2075]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2076]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2072]! } + public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) + } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2076]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2077]! } + public var Conversation_PinnedPoll: String { return self._s[2078]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2079]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_1]) + return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2078]! } - public var Cache_ByPeerHeader: String { return self._s[2079]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2081]! } + public var Cache_ByPeerHeader: String { return self._s[2082]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_0]) + return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2081]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2084]! } - public var Notification_PinnedMessage: String { return self._s[2085]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2087]! } - public var Contacts_SortBy: String { return self._s[2088]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2084]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2087]! } + public var Notification_PinnedMessage: String { return self._s[2088]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2090]! } + public var Contacts_SortBy: String { return self._s[2091]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_1]) + return formatWithArgumentRanges(self._s[2092]!, self._r[2092]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2094]!, self._r[2094]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2092]! } - public var Watch_UserInfo_Service: String { return self._s[2093]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2095]! } - public var Conversation_Unpin: String { return self._s[2097]! } - public var CancelResetAccount_Title: String { return self._s[2098]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2099]! } + public var Call_EncryptionKey_Title: String { return self._s[2095]! } + public var Watch_UserInfo_Service: String { return self._s[2096]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2098]! } + public var Conversation_Unpin: String { return self._s[2100]! } + public var CancelResetAccount_Title: String { return self._s[2101]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2102]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2101]!, self._r[2101]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2102]! } - public var CallSettings_Title: String { return self._s[2103]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2104]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2106]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2107]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2105]! } + public var CallSettings_Title: String { return self._s[2106]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2107]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2109]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2110]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2109]! } - public var LoginPassword_PasswordHelp: String { return self._s[2110]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2111]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2112]! } - public var Checkout_TotalPaidAmount: String { return self._s[2113]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2112]! } + public var LoginPassword_PasswordHelp: String { return self._s[2113]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2114]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2115]! } + public var Checkout_TotalPaidAmount: String { return self._s[2116]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_0]) + return formatWithArgumentRanges(self._s[2117]!, self._r[2117]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2115]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2117]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2118]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2118]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2120]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2121]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2119]!, self._r[2119]!, [_1]) + return formatWithArgumentRanges(self._s[2122]!, self._r[2122]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2120]! } - public var Contacts_InviteFriends: String { return self._s[2122]! } - public var Map_ChooseLocationTitle: String { return self._s[2123]! } - public var Conversation_StopPoll: String { return self._s[2125]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2123]! } + public var Contacts_InviteFriends: String { return self._s[2125]! } + public var Map_ChooseLocationTitle: String { return self._s[2126]! } + public var Conversation_StopPoll: String { return self._s[2128]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2126]!, self._r[2126]!, [_0]) + return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) } - public var Call_Camera: String { return self._s[2127]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2128]! } - public var Calls_RatingFeedback: String { return self._s[2129]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2130]! } - public var NotificationsSound_Pulse: String { return self._s[2131]! } - public var Watch_LastSeen_Lately: String { return self._s[2132]! } - public var ReportGroupLocation_Report: String { return self._s[2135]! } - public var Widget_NoUsers: String { return self._s[2136]! } - public var Conversation_UnvotePoll: String { return self._s[2137]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2139]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2140]! } - public var NotificationsSound_Circles: String { return self._s[2141]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2143]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2144]! } - public var Proxy_TooltipUnavailable: String { return self._s[2145]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2147]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2149]! } - public var Conversation_FileDropbox: String { return self._s[2150]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2151]! } - public var Tour_Text3: String { return self._s[2153]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2155]! } - public var GroupPermission_NoSendMessages: String { return self._s[2156]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2157]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2158]! } + public var Call_Camera: String { return self._s[2130]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2131]! } + public var Calls_RatingFeedback: String { return self._s[2132]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2133]! } + public var NotificationsSound_Pulse: String { return self._s[2134]! } + public var Watch_LastSeen_Lately: String { return self._s[2135]! } + public var ReportGroupLocation_Report: String { return self._s[2138]! } + public var Widget_NoUsers: String { return self._s[2139]! } + public var Conversation_UnvotePoll: String { return self._s[2140]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2142]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2143]! } + public var NotificationsSound_Circles: String { return self._s[2144]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2146]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2147]! } + public var Proxy_TooltipUnavailable: String { return self._s[2148]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2150]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2152]! } + public var Conversation_FileDropbox: String { return self._s[2153]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2154]! } + public var Tour_Text3: String { return self._s[2156]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2158]! } + public var GroupPermission_NoSendMessages: String { return self._s[2159]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2160]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2161]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_0]) + return formatWithArgumentRanges(self._s[2163]!, self._r[2163]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2161]! } - public var Checkout_ShippingOption_Title: String { return self._s[2162]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2163]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2164]! } + public var Checkout_ShippingOption_Title: String { return self._s[2165]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2166]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2164]!, self._r[2164]!, [_0]) + return formatWithArgumentRanges(self._s[2167]!, self._r[2167]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_0]) + return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2166]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2167]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2168]! } - public var AutoDownloadSettings_Photos: String { return self._s[2170]! } - public var Appearance_PreviewIncomingText: String { return self._s[2171]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2172]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2173]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2174]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2175]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2176]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2177]! } - public var Notification_SecretChatScreenshot: String { return self._s[2178]! } - public var AccessDenied_Wallpapers: String { return self._s[2179]! } - public var Passport_Address_City: String { return self._s[2181]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2182]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2183]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2184]! } - public var AccessDenied_LocationDisabled: String { return self._s[2185]! } - public var Group_Location_Title: String { return self._s[2186]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2188]! } - public var GroupInfo_Sound: String { return self._s[2189]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2190]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2191]! } - public var Contacts_Title: String { return self._s[2192]! } - public var Passport_Language_fr: String { return self._s[2193]! } - public var Notifications_ResetAllNotifications: String { return self._s[2194]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2197]! } - public var Checkout_NewCard_Title: String { return self._s[2198]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2199]! } - public var Conversation_ForwardChats: String { return self._s[2200]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2202]! } - public var Settings_FAQ: String { return self._s[2204]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2205]! } - public var Conversation_ContextMenuForward: String { return self._s[2206]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2209]! } - public var PrivacyPolicy_Title: String { return self._s[2212]! } - public var Notifications_TextTone: String { return self._s[2213]! } - public var Profile_CreateNewContact: String { return self._s[2214]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2215]! } - public var Call_Speaker: String { return self._s[2217]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2218]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2220]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2221]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2169]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2170]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2171]! } + public var AutoDownloadSettings_Photos: String { return self._s[2173]! } + public var Appearance_PreviewIncomingText: String { return self._s[2174]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2175]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2176]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2177]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2178]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2179]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2180]! } + public var Notification_SecretChatScreenshot: String { return self._s[2181]! } + public var AccessDenied_Wallpapers: String { return self._s[2182]! } + public var Passport_Address_City: String { return self._s[2184]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2185]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2186]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2187]! } + public var AccessDenied_LocationDisabled: String { return self._s[2188]! } + public var Group_Location_Title: String { return self._s[2189]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2191]! } + public var GroupInfo_Sound: String { return self._s[2192]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2193]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2194]! } + public var Contacts_Title: String { return self._s[2195]! } + public var Passport_Language_fr: String { return self._s[2196]! } + public var Notifications_ResetAllNotifications: String { return self._s[2197]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2200]! } + public var Checkout_NewCard_Title: String { return self._s[2201]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2202]! } + public var Conversation_ForwardChats: String { return self._s[2203]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2205]! } + public var Settings_FAQ: String { return self._s[2207]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2208]! } + public var Conversation_ContextMenuForward: String { return self._s[2209]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2212]! } + public var PrivacyPolicy_Title: String { return self._s[2215]! } + public var Notifications_TextTone: String { return self._s[2216]! } + public var Profile_CreateNewContact: String { return self._s[2217]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2218]! } + public var Call_Speaker: String { return self._s[2220]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2221]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2223]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2224]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_0]) + return formatWithArgumentRanges(self._s[2225]!, self._r[2225]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2223]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2224]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2225]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2226]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2227]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2228]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2229]! } - public var Bot_Unblock: String { return self._s[2230]! } - public var TextFormat_Italic: String { return self._s[2231]! } - public var WallpaperSearch_ColorPink: String { return self._s[2232]! } - public var Settings_About_Help: String { return self._s[2233]! } - public var SearchImages_Title: String { return self._s[2234]! } - public var Weekday_Wednesday: String { return self._s[2235]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2236]! } - public var ExplicitContent_AlertTitle: String { return self._s[2237]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2226]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2227]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2228]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2229]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2230]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2231]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2232]! } + public var Bot_Unblock: String { return self._s[2233]! } + public var TextFormat_Italic: String { return self._s[2234]! } + public var WallpaperSearch_ColorPink: String { return self._s[2235]! } + public var Settings_About_Help: String { return self._s[2236]! } + public var SearchImages_Title: String { return self._s[2237]! } + public var Weekday_Wednesday: String { return self._s[2238]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2239]! } + public var ExplicitContent_AlertTitle: String { return self._s[2240]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2238]!, self._r[2238]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2241]!, self._r[2241]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2239]! } - public var Weekday_Thursday: String { return self._s[2240]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2241]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2242]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2242]! } + public var Weekday_Thursday: String { return self._s[2243]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2244]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2245]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2243]!, self._r[2243]!, [_0]) + return formatWithArgumentRanges(self._s[2246]!, self._r[2246]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2244]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2245]! } - public var Passport_RequestedInformation: String { return self._s[2246]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2247]! } - public var Conversation_EncryptionProcessing: String { return self._s[2249]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2250]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2252]! } - public var Channel_Setup_Title: String { return self._s[2253]! } - public var Conversation_SearchPlaceholder: String { return self._s[2254]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2255]! } - public var Checkout_ErrorGeneric: String { return self._s[2256]! } - public var Passport_Language_hu: String { return self._s[2257]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2247]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2248]! } + public var Passport_RequestedInformation: String { return self._s[2249]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2250]! } + public var Conversation_EncryptionProcessing: String { return self._s[2252]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2253]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2255]! } + public var Channel_Setup_Title: String { return self._s[2256]! } + public var Conversation_SearchPlaceholder: String { return self._s[2257]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2258]! } + public var Checkout_ErrorGeneric: String { return self._s[2259]! } + public var Passport_Language_hu: String { return self._s[2260]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_0]) + return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_1]) + return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2263]!, self._r[2263]!, [_0]) + return formatWithArgumentRanges(self._s[2266]!, self._r[2266]!, [_0]) } - public var Group_Location_Info: String { return self._s[2264]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2265]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2266]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2267]! } + public var Group_Location_Info: String { return self._s[2267]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2268]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2269]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2270]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_0]) + return formatWithArgumentRanges(self._s[2271]!, self._r[2271]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2269]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2270]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2271]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2272]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2273]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2274]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_0]) + return formatWithArgumentRanges(self._s[2275]!, self._r[2275]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2273]! } - public var Message_PinnedAnimationMessage: String { return self._s[2275]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2277]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2278]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2280]! } - public var Embed_PlayingInPIP: String { return self._s[2281]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2282]! } + public var Passport_Language_cs: String { return self._s[2276]! } + public var Message_PinnedAnimationMessage: String { return self._s[2278]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2280]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2281]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2283]! } + public var Embed_PlayingInPIP: String { return self._s[2284]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2285]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2283]!, self._r[2283]!, [_0]) + return formatWithArgumentRanges(self._s[2286]!, self._r[2286]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2284]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2287]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2285]!, self._r[2285]!, [_1]) + return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2286]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2287]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2288]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2289]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2290]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2291]! } + public var Notification_PaymentSent: String { return self._s[2289]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2290]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2291]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2292]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2293]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2294]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2294]!, self._r[2294]!, [_1]) + return formatWithArgumentRanges(self._s[2297]!, self._r[2297]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2295]!, self._r[2295]!, [_1]) + return formatWithArgumentRanges(self._s[2298]!, self._r[2298]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2296]!, self._r[2296]!, [_1]) + return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2298]! } - public var PasscodeSettings_HelpTop: String { return self._s[2299]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2300]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2301]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2302]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2303]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2304]! } - public var Call_Accept: String { return self._s[2306]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2307]! } - public var Month_GenMarch: String { return self._s[2309]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2310]! } - public var LoginPassword_Title: String { return self._s[2311]! } - public var Call_End: String { return self._s[2312]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2313]! } - public var VoiceOver_Chat_Contact: String { return self._s[2314]! } - public var CallSettings_Always: String { return self._s[2315]! } - public var CallFeedback_Success: String { return self._s[2316]! } - public var TwoStepAuth_SetupHint: String { return self._s[2317]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2301]! } + public var PasscodeSettings_HelpTop: String { return self._s[2302]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2303]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2304]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2305]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2306]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2307]! } + public var Call_Accept: String { return self._s[2309]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2310]! } + public var Month_GenMarch: String { return self._s[2312]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2313]! } + public var LoginPassword_Title: String { return self._s[2314]! } + public var Call_End: String { return self._s[2315]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2316]! } + public var VoiceOver_Chat_Contact: String { return self._s[2317]! } + public var CallSettings_Always: String { return self._s[2318]! } + public var CallFeedback_Success: String { return self._s[2319]! } + public var TwoStepAuth_SetupHint: String { return self._s[2320]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_1]) + return formatWithArgumentRanges(self._s[2321]!, self._r[2321]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2319]! } - public var Login_PhoneTitle: String { return self._s[2320]! } - public var Passport_FieldPhoneHelp: String { return self._s[2321]! } - public var Weekday_ShortSunday: String { return self._s[2322]! } - public var Passport_InfoFAQ_URL: String { return self._s[2323]! } - public var ContactInfo_Job: String { return self._s[2325]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2326]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2327]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2328]! } - public var Invite_ChannelsTooMuch: String { return self._s[2329]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2330]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2331]! } - public var CallFeedback_ReasonNoise: String { return self._s[2332]! } - public var Appearance_AppIconDefault: String { return self._s[2334]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2335]! } - public var MediaPicker_AddCaption: String { return self._s[2336]! } - public var CallSettings_TabIconDescription: String { return self._s[2337]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2322]! } + public var Login_PhoneTitle: String { return self._s[2323]! } + public var Passport_FieldPhoneHelp: String { return self._s[2324]! } + public var Weekday_ShortSunday: String { return self._s[2325]! } + public var Passport_InfoFAQ_URL: String { return self._s[2326]! } + public var ContactInfo_Job: String { return self._s[2328]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2329]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2330]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2331]! } + public var Invite_ChannelsTooMuch: String { return self._s[2332]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2333]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2334]! } + public var CallFeedback_ReasonNoise: String { return self._s[2335]! } + public var Appearance_AppIconDefault: String { return self._s[2337]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2338]! } + public var MediaPicker_AddCaption: String { return self._s[2339]! } + public var CallSettings_TabIconDescription: String { return self._s[2340]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2338]!, self._r[2338]!, [_0]) + return formatWithArgumentRanges(self._s[2341]!, self._r[2341]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2339]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2340]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2341]! } - public var DialogList_SearchSectionRecent: String { return self._s[2342]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2343]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2346]! } - public var LastSeen_WithinAWeek: String { return self._s[2347]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2348]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2350]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2351]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2342]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2343]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2344]! } + public var DialogList_SearchSectionRecent: String { return self._s[2345]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2346]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2349]! } + public var LastSeen_WithinAWeek: String { return self._s[2350]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2351]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2353]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2354]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2352]!, self._r[2352]!, [_0]) + return formatWithArgumentRanges(self._s[2355]!, self._r[2355]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2353]! } - public var Conversation_StatusLeftGroup: String { return self._s[2354]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2355]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2357]! } - public var GroupPermission_AddSuccess: String { return self._s[2358]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2360]! } - public var Conversation_ContextMenuCopy: String { return self._s[2361]! } - public var AccessDenied_CallMicrophone: String { return self._s[2362]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2356]! } + public var Conversation_StatusLeftGroup: String { return self._s[2357]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2358]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2360]! } + public var GroupPermission_AddSuccess: String { return self._s[2361]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2363]! } + public var Conversation_ContextMenuCopy: String { return self._s[2364]! } + public var AccessDenied_CallMicrophone: String { return self._s[2365]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2366]!, self._r[2366]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2364]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2365]! } - public var Checkout_PaymentMethod_New: String { return self._s[2366]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2367]! } - public var PhotoEditor_QualityTool: String { return self._s[2368]! } - public var Login_SendCodeViaSms: String { return self._s[2369]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2370]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2371]! } - public var Login_EmailNotConfiguredError: String { return self._s[2372]! } - public var SocksProxySetup_Status: String { return self._s[2373]! } - public var PrivacyPolicy_Accept: String { return self._s[2374]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2375]! } - public var Appearance_AppIconClassicX: String { return self._s[2376]! } + public var Login_InvalidFirstNameError: String { return self._s[2367]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2368]! } + public var Checkout_PaymentMethod_New: String { return self._s[2369]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2370]! } + public var PhotoEditor_QualityTool: String { return self._s[2371]! } + public var Login_SendCodeViaSms: String { return self._s[2372]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2373]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2374]! } + public var Login_EmailNotConfiguredError: String { return self._s[2375]! } + public var SocksProxySetup_Status: String { return self._s[2376]! } + public var PrivacyPolicy_Accept: String { return self._s[2377]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2378]! } + public var Appearance_AppIconClassicX: String { return self._s[2379]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2377]!, self._r[2377]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2380]!, self._r[2380]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2378]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2379]! } - public var AutoNightTheme_Automatic: String { return self._s[2380]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2381]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2382]! } - public var Cache_Help: String { return self._s[2383]! } - public var Group_ErrorAccessDenied: String { return self._s[2384]! } - public var Passport_Language_fa: String { return self._s[2385]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2386]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2387]! } - public var PrivacySettings_LastSeen: String { return self._s[2388]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2381]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2382]! } + public var AutoNightTheme_Automatic: String { return self._s[2383]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2384]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2385]! } + public var Cache_Help: String { return self._s[2386]! } + public var Group_ErrorAccessDenied: String { return self._s[2387]! } + public var Passport_Language_fa: String { return self._s[2388]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2389]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2390]! } + public var PrivacySettings_LastSeen: String { return self._s[2391]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2389]!, self._r[2389]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2392]!, self._r[2392]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2393]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2394]! } - public var Profile_About: String { return self._s[2395]! } - public var Channel_About_Placeholder: String { return self._s[2396]! } - public var Login_InfoTitle: String { return self._s[2397]! } + public var Preview_SaveGif: String { return self._s[2396]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2397]! } + public var Profile_About: String { return self._s[2398]! } + public var Channel_About_Placeholder: String { return self._s[2399]! } + public var Login_InfoTitle: String { return self._s[2400]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2398]!, self._r[2398]!, [_0]) + return formatWithArgumentRanges(self._s[2401]!, self._r[2401]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2400]! } - public var ContactInfo_Title: String { return self._s[2401]! } - public var Media_ShareThisVideo: String { return self._s[2402]! } - public var Weekday_ShortFriday: String { return self._s[2403]! } - public var AccessDenied_Contacts: String { return self._s[2405]! } - public var Notification_CallIncomingShort: String { return self._s[2406]! } - public var Group_Setup_TypePublic: String { return self._s[2407]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2408]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2409]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2412]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2413]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2414]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2415]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2416]! } - public var DialogList_Typing: String { return self._s[2417]! } - public var CallFeedback_IncludeLogs: String { return self._s[2419]! } - public var Checkout_Phone: String { return self._s[2421]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2424]! } - public var Privacy_Calls_Integration: String { return self._s[2425]! } - public var Notifications_PermissionsAllow: String { return self._s[2426]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2430]! } - public var Settings_ChatSettings: String { return self._s[2431]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2403]! } + public var ContactInfo_Title: String { return self._s[2404]! } + public var Media_ShareThisVideo: String { return self._s[2405]! } + public var Weekday_ShortFriday: String { return self._s[2406]! } + public var AccessDenied_Contacts: String { return self._s[2408]! } + public var Notification_CallIncomingShort: String { return self._s[2409]! } + public var Group_Setup_TypePublic: String { return self._s[2410]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2411]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2412]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2415]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2416]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2417]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2418]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2419]! } + public var DialogList_Typing: String { return self._s[2420]! } + public var CallFeedback_IncludeLogs: String { return self._s[2422]! } + public var Checkout_Phone: String { return self._s[2424]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2427]! } + public var Privacy_Calls_Integration: String { return self._s[2428]! } + public var Notifications_PermissionsAllow: String { return self._s[2429]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2433]! } + public var Settings_ChatSettings: String { return self._s[2434]! } public func PUSH_MESSAGE_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2432]!, self._r[2432]!, [_1]) + return formatWithArgumentRanges(self._s[2435]!, self._r[2435]!, [_1]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2435]! } + public var GroupRemoved_DeleteUser: String { return self._s[2438]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_0]) + return formatWithArgumentRanges(self._s[2439]!, self._r[2439]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2437]!, self._r[2437]!, [_1]) + return formatWithArgumentRanges(self._s[2440]!, self._r[2440]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2438]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2439]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2441]! } - public var Conversation_Unblock: String { return self._s[2442]! } - public var PrivacySettings_DataSettings: String { return self._s[2443]! } - public var Group_PublicLink_Info: String { return self._s[2444]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2445]! } + public var Login_ContinueWithLocalization: String { return self._s[2441]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2442]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2444]! } + public var Conversation_Unblock: String { return self._s[2445]! } + public var PrivacySettings_DataSettings: String { return self._s[2446]! } + public var Group_PublicLink_Info: String { return self._s[2447]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2448]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2446]!, self._r[2446]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2449]!, self._r[2449]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2449]! } - public var Call_Mute: String { return self._s[2450]! } - public var Passport_Language_dz: String { return self._s[2451]! } - public var Passport_Language_tk: String { return self._s[2452]! } + public var PrivacySettings_Passcode: String { return self._s[2452]! } + public var Call_Mute: String { return self._s[2453]! } + public var Passport_Language_dz: String { return self._s[2454]! } + public var Passport_Language_tk: String { return self._s[2455]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_0]) + return formatWithArgumentRanges(self._s[2456]!, self._r[2456]!, [_0]) } - public var Settings_Search: String { return self._s[2454]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2455]! } - public var Conversation_ContextMenuReply: String { return self._s[2456]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2457]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2458]! } - public var Tour_Title1: String { return self._s[2459]! } - public var Conversation_ClearGroupHistory: String { return self._s[2461]! } - public var WallpaperPreview_Motion: String { return self._s[2462]! } + public var Settings_Search: String { return self._s[2457]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2458]! } + public var Conversation_ContextMenuReply: String { return self._s[2459]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2460]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2461]! } + public var Tour_Title1: String { return self._s[2462]! } + public var Conversation_ClearGroupHistory: String { return self._s[2464]! } + public var WallpaperPreview_Motion: String { return self._s[2465]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) + return formatWithArgumentRanges(self._s[2466]!, self._r[2466]!, [_0]) } - public var Call_RateCall: String { return self._s[2464]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2465]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2466]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2467]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2469]! } + public var Call_RateCall: String { return self._s[2467]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2468]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2469]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2470]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2472]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2471]!, self._r[2471]!, [_0]) + return formatWithArgumentRanges(self._s[2474]!, self._r[2474]!, [_0]) } - public var Compose_Create: String { return self._s[2472]! } - public var Contacts_InviteToTelegram: String { return self._s[2473]! } - public var GroupInfo_Notifications: String { return self._s[2474]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2476]! } - public var Month_GenApril: String { return self._s[2477]! } - public var Appearance_AutoNightTheme: String { return self._s[2478]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2480]! } - public var Login_CodeSentSms: String { return self._s[2482]! } + public var Compose_Create: String { return self._s[2475]! } + public var Contacts_InviteToTelegram: String { return self._s[2476]! } + public var GroupInfo_Notifications: String { return self._s[2477]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2479]! } + public var Month_GenApril: String { return self._s[2480]! } + public var Appearance_AutoNightTheme: String { return self._s[2481]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2483]! } + public var Login_CodeSentSms: String { return self._s[2485]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2483]!, self._r[2483]!, [_0]) + return formatWithArgumentRanges(self._s[2486]!, self._r[2486]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2484]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2485]! } - public var Passport_Language_hr: String { return self._s[2486]! } - public var Common_ActionNotAllowedError: String { return self._s[2487]! } + public var EmptyGroupInfo_Line3: String { return self._s[2487]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2488]! } + public var Passport_Language_hr: String { return self._s[2489]! } + public var Common_ActionNotAllowedError: String { return self._s[2490]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) + return formatWithArgumentRanges(self._s[2491]!, self._r[2491]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2489]! } - public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2490]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2491]! } - public var Privacy_SecretChatsTitle: String { return self._s[2492]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2494]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2495]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2496]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2497]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2498]! } - public var Preview_DeleteGif: String { return self._s[2499]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2500]! } - public var Group_ErrorNotMutualContact: String { return self._s[2501]! } - public var Notification_MessageLifetime5s: String { return self._s[2502]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2492]! } + public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2493]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2494]! } + public var Privacy_SecretChatsTitle: String { return self._s[2495]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2497]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2498]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2499]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2500]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2501]! } + public var Preview_DeleteGif: String { return self._s[2502]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2503]! } + public var Group_ErrorNotMutualContact: String { return self._s[2504]! } + public var Notification_MessageLifetime5s: String { return self._s[2505]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2503]!, self._r[2503]!, [_0]) + return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2504]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2506]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2507]! } - public var Passport_Address_AddBankStatement: String { return self._s[2508]! } - public var Notification_CallIncoming: String { return self._s[2509]! } - public var Compose_NewGroupTitle: String { return self._s[2510]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2512]! } - public var Passport_Address_Postcode: String { return self._s[2514]! } + public var VoiceOver_Chat_Video: String { return self._s[2507]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2509]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2510]! } + public var Passport_Address_AddBankStatement: String { return self._s[2511]! } + public var Notification_CallIncoming: String { return self._s[2512]! } + public var Compose_NewGroupTitle: String { return self._s[2513]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2515]! } + public var Passport_Address_Postcode: String { return self._s[2517]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2515]!, self._r[2515]!, [_0]) + return formatWithArgumentRanges(self._s[2518]!, self._r[2518]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2516]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2517]! } - public var WallpaperColors_Title: String { return self._s[2518]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2519]! } - public var VoiceOver_MessageContextForward: String { return self._s[2520]! } - public var GroupPermission_Duration: String { return self._s[2521]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2519]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2520]! } + public var WallpaperColors_Title: String { return self._s[2521]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2522]! } + public var VoiceOver_MessageContextForward: String { return self._s[2523]! } + public var GroupPermission_Duration: String { return self._s[2524]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2522]!, self._r[2522]!, [_0]) + return formatWithArgumentRanges(self._s[2525]!, self._r[2525]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2523]! } - public var Username_Placeholder: String { return self._s[2524]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2525]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2526]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2527]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2526]! } + public var Username_Placeholder: String { return self._s[2527]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2528]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2529]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2530]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2529]!, self._r[2529]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2532]!, self._r[2532]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2530]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2531]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2532]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2533]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2534]! } - public var Conversation_ContextMenuMore: String { return self._s[2535]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2536]! } - public var CallSettings_TabIcon: String { return self._s[2537]! } - public var KeyCommand_Find: String { return self._s[2538]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2539]! } - public var Message_PinnedGame: String { return self._s[2540]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2541]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2543]! } - public var Login_CallRequestState2: String { return self._s[2545]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2547]! } + public var Passport_PasswordDescription: String { return self._s[2533]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2534]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2535]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2536]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2537]! } + public var Conversation_ContextMenuMore: String { return self._s[2538]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2539]! } + public var CallSettings_TabIcon: String { return self._s[2540]! } + public var KeyCommand_Find: String { return self._s[2541]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2542]! } + public var Message_PinnedGame: String { return self._s[2543]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2544]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2546]! } + public var Login_CallRequestState2: String { return self._s[2548]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2550]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2548]!, self._r[2548]!, [_0]) + return formatWithArgumentRanges(self._s[2551]!, self._r[2551]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2550]!, self._r[2550]!, [_0]) - } - public var WallpaperPreview_Blurred: String { return self._s[2551]! } - public var Conversation_InstantPagePreview: String { return self._s[2552]! } - public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2556]! } - public var WallpaperSearch_ColorRed: String { return self._s[2557]! } - public var GroupPermission_NoPinMessages: String { return self._s[2558]! } - public var Passport_Language_es: String { return self._s[2559]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2561]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2562]! } + public var WallpaperPreview_Blurred: String { return self._s[2554]! } + public var Conversation_InstantPagePreview: String { return self._s[2555]! } + public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_0]) + } + public var SecretTimer_VideoDescription: String { return self._s[2559]! } + public var WallpaperSearch_ColorRed: String { return self._s[2560]! } + public var GroupPermission_NoPinMessages: String { return self._s[2561]! } + public var Passport_Language_es: String { return self._s[2562]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2564]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2565]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2563]!, self._r[2563]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2564]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2565]! } - public var Watch_UserInfo_Unmute: String { return self._s[2566]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2567]! } - public var AccessDenied_CameraRestricted: String { return self._s[2569]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2567]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2568]! } + public var Watch_UserInfo_Unmute: String { return self._s[2569]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2570]! } + public var AccessDenied_CameraRestricted: String { return self._s[2572]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2570]!, self._r[2570]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2573]!, self._r[2573]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2572]! } - public var Settings_CopyUsername: String { return self._s[2573]! } - public var Contacts_SearchLabel: String { return self._s[2574]! } - public var Map_OpenInYandexNavigator: String { return self._s[2576]! } - public var PasscodeSettings_EncryptData: String { return self._s[2577]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2578]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2579]! } - public var DialogList_AdNoticeAlert: String { return self._s[2580]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2582]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2583]! } - public var Localization_LanguageCustom: String { return self._s[2584]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2585]! } - public var CallFeedback_Title: String { return self._s[2586]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2589]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2590]! } - public var Conversation_InfoGroup: String { return self._s[2591]! } - public var Compose_NewMessage: String { return self._s[2592]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2593]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2594]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2595]! } + public var ChatList_ReadAll: String { return self._s[2575]! } + public var Settings_CopyUsername: String { return self._s[2576]! } + public var Contacts_SearchLabel: String { return self._s[2577]! } + public var Map_OpenInYandexNavigator: String { return self._s[2579]! } + public var PasscodeSettings_EncryptData: String { return self._s[2580]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2581]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2582]! } + public var DialogList_AdNoticeAlert: String { return self._s[2583]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2585]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2586]! } + public var Localization_LanguageCustom: String { return self._s[2587]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2588]! } + public var CallFeedback_Title: String { return self._s[2589]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2592]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2593]! } + public var Conversation_InfoGroup: String { return self._s[2594]! } + public var Compose_NewMessage: String { return self._s[2595]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2596]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2597]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2598]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2596]!, self._r[2596]!, [_0]) + return formatWithArgumentRanges(self._s[2599]!, self._r[2599]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2597]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2598]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2599]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2600]! } - public var Channel_BlackList_Title: String { return self._s[2601]! } - public var UserInfo_PhoneCall: String { return self._s[2602]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2604]! } - public var State_connecting: String { return self._s[2605]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2606]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2600]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2601]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2602]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2603]! } + public var Channel_BlackList_Title: String { return self._s[2604]! } + public var UserInfo_PhoneCall: String { return self._s[2605]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2607]! } + public var State_connecting: String { return self._s[2608]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2609]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2607]!, self._r[2607]!, [_0]) + return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2608]! } - public var Passport_Identity_EditPassport: String { return self._s[2609]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2611]! } - public var Localization_EnglishLanguageName: String { return self._s[2612]! } - public var Share_AuthDescription: String { return self._s[2613]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2614]! } - public var Passport_Identity_Surname: String { return self._s[2615]! } - public var Compose_TokenListPlaceholder: String { return self._s[2616]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2617]! } - public var Settings_AboutEmpty: String { return self._s[2618]! } - public var Conversation_Unmute: String { return self._s[2619]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2621]! } + public var Notifications_GroupNotifications: String { return self._s[2611]! } + public var Passport_Identity_EditPassport: String { return self._s[2612]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2614]! } + public var Localization_EnglishLanguageName: String { return self._s[2615]! } + public var Share_AuthDescription: String { return self._s[2616]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2617]! } + public var Passport_Identity_Surname: String { return self._s[2618]! } + public var Compose_TokenListPlaceholder: String { return self._s[2619]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2620]! } + public var Settings_AboutEmpty: String { return self._s[2621]! } + public var Conversation_Unmute: String { return self._s[2622]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2624]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2622]!, self._r[2622]!, [_1]) + return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2623]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2625]! } - public var ChatSettings_Appearance: String { return self._s[2626]! } - public var Appearance_PickAccentColor: String { return self._s[2627]! } + public var Login_CodeSentCall: String { return self._s[2626]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2628]! } + public var ChatSettings_Appearance: String { return self._s[2629]! } + public var Appearance_PickAccentColor: String { return self._s[2630]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2628]!, self._r[2628]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_1]) + return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2630]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2631]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2632]! } - public var ChatAdmins_AdminLabel: String { return self._s[2634]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2635]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2637]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2638]! } - public var Month_GenJune: String { return self._s[2639]! } - public var Watch_Location_Current: String { return self._s[2640]! } - public var Conversation_TitleMute: String { return self._s[2641]! } + public var Notification_CallMissed: String { return self._s[2633]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2634]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2635]! } + public var ChatAdmins_AdminLabel: String { return self._s[2637]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2638]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2640]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2641]! } + public var Month_GenJune: String { return self._s[2642]! } + public var Watch_Location_Current: String { return self._s[2643]! } + public var Conversation_TitleMute: String { return self._s[2644]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_1]) + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2643]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2646]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_0]) + return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2645]! } - public var Chat_SlowmodeSendError: String { return self._s[2646]! } - public var MaskStickerSettings_Info: String { return self._s[2647]! } + public var Call_ReportPlaceholder: String { return self._s[2648]! } + public var Chat_SlowmodeSendError: String { return self._s[2649]! } + public var MaskStickerSettings_Info: String { return self._s[2650]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_0]) + return formatWithArgumentRanges(self._s[2651]!, self._r[2651]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2649]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2651]! } - public var Contacts_ShareTelegram: String { return self._s[2652]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2653]! } - public var Channel_ErrorAccessDenied: String { return self._s[2654]! } - public var UserInfo_ScamBotWarning: String { return self._s[2656]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2657]! } - public var Call_ConnectionErrorTitle: String { return self._s[2658]! } - public var UserInfo_NotificationsEnable: String { return self._s[2659]! } - public var ArchivedChats_IntroText1: String { return self._s[2660]! } - public var Tour_Text4: String { return self._s[2663]! } - public var WallpaperSearch_Recent: String { return self._s[2664]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2665]! } - public var Profile_MessageLifetime2s: String { return self._s[2667]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2668]! } - public var Notification_MessageLifetime2s: String { return self._s[2669]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2652]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2654]! } + public var Contacts_ShareTelegram: String { return self._s[2655]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2656]! } + public var Channel_ErrorAccessDenied: String { return self._s[2657]! } + public var UserInfo_ScamBotWarning: String { return self._s[2659]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2660]! } + public var Call_ConnectionErrorTitle: String { return self._s[2661]! } + public var UserInfo_NotificationsEnable: String { return self._s[2662]! } + public var ArchivedChats_IntroText1: String { return self._s[2663]! } + public var Tour_Text4: String { return self._s[2666]! } + public var WallpaperSearch_Recent: String { return self._s[2667]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2668]! } + public var Profile_MessageLifetime2s: String { return self._s[2670]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2671]! } + public var Notification_MessageLifetime2s: String { return self._s[2672]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2670]!, self._r[2670]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2673]!, self._r[2673]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2671]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2672]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2673]! } + public var Cache_ClearCache: String { return self._s[2674]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2675]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2676]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) + return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2679]!, self._r[2679]!, [_0]) + return formatWithArgumentRanges(self._s[2682]!, self._r[2682]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2680]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2681]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2682]! } - public var ChatList_UnarchiveAction: String { return self._s[2683]! } - public var AutoNightTheme_Title: String { return self._s[2684]! } - public var InstantPage_FeedbackButton: String { return self._s[2685]! } - public var Passport_FieldAddress: String { return self._s[2686]! } + public var LocalGroup_Text: String { return self._s[2683]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2684]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2685]! } + public var ChatList_UnarchiveAction: String { return self._s[2686]! } + public var AutoNightTheme_Title: String { return self._s[2687]! } + public var InstantPage_FeedbackButton: String { return self._s[2688]! } + public var Passport_FieldAddress: String { return self._s[2689]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2688]! } + public var Month_ShortMarch: String { return self._s[2691]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2692]!, self._r[2692]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2690]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2691]! } - public var Passport_FloodError: String { return self._s[2692]! } - public var SecretGif_Title: String { return self._s[2693]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2694]! } - public var Passport_Language_th: String { return self._s[2696]! } - public var Passport_Address_Address: String { return self._s[2697]! } - public var Login_InvalidLastNameError: String { return self._s[2698]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2699]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2700]! } - public var SettingsSearch_FAQ: String { return self._s[2701]! } - public var ShareMenu_Send: String { return self._s[2702]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2704]! } - public var Month_GenNovember: String { return self._s[2706]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2708]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2693]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2694]! } + public var Passport_FloodError: String { return self._s[2695]! } + public var SecretGif_Title: String { return self._s[2696]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2697]! } + public var Passport_Language_th: String { return self._s[2699]! } + public var Passport_Address_Address: String { return self._s[2700]! } + public var Login_InvalidLastNameError: String { return self._s[2701]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2702]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2703]! } + public var SettingsSearch_FAQ: String { return self._s[2704]! } + public var ShareMenu_Send: String { return self._s[2705]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2707]! } + public var Month_GenNovember: String { return self._s[2709]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2711]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2709]!, self._r[2709]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2712]!, self._r[2712]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2710]! } - public var NotificationsSound_Tritone: String { return self._s[2711]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2713]! } + public var Checkout_Email: String { return self._s[2713]! } + public var NotificationsSound_Tritone: String { return self._s[2714]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2716]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2716]!, self._r[2716]!, [_1]) + return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2717]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2720]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2719]! } - public var Notification_Exceptions_Add: String { return self._s[2720]! } - public var DialogList_You: String { return self._s[2721]! } - public var MediaPicker_Send: String { return self._s[2724]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2725]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2726]! } - public var Call_AudioRouteSpeaker: String { return self._s[2727]! } - public var Watch_UserInfo_Title: String { return self._s[2728]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2729]! } - public var Appearance_AccentColor: String { return self._s[2730]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2722]! } + public var Notification_Exceptions_Add: String { return self._s[2723]! } + public var DialogList_You: String { return self._s[2724]! } + public var MediaPicker_Send: String { return self._s[2727]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2728]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2729]! } + public var Call_AudioRouteSpeaker: String { return self._s[2730]! } + public var Watch_UserInfo_Title: String { return self._s[2731]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2732]! } + public var Appearance_AccentColor: String { return self._s[2733]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2731]!, self._r[2731]!, [_0]) + return formatWithArgumentRanges(self._s[2734]!, self._r[2734]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2732]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2735]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2736]!, self._r[2736]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2734]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2735]! } - public var Notification_CallOutgoing: String { return self._s[2736]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2737]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2738]! } - public var Call_RecordingDisabledMessage: String { return self._s[2739]! } - public var Message_Game: String { return self._s[2740]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2741]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2742]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2743]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2744]! } - public var Date_DialogDateFormat: String { return self._s[2745]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2746]! } - public var Notifications_InAppNotifications: String { return self._s[2747]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2737]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2738]! } + public var Notification_CallOutgoing: String { return self._s[2739]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2740]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2741]! } + public var Call_RecordingDisabledMessage: String { return self._s[2742]! } + public var Message_Game: String { return self._s[2743]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2744]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2745]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2746]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2747]! } + public var Date_DialogDateFormat: String { return self._s[2748]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2749]! } + public var Notifications_InAppNotifications: String { return self._s[2750]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2748]!, self._r[2748]!, [_0]) - } - public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2749]!, self._r[2749]!, [_1, _2]) - } - public var NewContact_Title: String { return self._s[2750]! } - public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2752]! } + public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2752]!, self._r[2752]!, [_1, _2]) + } + public var NewContact_Title: String { return self._s[2753]! } + public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_0]) + } + public var Conversation_ViewContactDetails: String { return self._s[2755]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_1]) + return formatWithArgumentRanges(self._s[2757]!, self._r[2757]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2755]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2756]! } - public var PrivacySettings_Title: String { return self._s[2757]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2760]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2761]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2762]! } - public var Contacts_PhoneNumber: String { return self._s[2763]! } - public var Map_ShowPlaces: String { return self._s[2765]! } - public var ChatAdmins_Title: String { return self._s[2766]! } - public var InstantPage_Reference: String { return self._s[2768]! } - public var ReportGroupLocation_Text: String { return self._s[2769]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2758]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2759]! } + public var PrivacySettings_Title: String { return self._s[2760]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2763]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2764]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2765]! } + public var Contacts_PhoneNumber: String { return self._s[2766]! } + public var Map_ShowPlaces: String { return self._s[2768]! } + public var ChatAdmins_Title: String { return self._s[2769]! } + public var InstantPage_Reference: String { return self._s[2771]! } + public var ReportGroupLocation_Text: String { return self._s[2772]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2770]!, self._r[2770]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2771]! } - public var Watch_UserInfo_Block: String { return self._s[2772]! } - public var ChatSettings_Stickers: String { return self._s[2773]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2774]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2775]! } + public var Camera_FlashOff: String { return self._s[2774]! } + public var Watch_UserInfo_Block: String { return self._s[2775]! } + public var ChatSettings_Stickers: String { return self._s[2776]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2777]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2778]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2776]!, self._r[2776]!, [_0]) + return formatWithArgumentRanges(self._s[2779]!, self._r[2779]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2777]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2778]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2779]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2780]! } - public var VoiceOver_MessageContextShare: String { return self._s[2781]! } + public var Settings_ViewPhoto: String { return self._s[2780]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2781]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2782]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2783]! } + public var VoiceOver_MessageContextShare: String { return self._s[2784]! } + public var CreateTheme_Title: String { return self._s[2786]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2783]!, self._r[2783]!, [_0]) + return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2784]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2785]! } + public var Privacy_DeleteDrafts: String { return self._s[2788]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2789]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_0]) + return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2787]! } - public var DialogList_SavedMessages: String { return self._s[2788]! } - public var GroupInfo_UpgradeButton: String { return self._s[2789]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2791]! } - public var DialogList_Pin: String { return self._s[2792]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2791]! } + public var DialogList_SavedMessages: String { return self._s[2792]! } + public var GroupInfo_UpgradeButton: String { return self._s[2793]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2795]! } + public var DialogList_Pin: String { return self._s[2796]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2797]!, self._r[2797]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) + return formatWithArgumentRanges(self._s[2798]!, self._r[2798]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2795]! } - public var UserInfo_NotificationsDisable: String { return self._s[2796]! } - public var Paint_Outlined: String { return self._s[2797]! } - public var Activity_PlayingGame: String { return self._s[2798]! } - public var SearchImages_NoImagesFound: String { return self._s[2799]! } - public var SocksProxySetup_ProxyType: String { return self._s[2800]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2802]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2803]! } - public var Settings_AppLanguage: String { return self._s[2804]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2805]! } - public var Common_ChoosePhoto: String { return self._s[2806]! } - public var CallFeedback_ReasonEcho: String { return self._s[2807]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2799]! } + public var UserInfo_NotificationsDisable: String { return self._s[2800]! } + public var Paint_Outlined: String { return self._s[2801]! } + public var Activity_PlayingGame: String { return self._s[2802]! } + public var SearchImages_NoImagesFound: String { return self._s[2803]! } + public var SocksProxySetup_ProxyType: String { return self._s[2804]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2806]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2807]! } + public var Settings_AppLanguage: String { return self._s[2808]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2809]! } + public var Common_ChoosePhoto: String { return self._s[2810]! } + public var CallFeedback_ReasonEcho: String { return self._s[2811]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_1]) + return formatWithArgumentRanges(self._s[2812]!, self._r[2812]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2809]! } - public var Activity_UploadingVideo: String { return self._s[2810]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2811]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2812]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2813]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2814]! } - public var Checkout_PayWithTouchId: String { return self._s[2815]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2816]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2813]! } + public var Activity_UploadingVideo: String { return self._s[2814]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2815]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2816]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2817]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2818]! } + public var Checkout_PayWithTouchId: String { return self._s[2819]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2820]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2818]!, self._r[2818]!, [_1]) + return formatWithArgumentRanges(self._s[2822]!, self._r[2822]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2819]! } + public var Notifications_ExceptionsNone: String { return self._s[2823]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_0]) + return formatWithArgumentRanges(self._s[2824]!, self._r[2824]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2821]!, self._r[2821]!, [_1]) + return formatWithArgumentRanges(self._s[2825]!, self._r[2825]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2823]! } - public var Passport_Address_Region: String { return self._s[2826]! } - public var ChatList_DeleteChat: String { return self._s[2827]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2828]! } - public var PhotoEditor_TiltShift: String { return self._s[2829]! } - public var Settings_FAQ_URL: String { return self._s[2830]! } - public var Passport_Language_sl: String { return self._s[2831]! } - public var Settings_PrivacySettings: String { return self._s[2833]! } - public var SharedMedia_TitleLink: String { return self._s[2834]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2835]! } - public var Settings_SetProfilePhoto: String { return self._s[2836]! } - public var Channel_About_Help: String { return self._s[2837]! } - public var Contacts_PermissionsEnable: String { return self._s[2838]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2839]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2840]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2842]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2843]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2844]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2845]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2846]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2848]! } - public var Map_OpenInYandexMaps: String { return self._s[2850]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2851]! } - public var VoiceOver_MessageContextReply: String { return self._s[2852]! } - public var PhotoEditor_SaturationTool: String { return self._s[2853]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2827]! } + public var Passport_Address_Region: String { return self._s[2830]! } + public var ChatList_DeleteChat: String { return self._s[2831]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2832]! } + public var PhotoEditor_TiltShift: String { return self._s[2833]! } + public var Settings_FAQ_URL: String { return self._s[2834]! } + public var Passport_Language_sl: String { return self._s[2835]! } + public var Settings_PrivacySettings: String { return self._s[2837]! } + public var SharedMedia_TitleLink: String { return self._s[2838]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2839]! } + public var Settings_SetProfilePhoto: String { return self._s[2840]! } + public var Channel_About_Help: String { return self._s[2841]! } + public var Contacts_PermissionsEnable: String { return self._s[2842]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2843]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2844]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2846]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2847]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2848]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2849]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2850]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2852]! } + public var Map_OpenInYandexMaps: String { return self._s[2854]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2855]! } + public var VoiceOver_MessageContextReply: String { return self._s[2856]! } + public var PhotoEditor_SaturationTool: String { return self._s[2857]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2858]!, self._r[2858]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2855]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2856]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2857]! } - public var Appearance_TextSize: String { return self._s[2858]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2859]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2860]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2861]! } + public var Appearance_TextSize: String { return self._s[2862]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2863]!, self._r[2863]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2860]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2862]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2864]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2866]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2863]!, self._r[2863]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2867]!, self._r[2867]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2864]!, self._r[2864]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2868]!, self._r[2868]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2865]! } - public var Passport_PassportInformation: String { return self._s[2868]! } - public var WatchRemote_AlertTitle: String { return self._s[2869]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2870]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2872]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2869]! } + public var Passport_PassportInformation: String { return self._s[2872]! } + public var WatchRemote_AlertTitle: String { return self._s[2873]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2874]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2876]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2873]!, self._r[2873]!, [_0]) + return formatWithArgumentRanges(self._s[2877]!, self._r[2877]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2874]!, self._r[2874]!, [_1]) + return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2875]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2877]! } - public var AccessDenied_CameraDisabled: String { return self._s[2878]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2879]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2881]! } + public var AccessDenied_CameraDisabled: String { return self._s[2882]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) + return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2882]! } + public var PhotoEditor_ContrastTool: String { return self._s[2886]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_1]) + return formatWithArgumentRanges(self._s[2887]!, self._r[2887]!, [_1]) } - public var DialogList_Draft: String { return self._s[2884]! } - public var Privacy_TopPeersDelete: String { return self._s[2886]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2887]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2888]! } - public var WebSearch_RecentSectionClear: String { return self._s[2889]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2891]! } - public var Common_Done: String { return self._s[2893]! } - public var AuthSessions_EmptyText: String { return self._s[2894]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2895]! } - public var Tour_Title5: String { return self._s[2896]! } + public var DialogList_Draft: String { return self._s[2888]! } + public var Privacy_TopPeersDelete: String { return self._s[2890]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2891]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2892]! } + public var WebSearch_RecentSectionClear: String { return self._s[2893]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2895]! } + public var Common_Done: String { return self._s[2897]! } + public var AuthSessions_EmptyText: String { return self._s[2898]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2899]! } + public var Tour_Title5: String { return self._s[2900]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_0]) + return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2898]! } - public var Conversation_LinkDialogSave: String { return self._s[2899]! } - public var GroupInfo_ActionRestrict: String { return self._s[2900]! } - public var Checkout_Title: String { return self._s[2901]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2903]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2905]! } - public var Notification_RenamedGroup: String { return self._s[2906]! } - public var PeopleNearby_Groups: String { return self._s[2907]! } - public var Checkout_PayWithFaceId: String { return self._s[2908]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2909]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2911]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2912]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2913]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2902]! } + public var Conversation_LinkDialogSave: String { return self._s[2903]! } + public var GroupInfo_ActionRestrict: String { return self._s[2904]! } + public var Checkout_Title: String { return self._s[2905]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2907]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2909]! } + public var Notification_RenamedGroup: String { return self._s[2910]! } + public var PeopleNearby_Groups: String { return self._s[2911]! } + public var Checkout_PayWithFaceId: String { return self._s[2912]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2913]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2915]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2916]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2917]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_0]) + return formatWithArgumentRanges(self._s[2918]!, self._r[2918]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2916]! } + public var Profile_AddToExisting: String { return self._s[2920]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2917]!, self._r[2917]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2919]! } - public var Permissions_PrivacyPolicy: String { return self._s[2920]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2921]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2922]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2924]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2926]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2927]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2928]! } - public var VoiceOver_AttachMedia: String { return self._s[2930]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2931]! } + public var Cache_Files: String { return self._s[2923]! } + public var Permissions_PrivacyPolicy: String { return self._s[2924]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2925]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2926]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2928]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2930]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2931]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2932]! } + public var VoiceOver_AttachMedia: String { return self._s[2934]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2935]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2932]!, self._r[2932]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2936]!, self._r[2936]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2933]! } - public var Conversation_SetReminder_Title: String { return self._s[2934]! } - public var Passport_FieldAddressHelp: String { return self._s[2935]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2936]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2937]! } + public var Conversation_SetReminder_Title: String { return self._s[2938]! } + public var Passport_FieldAddressHelp: String { return self._s[2939]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2940]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2937]!, self._r[2937]!, [_0]) + return formatWithArgumentRanges(self._s[2941]!, self._r[2941]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2938]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2940]! } - public var Login_UnknownError: String { return self._s[2941]! } - public var Group_UpgradeNoticeText2: String { return self._s[2943]! } - public var Watch_Compose_AddContact: String { return self._s[2944]! } - public var Web_Error: String { return self._s[2945]! } - public var Gif_Search: String { return self._s[2946]! } - public var Profile_MessageLifetime1h: String { return self._s[2947]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2948]! } - public var Channel_Username_CheckingUsername: String { return self._s[2949]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2950]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2951]! } - public var Channel_AboutItem: String { return self._s[2952]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2954]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2955]! } - public var GroupInfo_SharedMedia: String { return self._s[2956]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2942]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2944]! } + public var Login_UnknownError: String { return self._s[2945]! } + public var Group_UpgradeNoticeText2: String { return self._s[2947]! } + public var Watch_Compose_AddContact: String { return self._s[2948]! } + public var Web_Error: String { return self._s[2949]! } + public var Gif_Search: String { return self._s[2950]! } + public var Profile_MessageLifetime1h: String { return self._s[2951]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2952]! } + public var Channel_Username_CheckingUsername: String { return self._s[2953]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2954]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2955]! } + public var Channel_AboutItem: String { return self._s[2956]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2958]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2959]! } + public var GroupInfo_SharedMedia: String { return self._s[2960]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_1]) + return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2958]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2962]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_1]) + return formatWithArgumentRanges(self._s[2963]!, self._r[2963]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2960]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2961]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2962]! } - public var CreatePoll_AddOption: String { return self._s[2963]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2964]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2965]! } - public var Channel_Management_AddModerator: String { return self._s[2966]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2967]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2968]! } - public var NotificationsSound_Hello: String { return self._s[2969]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2970]! } - public var Channel_Stickers_Placeholder: String { return self._s[2972]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2964]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2965]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2966]! } + public var CreatePoll_AddOption: String { return self._s[2967]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2968]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2969]! } + public var Channel_Management_AddModerator: String { return self._s[2970]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2971]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2972]! } + public var NotificationsSound_Hello: String { return self._s[2973]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2974]! } + public var Channel_Stickers_Placeholder: String { return self._s[2976]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2973]!, self._r[2973]!, [_0]) + return formatWithArgumentRanges(self._s[2977]!, self._r[2977]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2974]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2975]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2976]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2977]! } - public var AutoDownloadSettings_Channels: String { return self._s[2978]! } - public var Passport_Language_mn: String { return self._s[2979]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2982]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2983]! } - public var Passport_Language_ja: String { return self._s[2985]! } - public var Settings_About_Title: String { return self._s[2986]! } - public var Settings_NotificationsAndSounds: String { return self._s[2987]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2988]! } - public var Settings_BlockedUsers: String { return self._s[2989]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2978]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2979]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2980]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2981]! } + public var AutoDownloadSettings_Channels: String { return self._s[2982]! } + public var Passport_Language_mn: String { return self._s[2983]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2986]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2987]! } + public var Passport_Language_ja: String { return self._s[2989]! } + public var Settings_About_Title: String { return self._s[2990]! } + public var Settings_NotificationsAndSounds: String { return self._s[2991]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2992]! } + public var Settings_BlockedUsers: String { return self._s[2993]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_0]) - } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2991]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2992]! } - public var Channel_Username_Title: String { return self._s[2993]! } - public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2994]!, self._r[2994]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[2996]! } - public var AppleWatch_Title: String { return self._s[2997]! } - public var Activity_RecordingVideoMessage: String { return self._s[2998]! } - public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_1, _2]) + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2995]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2996]! } + public var Channel_Username_Title: String { return self._s[2997]! } + public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2998]!, self._r[2998]!, [_0]) } - public var Weekday_Saturday: String { return self._s[3000]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3001]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3002]! } - public var Common_Next: String { return self._s[3004]! } - public var Channel_Stickers_YourStickers: String { return self._s[3006]! } - public var Call_AudioRouteHeadphones: String { return self._s[3007]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3009]! } - public var Watch_Contacts_NoResults: String { return self._s[3011]! } - public var PhotoEditor_TintTool: String { return self._s[3014]! } - public var LoginPassword_ResetAccount: String { return self._s[3016]! } - public var Settings_SavedMessages: String { return self._s[3017]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3018]! } - public var Bot_GenericSupportStatus: String { return self._s[3019]! } - public var StickerPack_Add: String { return self._s[3020]! } - public var Checkout_TotalAmount: String { return self._s[3021]! } - public var Your_cards_number_is_invalid: String { return self._s[3022]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3023]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3024]! } + public var AttachmentMenu_File: String { return self._s[3000]! } + public var AppleWatch_Title: String { return self._s[3001]! } + public var Activity_RecordingVideoMessage: String { return self._s[3002]! } + public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3003]!, self._r[3003]!, [_1, _2]) + } + public var Weekday_Saturday: String { return self._s[3004]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3005]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3006]! } + public var Common_Next: String { return self._s[3008]! } + public var Channel_Stickers_YourStickers: String { return self._s[3010]! } + public var Call_AudioRouteHeadphones: String { return self._s[3011]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3013]! } + public var Watch_Contacts_NoResults: String { return self._s[3015]! } + public var PhotoEditor_TintTool: String { return self._s[3018]! } + public var LoginPassword_ResetAccount: String { return self._s[3020]! } + public var Settings_SavedMessages: String { return self._s[3021]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3022]! } + public var Bot_GenericSupportStatus: String { return self._s[3023]! } + public var StickerPack_Add: String { return self._s[3024]! } + public var Checkout_TotalAmount: String { return self._s[3025]! } + public var Your_cards_number_is_invalid: String { return self._s[3026]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3027]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3028]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3025]!, self._r[3025]!, [_0]) + return formatWithArgumentRanges(self._s[3029]!, self._r[3029]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3026]!, self._r[3026]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3027]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3031]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3029]!, self._r[3029]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3033]!, self._r[3033]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0]) + return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3031]! } - public var StickerPack_Share: String { return self._s[3032]! } - public var Passport_DeleteAddress: String { return self._s[3033]! } - public var Settings_Passport: String { return self._s[3034]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3035]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3036]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3037]! } - public var Contacts_PermissionsText: String { return self._s[3038]! } - public var Group_Setup_HistoryVisible: String { return self._s[3039]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3041]! } - public var SocksProxySetup_Title: String { return self._s[3042]! } - public var Notification_Mute1h: String { return self._s[3043]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3035]! } + public var StickerPack_Share: String { return self._s[3036]! } + public var Passport_DeleteAddress: String { return self._s[3037]! } + public var Settings_Passport: String { return self._s[3038]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3039]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3040]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3041]! } + public var Contacts_PermissionsText: String { return self._s[3042]! } + public var Group_Setup_HistoryVisible: String { return self._s[3043]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3045]! } + public var SocksProxySetup_Title: String { return self._s[3046]! } + public var Notification_Mute1h: String { return self._s[3047]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3044]!, self._r[3044]!, [_0]) + return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3045]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3049]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_1]) + return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3047]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3050]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3052]! } - public var DialogList_NoMessagesText: String { return self._s[3053]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3054]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3055]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3057]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3058]! } - public var Common_TakePhotoOrVideo: String { return self._s[3059]! } - public var Call_StatusBusy: String { return self._s[3060]! } - public var Conversation_PinnedMessage: String { return self._s[3061]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3062]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3063]! } - public var Undo_ChatCleared: String { return self._s[3064]! } - public var AppleWatch_ReplyPresets: String { return self._s[3065]! } - public var Passport_DiscardMessageDescription: String { return self._s[3067]! } - public var Login_NetworkError: String { return self._s[3068]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3051]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3054]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3056]! } + public var DialogList_NoMessagesText: String { return self._s[3057]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3058]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3059]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3061]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3062]! } + public var Common_TakePhotoOrVideo: String { return self._s[3063]! } + public var Call_StatusBusy: String { return self._s[3064]! } + public var Conversation_PinnedMessage: String { return self._s[3065]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3066]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3067]! } + public var Undo_ChatCleared: String { return self._s[3068]! } + public var AppleWatch_ReplyPresets: String { return self._s[3069]! } + public var Passport_DiscardMessageDescription: String { return self._s[3071]! } + public var Login_NetworkError: String { return self._s[3072]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3069]!, self._r[3069]!, [_0]) + return formatWithArgumentRanges(self._s[3073]!, self._r[3073]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3070]!, self._r[3070]!, [_0]) + return formatWithArgumentRanges(self._s[3074]!, self._r[3074]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3071]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3073]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3075]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3077]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) + return formatWithArgumentRanges(self._s[3079]!, self._r[3079]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3076]! } - public var VoiceOver_Chat_Music: String { return self._s[3077]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3078]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3080]! } - public var ConversationMedia_Title: String { return self._s[3081]! } - public var EncryptionKey_Title: String { return self._s[3083]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3084]! } - public var Notification_Exceptions_AddException: String { return self._s[3085]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3086]! } - public var Profile_MessageLifetime1m: String { return self._s[3087]! } + public var Call_ConnectionErrorMessage: String { return self._s[3080]! } + public var VoiceOver_Chat_Music: String { return self._s[3081]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3082]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3084]! } + public var ConversationMedia_Title: String { return self._s[3085]! } + public var EncryptionKey_Title: String { return self._s[3087]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3088]! } + public var Notification_Exceptions_AddException: String { return self._s[3089]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3090]! } + public var Profile_MessageLifetime1m: String { return self._s[3091]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_1]) + return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_1]) } - public var Month_GenMay: String { return self._s[3089]! } + public var Month_GenMay: String { return self._s[3093]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_0]) + return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3091]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3092]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3093]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3095]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3096]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3097]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3098]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3099]! } - public var Channel_JoinChannel: String { return self._s[3101]! } - public var Appearance_Animations: String { return self._s[3104]! } + public var PeopleNearby_Users: String { return self._s[3095]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3096]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3097]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3099]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3100]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3101]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3102]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3103]! } + public var Channel_JoinChannel: String { return self._s[3105]! } + public var Appearance_Animations: String { return self._s[3108]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3105]!, self._r[3105]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3107]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3109]! } - public var Passport_Address_Street: String { return self._s[3110]! } - public var Conversation_AddContact: String { return self._s[3111]! } - public var Login_PhonePlaceholder: String { return self._s[3112]! } - public var Channel_Members_InviteLink: String { return self._s[3114]! } - public var Bot_Stop: String { return self._s[3115]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3117]! } - public var Notification_PassportValueAddress: String { return self._s[3118]! } - public var Month_ShortJuly: String { return self._s[3119]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3120]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3121]! } - public var Passport_Identity_ReverseSide: String { return self._s[3122]! } - public var Watch_Stickers_Recents: String { return self._s[3125]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3127]! } - public var Map_SendThisLocation: String { return self._s[3128]! } + public var Stickers_GroupStickers: String { return self._s[3111]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3113]! } + public var Passport_Address_Street: String { return self._s[3114]! } + public var Conversation_AddContact: String { return self._s[3115]! } + public var Login_PhonePlaceholder: String { return self._s[3116]! } + public var Channel_Members_InviteLink: String { return self._s[3118]! } + public var Bot_Stop: String { return self._s[3119]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3121]! } + public var Notification_PassportValueAddress: String { return self._s[3122]! } + public var Month_ShortJuly: String { return self._s[3123]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3124]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3125]! } + public var Passport_Identity_ReverseSide: String { return self._s[3126]! } + public var Watch_Stickers_Recents: String { return self._s[3129]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3131]! } + public var Map_SendThisLocation: String { return self._s[3132]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3129]!, self._r[3129]!, [_0]) + return formatWithArgumentRanges(self._s[3133]!, self._r[3133]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_0]) + return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3131]! } + public var ConvertToSupergroup_Note: String { return self._s[3135]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_0]) + return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3133]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3137]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3136]! } - public var Wallpaper_SearchShort: String { return self._s[3137]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3139]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3140]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3141]! } + public var Login_CallRequestState3: String { return self._s[3140]! } + public var Wallpaper_SearchShort: String { return self._s[3141]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3143]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3144]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3145]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3142]!, self._r[3142]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3143]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3145]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3148]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3147]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3151]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_0]) - } - public var Passport_CorrectErrors: String { return self._s[3150]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3151]! } - public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3153]! } - public var Channel_DiscussionGroup: String { return self._s[3154]! } + public var Passport_CorrectErrors: String { return self._s[3153]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3154]! } + public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_0]) + } + public var Map_SendMyCurrentLocation: String { return self._s[3156]! } + public var Channel_DiscussionGroup: String { return self._s[3157]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3158]!, self._r[3158]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3156]! } - public var Permissions_NotificationsText_v0: String { return self._s[3157]! } - public var Appearance_AppIcon: String { return self._s[3158]! } - public var LoginPassword_FloodError: String { return self._s[3159]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3161]! } + public var SharedMedia_SearchNoResults: String { return self._s[3159]! } + public var Permissions_NotificationsText_v0: String { return self._s[3160]! } + public var Appearance_AppIcon: String { return self._s[3161]! } + public var LoginPassword_FloodError: String { return self._s[3162]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3164]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3163]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_0]) - } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3165]!, self._r[3165]!, [_0]) } + public var Passport_Language_bn: String { return self._s[3166]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3167]!, self._r[3167]!, [_0]) + } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3168]!, self._r[3168]!, [_0]) + } + public var CreateTheme_ShortLinkInfo: String { return self._s[3169]! } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3166]!, self._r[3166]!, [_0]) + return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3169]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3171]! } - public var Contacts_PermissionsAllow: String { return self._s[3172]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3173]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3174]! } - public var WallpaperPreview_Pattern: String { return self._s[3175]! } - public var Paint_Duplicate: String { return self._s[3176]! } - public var Passport_Address_Country: String { return self._s[3177]! } - public var Notification_RenamedChannel: String { return self._s[3179]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3180]! } - public var Group_MessagePhotoUpdated: String { return self._s[3181]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3182]! } - public var Conversation_ContextMenuBan: String { return self._s[3183]! } - public var TwoStepAuth_EmailSent: String { return self._s[3184]! } - public var MessagePoll_NoVotes: String { return self._s[3185]! } - public var Passport_Language_is: String { return self._s[3186]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3188]! } - public var Tour_Text5: String { return self._s[3189]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3173]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3175]! } + public var Contacts_PermissionsAllow: String { return self._s[3176]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3177]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3178]! } + public var WallpaperPreview_Pattern: String { return self._s[3179]! } + public var Paint_Duplicate: String { return self._s[3180]! } + public var Passport_Address_Country: String { return self._s[3181]! } + public var Notification_RenamedChannel: String { return self._s[3183]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3184]! } + public var Group_MessagePhotoUpdated: String { return self._s[3185]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3186]! } + public var Conversation_ContextMenuBan: String { return self._s[3187]! } + public var TwoStepAuth_EmailSent: String { return self._s[3188]! } + public var MessagePoll_NoVotes: String { return self._s[3189]! } + public var Passport_Language_is: String { return self._s[3190]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3192]! } + public var Tour_Text5: String { return self._s[3193]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3191]!, self._r[3191]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3195]!, self._r[3195]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3192]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3193]! } + public var Undo_SecretChatDeleted: String { return self._s[3196]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3197]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_0]) + return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3195]! } - public var Paint_Edit: String { return self._s[3197]! } - public var Undo_DeletedGroup: String { return self._s[3200]! } - public var LoginPassword_ForgotPassword: String { return self._s[3201]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3202]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3199]! } + public var Paint_Edit: String { return self._s[3201]! } + public var Undo_DeletedGroup: String { return self._s[3204]! } + public var LoginPassword_ForgotPassword: String { return self._s[3205]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3206]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3203]!, self._r[3203]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3204]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3205]! } - public var Passport_Language_uz: String { return self._s[3206]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3207]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3208]! } - public var Map_StopLiveLocation: String { return self._s[3210]! } - public var VoiceOver_MessageContextSend: String { return self._s[3212]! } - public var PasscodeSettings_Help: String { return self._s[3213]! } - public var NotificationsSound_Input: String { return self._s[3214]! } - public var Share_Title: String { return self._s[3217]! } - public var LogoutOptions_Title: String { return self._s[3218]! } - public var Login_TermsOfServiceAgree: String { return self._s[3219]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3220]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3221]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3222]! } - public var EnterPasscode_EnterTitle: String { return self._s[3223]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3208]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3209]! } + public var Passport_Language_uz: String { return self._s[3210]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3211]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3212]! } + public var Map_StopLiveLocation: String { return self._s[3214]! } + public var VoiceOver_MessageContextSend: String { return self._s[3216]! } + public var PasscodeSettings_Help: String { return self._s[3217]! } + public var NotificationsSound_Input: String { return self._s[3218]! } + public var Share_Title: String { return self._s[3221]! } + public var LogoutOptions_Title: String { return self._s[3222]! } + public var Login_TermsOfServiceAgree: String { return self._s[3223]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3224]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3225]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3226]! } + public var EnterPasscode_EnterTitle: String { return self._s[3227]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3224]!, self._r[3224]!, [_0]) + return formatWithArgumentRanges(self._s[3228]!, self._r[3228]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3225]! } - public var Conversation_AddToContacts: String { return self._s[3226]! } + public var Settings_CopyPhoneNumber: String { return self._s[3229]! } + public var Conversation_AddToContacts: String { return self._s[3230]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_0]) + return formatWithArgumentRanges(self._s[3231]!, self._r[3231]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3228]! } + public var NotificationsSound_Keys: String { return self._s[3232]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_0]) + return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3230]! } - public var Message_Video: String { return self._s[3231]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3232]! } + public var Notification_MessageLifetime1w: String { return self._s[3234]! } + public var Message_Video: String { return self._s[3235]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3236]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_1]) + return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_0]) + return formatWithArgumentRanges(self._s[3240]!, self._r[3240]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_0]) + return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3238]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3239]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3241]! } - public var PrivacyPolicy_Decline: String { return self._s[3242]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3243]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3244]! } - public var Permissions_SiriAllow_v0: String { return self._s[3246]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3247]! } + public var Passport_Language_mk: String { return self._s[3242]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3243]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3245]! } + public var PrivacyPolicy_Decline: String { return self._s[3246]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3247]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3248]! } + public var Permissions_SiriAllow_v0: String { return self._s[3250]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3251]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3252]!, self._r[3252]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) + return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_0]) } - public var Paint_Regular: String { return self._s[3250]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3251]! } - public var SocksProxySetup_ShareLink: String { return self._s[3252]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3253]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3255]! } - public var GroupInfo_InviteByLink: String { return self._s[3256]! } - public var MessageTimer_Custom: String { return self._s[3257]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3258]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3260]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3261]! } - public var VoiceOver_Chat_Selected: String { return self._s[3262]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3263]! } - public var Channel_Username_InvalidTaken: String { return self._s[3264]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3265]! } - public var Settings_ChatBackground: String { return self._s[3266]! } - public var Channel_Subscribers_Title: String { return self._s[3267]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3268]! } - public var Watch_ConnectionDescription: String { return self._s[3269]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3273]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3274]! } - public var EditProfile_Title: String { return self._s[3275]! } - public var NotificationsSound_Bamboo: String { return self._s[3277]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3279]! } - public var Login_SmsRequestState2: String { return self._s[3280]! } - public var Passport_Language_ar: String { return self._s[3281]! } + public var Paint_Regular: String { return self._s[3254]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3255]! } + public var SocksProxySetup_ShareLink: String { return self._s[3256]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3257]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3259]! } + public var GroupInfo_InviteByLink: String { return self._s[3260]! } + public var MessageTimer_Custom: String { return self._s[3261]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3262]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3264]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3265]! } + public var VoiceOver_Chat_Selected: String { return self._s[3266]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3267]! } + public var Channel_Username_InvalidTaken: String { return self._s[3268]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3269]! } + public var Settings_ChatBackground: String { return self._s[3270]! } + public var Channel_Subscribers_Title: String { return self._s[3271]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3272]! } + public var Watch_ConnectionDescription: String { return self._s[3273]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3277]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3278]! } + public var EditProfile_Title: String { return self._s[3279]! } + public var NotificationsSound_Bamboo: String { return self._s[3281]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3283]! } + public var Login_SmsRequestState2: String { return self._s[3284]! } + public var Passport_Language_ar: String { return self._s[3285]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_0]) + return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3283]! } - public var Conversation_MessageDialogEdit: String { return self._s[3284]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3285]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3287]! } + public var Conversation_MessageDialogEdit: String { return self._s[3288]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3289]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_1]) + return formatWithArgumentRanges(self._s[3290]!, self._r[3290]!, [_1]) } - public var Common_Close: String { return self._s[3287]! } - public var GroupInfo_PublicLink: String { return self._s[3288]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3289]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3290]! } + public var Common_Close: String { return self._s[3291]! } + public var GroupInfo_PublicLink: String { return self._s[3292]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3293]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3294]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3294]!, self._r[3294]!, [_0]) + return formatWithArgumentRanges(self._s[3298]!, self._r[3298]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3295]! } + public var UserInfo_About_Placeholder: String { return self._s[3299]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) - } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3297]! } - public var Channel_Info_Banned: String { return self._s[3299]! } - public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_0]) } - public var Appearance_Other: String { return self._s[3301]! } - public var Passport_Language_my: String { return self._s[3302]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3303]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3301]! } + public var Channel_Info_Banned: String { return self._s[3303]! } + public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_0]) + } + public var Appearance_Other: String { return self._s[3305]! } + public var Passport_Language_my: String { return self._s[3306]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3307]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3305]! } - public var Preview_CopyAddress: String { return self._s[3306]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3309]! } + public var Preview_CopyAddress: String { return self._s[3310]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3307]!, self._r[3307]!, [_0]) + return formatWithArgumentRanges(self._s[3311]!, self._r[3311]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3308]! } - public var UserInfo_BotSettings: String { return self._s[3309]! } - public var LiveLocation_MenuStopAll: String { return self._s[3311]! } - public var Passport_PasswordCreate: String { return self._s[3312]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3313]! } - public var Message_PinnedLocationMessage: String { return self._s[3314]! } - public var Map_Satellite: String { return self._s[3315]! } - public var Watch_Message_Unsupported: String { return self._s[3316]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3317]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3318]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3312]! } + public var UserInfo_BotSettings: String { return self._s[3313]! } + public var LiveLocation_MenuStopAll: String { return self._s[3315]! } + public var Passport_PasswordCreate: String { return self._s[3316]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3317]! } + public var Message_PinnedLocationMessage: String { return self._s[3318]! } + public var Map_Satellite: String { return self._s[3319]! } + public var Watch_Message_Unsupported: String { return self._s[3320]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3321]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3322]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3319]!, self._r[3319]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3323]!, self._r[3323]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3321]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3322]! } - public var NotificationsSound_None: String { return self._s[3323]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3325]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3326]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3325]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3326]! } + public var NotificationsSound_None: String { return self._s[3327]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3329]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3330]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3327]!, self._r[3327]!, [_1]) + return formatWithArgumentRanges(self._s[3331]!, self._r[3331]!, [_1]) } - public var Cache_Indexing: String { return self._s[3328]! } - public var DialogList_RecentTitlePeople: String { return self._s[3330]! } - public var DialogList_EncryptionRejected: String { return self._s[3331]! } - public var GroupInfo_Administrators: String { return self._s[3332]! } - public var Passport_ScanPassportHelp: String { return self._s[3333]! } - public var Application_Name: String { return self._s[3334]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3335]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3337]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3338]! } + public var Cache_Indexing: String { return self._s[3332]! } + public var DialogList_RecentTitlePeople: String { return self._s[3334]! } + public var DialogList_EncryptionRejected: String { return self._s[3335]! } + public var GroupInfo_Administrators: String { return self._s[3336]! } + public var Passport_ScanPassportHelp: String { return self._s[3337]! } + public var Application_Name: String { return self._s[3338]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3339]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3341]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3342]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3339]!, self._r[3339]!, [_0]) + return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3340]!, self._r[3340]!, [_0]) + return formatWithArgumentRanges(self._s[3344]!, self._r[3344]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0]) + return formatWithArgumentRanges(self._s[3345]!, self._r[3345]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3342]! } - public var Privacy_ChatsTitle: String { return self._s[3343]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3344]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3345]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3346]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3347]! } - public var Group_LinkedChannel: String { return self._s[3348]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3349]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3350]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3351]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3352]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3354]! } - public var Channel_Setup_TypePublic: String { return self._s[3356]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3346]! } + public var Privacy_ChatsTitle: String { return self._s[3347]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3348]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3349]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3350]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3351]! } + public var Group_LinkedChannel: String { return self._s[3352]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3353]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3354]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3355]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3356]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3358]! } + public var Channel_Setup_TypePublic: String { return self._s[3360]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_0]) + return formatWithArgumentRanges(self._s[3361]!, self._r[3361]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3359]! } - public var Map_OpenInMaps: String { return self._s[3361]! } + public var Channel_TypeSetup_Title: String { return self._s[3363]! } + public var Map_OpenInMaps: String { return self._s[3365]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_1]) + return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3364]! } + public var NotificationsSound_Tremolo: String { return self._s[3368]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3369]!, self._r[3369]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3366]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3367]! } - public var Passport_PasswordHelp: String { return self._s[3368]! } - public var Login_CodeExpiredError: String { return self._s[3369]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3370]! } - public var Conversation_TitleUnmute: String { return self._s[3371]! } - public var Passport_Identity_ScansHelp: String { return self._s[3372]! } - public var Passport_Language_lo: String { return self._s[3373]! } - public var Camera_FlashAuto: String { return self._s[3374]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3375]! } - public var Common_Cancel: String { return self._s[3376]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3377]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3378]! } - public var Appearance_TintAllColors: String { return self._s[3379]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3370]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3371]! } + public var Passport_PasswordHelp: String { return self._s[3372]! } + public var Login_CodeExpiredError: String { return self._s[3373]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3374]! } + public var Conversation_TitleUnmute: String { return self._s[3375]! } + public var Passport_Identity_ScansHelp: String { return self._s[3376]! } + public var Passport_Language_lo: String { return self._s[3377]! } + public var Camera_FlashAuto: String { return self._s[3378]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3379]! } + public var Common_Cancel: String { return self._s[3380]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3381]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3382]! } + public var Appearance_TintAllColors: String { return self._s[3383]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3380]!, self._r[3380]!, [_1]) + return formatWithArgumentRanges(self._s[3384]!, self._r[3384]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3381]! } - public var ChatSettings_Title: String { return self._s[3383]! } - public var Passport_PasswordReset: String { return self._s[3384]! } - public var SocksProxySetup_TypeNone: String { return self._s[3385]! } - public var PhoneNumberHelp_Help: String { return self._s[3387]! } - public var Checkout_EnterPassword: String { return self._s[3388]! } - public var Share_AuthTitle: String { return self._s[3390]! } - public var Activity_UploadingDocument: String { return self._s[3391]! } - public var State_Connecting: String { return self._s[3392]! } - public var Profile_MessageLifetime1w: String { return self._s[3393]! } - public var Conversation_ContextMenuReport: String { return self._s[3394]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3395]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3396]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3385]! } + public var ChatSettings_Title: String { return self._s[3387]! } + public var Passport_PasswordReset: String { return self._s[3388]! } + public var SocksProxySetup_TypeNone: String { return self._s[3389]! } + public var PhoneNumberHelp_Help: String { return self._s[3391]! } + public var Checkout_EnterPassword: String { return self._s[3392]! } + public var Share_AuthTitle: String { return self._s[3394]! } + public var Activity_UploadingDocument: String { return self._s[3395]! } + public var State_Connecting: String { return self._s[3396]! } + public var Profile_MessageLifetime1w: String { return self._s[3397]! } + public var Conversation_ContextMenuReport: String { return self._s[3398]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3399]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3400]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_0]) + return formatWithArgumentRanges(self._s[3401]!, self._r[3401]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3398]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3399]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3400]! } - public var PhotoEditor_Set: String { return self._s[3401]! } - public var EmptyGroupInfo_Title: String { return self._s[3402]! } - public var Login_PadPhoneHelp: String { return self._s[3403]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3405]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3407]! } - public var NotificationsSound_Complete: String { return self._s[3408]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3409]! } - public var Group_Info_AdminLog: String { return self._s[3410]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3411]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3412]! } - public var Conversation_Admin: String { return self._s[3414]! } - public var Conversation_GifTooltip: String { return self._s[3415]! } - public var Passport_NotLoggedInMessage: String { return self._s[3416]! } + public var AuthSessions_Terminate: String { return self._s[3402]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3403]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3404]! } + public var PhotoEditor_Set: String { return self._s[3405]! } + public var EmptyGroupInfo_Title: String { return self._s[3406]! } + public var Login_PadPhoneHelp: String { return self._s[3407]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3409]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3411]! } + public var NotificationsSound_Complete: String { return self._s[3412]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3413]! } + public var Group_Info_AdminLog: String { return self._s[3414]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3415]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3416]! } + public var Conversation_Admin: String { return self._s[3418]! } + public var Conversation_GifTooltip: String { return self._s[3419]! } + public var Passport_NotLoggedInMessage: String { return self._s[3420]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3417]!, self._r[3417]!, [_0]) + return formatWithArgumentRanges(self._s[3421]!, self._r[3421]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3418]! } - public var SharedMedia_EmptyTitle: String { return self._s[3420]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3422]! } - public var Username_Help: String { return self._s[3423]! } - public var DialogList_LanguageTooltip: String { return self._s[3425]! } - public var Map_LoadError: String { return self._s[3426]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3427]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3428]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3429]! } - public var Notification_Exceptions_NewException: String { return self._s[3430]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3431]! } - public var WatchRemote_AlertText: String { return self._s[3432]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3435]! } + public var Profile_MessageLifetimeForever: String { return self._s[3422]! } + public var SharedMedia_EmptyTitle: String { return self._s[3424]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3426]! } + public var Username_Help: String { return self._s[3427]! } + public var DialogList_LanguageTooltip: String { return self._s[3429]! } + public var Map_LoadError: String { return self._s[3430]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3431]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3432]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3433]! } + public var Notification_Exceptions_NewException: String { return self._s[3434]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3435]! } + public var WatchRemote_AlertText: String { return self._s[3436]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3439]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_0]) + return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3437]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3438]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3441]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3442]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3439]!, self._r[3439]!, [_0]) + return formatWithArgumentRanges(self._s[3443]!, self._r[3443]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3441]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3442]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3444]! } - public var ChatList_UndoArchiveText1: String { return self._s[3445]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3446]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3447]! } - public var Cache_ClearNone: String { return self._s[3448]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3449]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3450]! } + public var Group_AdminLog_EmptyText: String { return self._s[3445]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3446]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3448]! } + public var ChatList_UndoArchiveText1: String { return self._s[3449]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3450]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3451]! } + public var Cache_ClearNone: String { return self._s[3452]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3453]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3454]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_0]) + return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3452]! } + public var Passport_Identity_Country: String { return self._s[3456]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3453]!, self._r[3453]!, [_0]) + return formatWithArgumentRanges(self._s[3457]!, self._r[3457]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3454]!, self._r[3454]!, [_0]) + return formatWithArgumentRanges(self._s[3458]!, self._r[3458]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3455]! } - public var AccessDenied_Settings: String { return self._s[3456]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3457]! } - public var Month_ShortMay: String { return self._s[3458]! } - public var Compose_NewGroup: String { return self._s[3459]! } - public var Group_Setup_TypePrivate: String { return self._s[3461]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3463]! } - public var Appearance_ThemeDayClassic: String { return self._s[3464]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3465]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3466]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3467]! } - public var Conversation_typing: String { return self._s[3469]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3470]! } - public var Paint_Masks: String { return self._s[3471]! } - public var Contacts_DeselectAll: String { return self._s[3472]! } - public var Username_InvalidTaken: String { return self._s[3473]! } - public var Call_StatusNoAnswer: String { return self._s[3474]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3475]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3476]! } - public var Passport_Identity_Selfie: String { return self._s[3477]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3478]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3479]! } - public var Conversation_ClearSecretHistory: String { return self._s[3480]! } - public var PeopleNearby_Description: String { return self._s[3482]! } - public var NetworkUsageSettings_Title: String { return self._s[3483]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3485]! } + public var Exceptions_AddToExceptions: String { return self._s[3459]! } + public var AccessDenied_Settings: String { return self._s[3460]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3461]! } + public var Month_ShortMay: String { return self._s[3462]! } + public var Compose_NewGroup: String { return self._s[3463]! } + public var Group_Setup_TypePrivate: String { return self._s[3465]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3467]! } + public var Appearance_ThemeDayClassic: String { return self._s[3468]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3469]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3470]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3471]! } + public var Conversation_typing: String { return self._s[3473]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3474]! } + public var Paint_Masks: String { return self._s[3475]! } + public var Contacts_DeselectAll: String { return self._s[3476]! } + public var Username_InvalidTaken: String { return self._s[3477]! } + public var Call_StatusNoAnswer: String { return self._s[3478]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3479]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3480]! } + public var Passport_Identity_Selfie: String { return self._s[3481]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3482]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3483]! } + public var Conversation_ClearSecretHistory: String { return self._s[3484]! } + public var PeopleNearby_Description: String { return self._s[3486]! } + public var NetworkUsageSettings_Title: String { return self._s[3487]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3489]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3487]!, self._r[3487]!, [_0]) + return formatWithArgumentRanges(self._s[3491]!, self._r[3491]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3492]!, self._r[3492]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3490]! } - public var VoiceOver_Navigation_Search: String { return self._s[3491]! } - public var Map_LiveLocationTitle: String { return self._s[3492]! } - public var Login_InfoAvatarAdd: String { return self._s[3493]! } - public var Passport_Identity_FilesView: String { return self._s[3494]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3495]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3496]! } - public var VoiceOver_Chat_File: String { return self._s[3497]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3494]! } + public var VoiceOver_Navigation_Search: String { return self._s[3495]! } + public var Map_LiveLocationTitle: String { return self._s[3496]! } + public var Login_InfoAvatarAdd: String { return self._s[3497]! } + public var Passport_Identity_FilesView: String { return self._s[3498]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3499]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3500]! } + public var VoiceOver_Chat_File: String { return self._s[3501]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_0]) + return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3499]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3500]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3501]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3503]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3504]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3505]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3506]!, self._r[3506]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3503]! } - public var Tour_Title2: String { return self._s[3504]! } - public var Conversation_FileOpenIn: String { return self._s[3505]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3506]! } - public var Wallpaper_Set: String { return self._s[3507]! } - public var Passport_Identity_Translations: String { return self._s[3509]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3507]! } + public var Tour_Title2: String { return self._s[3508]! } + public var Conversation_FileOpenIn: String { return self._s[3509]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3510]! } + public var Wallpaper_Set: String { return self._s[3511]! } + public var Passport_Identity_Translations: String { return self._s[3513]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_0]) + return formatWithArgumentRanges(self._s[3514]!, self._r[3514]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3511]! } + public var Channel_LeaveChannel: String { return self._s[3515]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_1]) + return formatWithArgumentRanges(self._s[3516]!, self._r[3516]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3514]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3515]! } - public var Passport_Email_Delete: String { return self._s[3516]! } - public var Conversation_Mute: String { return self._s[3518]! } - public var Channel_AddBotAsAdmin: String { return self._s[3519]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3521]! } - public var Channel_Management_LabelOwner: String { return self._s[3523]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3518]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3519]! } + public var Passport_Email_Delete: String { return self._s[3520]! } + public var Conversation_Mute: String { return self._s[3522]! } + public var Channel_AddBotAsAdmin: String { return self._s[3523]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3525]! } + public var Channel_Management_LabelOwner: String { return self._s[3527]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3524]!, self._r[3524]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3528]!, self._r[3528]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3525]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3526]! } - public var Common_No: String { return self._s[3527]! } - public var Weekday_Sunday: String { return self._s[3528]! } - public var Notification_Reply: String { return self._s[3529]! } - public var Conversation_ViewMessage: String { return self._s[3530]! } + public var Calls_CallTabDescription: String { return self._s[3529]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3530]! } + public var Common_No: String { return self._s[3531]! } + public var Weekday_Sunday: String { return self._s[3532]! } + public var Notification_Reply: String { return self._s[3533]! } + public var Conversation_ViewMessage: String { return self._s[3534]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3531]!, self._r[3531]!, [_0]) + return formatWithArgumentRanges(self._s[3535]!, self._r[3535]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_0]) + return formatWithArgumentRanges(self._s[3536]!, self._r[3536]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3533]! } - public var Message_PinnedDocumentMessage: String { return self._s[3534]! } - public var DialogList_TabTitle: String { return self._s[3536]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3537]! } - public var Passport_FieldEmail: String { return self._s[3538]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3539]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3540]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3541]! } - public var Privacy_Calls_P2P: String { return self._s[3542]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3537]! } + public var Message_PinnedDocumentMessage: String { return self._s[3538]! } + public var DialogList_TabTitle: String { return self._s[3540]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3541]! } + public var Passport_FieldEmail: String { return self._s[3542]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3543]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3544]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3545]! } + public var Privacy_Calls_P2P: String { return self._s[3546]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3544]!, self._r[3544]!, [_0]) + return formatWithArgumentRanges(self._s[3548]!, self._r[3548]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3545]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3549]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3550]!, self._r[3550]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3547]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3548]! } - public var Passport_InfoText: String { return self._s[3549]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3550]! } + public var Stickers_ClearRecent: String { return self._s[3551]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3552]! } + public var Passport_InfoText: String { return self._s[3553]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3554]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3551]!, self._r[3551]!, [_0]) + return formatWithArgumentRanges(self._s[3555]!, self._r[3555]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3556]!, self._r[3556]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3553]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3554]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3555]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3556]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3558]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3559]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3557]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3558]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3559]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3560]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3562]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3563]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3562]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3566]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_0]) + return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_0]) } - public var DialogList_Unread: String { return self._s[3565]! } + public var DialogList_Unread: String { return self._s[3569]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3566]!, self._r[3566]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3570]!, self._r[3570]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3567]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3568]! } + public var User_DeletedAccount: String { return self._s[3571]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3572]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3569]!, self._r[3569]!, [_0]) + return formatWithArgumentRanges(self._s[3573]!, self._r[3573]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3570]! } - public var SharedMedia_CategoryMedia: String { return self._s[3571]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3572]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3573]! } - public var Watch_ChatList_Compose: String { return self._s[3574]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3575]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3576]! } - public var Watch_Microphone_Access: String { return self._s[3577]! } - public var Group_Setup_HistoryHeader: String { return self._s[3578]! } - public var Map_SetThisLocation: String { return self._s[3579]! } - public var Activity_UploadingPhoto: String { return self._s[3580]! } - public var Conversation_Edit: String { return self._s[3582]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3583]! } - public var Login_TermsOfServiceDecline: String { return self._s[3584]! } - public var Message_PinnedContactMessage: String { return self._s[3585]! } + public var UserInfo_NotificationsDefault: String { return self._s[3574]! } + public var SharedMedia_CategoryMedia: String { return self._s[3575]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3576]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3577]! } + public var Watch_ChatList_Compose: String { return self._s[3578]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3579]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3580]! } + public var Watch_Microphone_Access: String { return self._s[3581]! } + public var Group_Setup_HistoryHeader: String { return self._s[3582]! } + public var Map_SetThisLocation: String { return self._s[3583]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3584]! } + public var Activity_UploadingPhoto: String { return self._s[3585]! } + public var Conversation_Edit: String { return self._s[3587]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3588]! } + public var Login_TermsOfServiceDecline: String { return self._s[3589]! } + public var Message_PinnedContactMessage: String { return self._s[3590]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2]) - } - public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3587]!, self._r[3587]!, [_1, _2, _3, _4, _5]) - } - public var Appearance_LargeEmoji: String { return self._s[3588]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3590]! } - public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3591]!, self._r[3591]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3592]! } - public var Message_PinnedPhotoMessage: String { return self._s[3593]! } - public var Passport_FieldPhone: String { return self._s[3594]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3595]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3596]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3598]! } - public var Conversation_Call: String { return self._s[3599]! } - public var Common_TakePhoto: String { return self._s[3601]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3602]! } - public var Channel_NotificationLoading: String { return self._s[3603]! } + public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3592]!, self._r[3592]!, [_1, _2, _3, _4, _5]) + } + public var Appearance_LargeEmoji: String { return self._s[3593]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3595]! } + public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3596]!, self._r[3596]!, [_1, _2]) + } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3597]! } + public var Message_PinnedPhotoMessage: String { return self._s[3598]! } + public var Passport_FieldPhone: String { return self._s[3599]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3600]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3601]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3603]! } + public var Conversation_Call: String { return self._s[3604]! } + public var Common_TakePhoto: String { return self._s[3606]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3607]! } + public var Channel_NotificationLoading: String { return self._s[3608]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_0]) - } - public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3606]!, self._r[3606]!, [_1]) - } - public var Permissions_SiriTitle_v0: String { return self._s[3607]! } - public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3609]!, self._r[3609]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3610]! } - public var Common_edit: String { return self._s[3611]! } - public var PrivacySettings_AuthSessions: String { return self._s[3612]! } - public var Month_ShortJune: String { return self._s[3613]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3614]! } - public var Call_ReportSend: String { return self._s[3615]! } - public var Watch_LastSeen_JustNow: String { return self._s[3616]! } - public var Notifications_MessageNotifications: String { return self._s[3617]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3618]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3620]! } - public var Group_Status: String { return self._s[3621]! } + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3610]!, self._r[3610]!, [_0]) + } + public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_1]) + } + public var Permissions_SiriTitle_v0: String { return self._s[3612]! } + public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3613]!, self._r[3613]!, [_0]) + } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3614]!, self._r[3614]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[3615]! } + public var Common_edit: String { return self._s[3616]! } + public var PrivacySettings_AuthSessions: String { return self._s[3617]! } + public var Month_ShortJune: String { return self._s[3618]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3619]! } + public var Call_ReportSend: String { return self._s[3620]! } + public var Watch_LastSeen_JustNow: String { return self._s[3621]! } + public var Notifications_MessageNotifications: String { return self._s[3622]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3623]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3625]! } + public var Group_Status: String { return self._s[3626]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3623]! } - public var ShareMenu_ShareTo: String { return self._s[3624]! } - public var Conversation_Moderate_Ban: String { return self._s[3625]! } + public var TextFormat_AddLinkTitle: String { return self._s[3628]! } + public var ShareMenu_ShareTo: String { return self._s[3629]! } + public var Conversation_Moderate_Ban: String { return self._s[3630]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3626]!, self._r[3626]!, [_0]) + return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3627]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3628]! } + public var SharedMedia_ViewInChat: String { return self._s[3632]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3633]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_1]) + return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_1, _2]) - } - public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_0]) - } - public var Map_OpenInHereMaps: String { return self._s[3633]! } - public var Appearance_ReduceMotion: String { return self._s[3634]! } - public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3635]!, self._r[3635]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3636]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3637]! } - public var PhotoEditor_Skip: String { return self._s[3638]! } - public func Call_ShortSeconds(_ value: Int32) -> String { + public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3637]!, self._r[3637]!, [_0]) + } + public var Map_OpenInHereMaps: String { return self._s[3638]! } + public var Appearance_ReduceMotion: String { return self._s[3639]! } + public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3640]!, self._r[3640]!, [_1, _2]) + } + public var Channel_Setup_TypePublicHelp: String { return self._s[3641]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3642]! } + public var PhotoEditor_Skip: String { return self._s[3643]! } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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[1 * 6 + Int(form.rawValue)]!, _1, _2) } public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } public func SharedMedia_Video(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedPolls(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { diff --git a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift index dbf5a21852..b96fe4d53c 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift @@ -918,7 +918,7 @@ public enum PresentationThemeName: Equatable { case .night: return "Night" case .nightAccent: - return "Night" + return "Tinted Night" } case let .custom(name): return name @@ -929,6 +929,7 @@ public enum PresentationThemeName: Equatable { public final class PresentationTheme: Equatable { public let name: PresentationThemeName public let author: String? + public let referenceTheme: PresentationBuiltinThemeReference public let overallDarkAppearance: Bool public let baseColor: PresentationThemeBaseColor? public let intro: PresentationThemeIntro @@ -944,9 +945,10 @@ public final class PresentationTheme: Equatable { public let resourceCache: PresentationsResourceCache = PresentationsResourceCache() - public init(name: PresentationThemeName, author: String?, overallDarkAppearance: Bool, baseColor: PresentationThemeBaseColor?, intro: PresentationThemeIntro, passcode: PresentationThemePasscode, rootController: PresentationThemeRootController, list: PresentationThemeList, chatList: PresentationThemeChatList, chat: PresentationThemeChat, actionSheet: PresentationThemeActionSheet, contextMenu: PresentationThemeContextMenu, inAppNotification: PresentationThemeInAppNotification, preview: Bool = false) { + public init(name: PresentationThemeName, author: String?, referenceTheme: PresentationBuiltinThemeReference, overallDarkAppearance: Bool, baseColor: PresentationThemeBaseColor?, intro: PresentationThemeIntro, passcode: PresentationThemePasscode, rootController: PresentationThemeRootController, list: PresentationThemeList, chatList: PresentationThemeChatList, chat: PresentationThemeChat, actionSheet: PresentationThemeActionSheet, contextMenu: PresentationThemeContextMenu, inAppNotification: PresentationThemeInAppNotification, preview: Bool = false) { self.name = name self.author = author + self.referenceTheme = referenceTheme self.overallDarkAppearance = overallDarkAppearance self.baseColor = baseColor self.intro = intro diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index 01a6e71566..264e2e1890 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -1,20 +1,17 @@ import Foundation import UIKit import TelegramCore - -public enum PresentationThemeColorDecodingError: Error { - case generic -} +import TelegramUIPreferences private func decodeColor(_ values: KeyedDecodingContainer, _ key: Key) throws -> UIColor { - if let value = try? values.decode(String.self, forKey: key) { - if value.lowercased() == "clear" { - return UIColor.clear - } else if let color = UIColor(hexString: value) { - return color - } + let value = try values.decode(String.self, forKey: key) + if value.lowercased() == "clear" { + return UIColor.clear + } else if let color = UIColor(hexString: value) { + return color + } else { + throw PresentationThemeDecodingError.generic } - throw PresentationThemeColorDecodingError.generic } private func encodeColor(_ values: inout KeyedEncodingContainer, _ value: UIColor, _ key: Key) throws { @@ -38,11 +35,12 @@ extension TelegramWallpaper: Codable { if let color = UIColor(hexString: value) { self = .color(Int32(bitPattern: color.rgb)) } else { - throw PresentationThemeColorDecodingError.generic + throw PresentationThemeDecodingError.generic } } + } else { + throw PresentationThemeDecodingError.generic } - throw PresentationThemeColorDecodingError.generic } public func encode(to encoder: Encoder) throws { @@ -143,6 +141,22 @@ extension PresentationThemeKeyboardColor: Codable { } extension PresentationThemeExpandedNotificationBackgroundType: Codable { + public init(from decoder: Decoder) throws { + let values = try decoder.singleValueContainer() + if let value = try? values.decode(String.self) { + switch value.lowercased() { + case "light": + self = .light + case "dark": + self = .dark + default: + self = .light + } + } else { + self = .light + } + } + public func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch self { @@ -414,6 +428,7 @@ extension PresentationThemeActionSheet: Codable { try encodeColor(&values, self.opaqueItemBackgroundColor, .opaqueItemBg) try encodeColor(&values, self.itemBackgroundColor, .itemBg) try encodeColor(&values, self.opaqueItemHighlightedBackgroundColor, .opaqueItemHighlightedBg) + try encodeColor(&values, self.itemHighlightedBackgroundColor, .itemHighlightedBg) try encodeColor(&values, self.opaqueItemSeparatorColor, .opaqueItemSeparator) try encodeColor(&values, self.standardActionTextColor, .standardActionText) try encodeColor(&values, self.destructiveActionTextColor, .destructiveActionText) @@ -431,47 +446,6 @@ extension PresentationThemeActionSheet: Codable { } } -extension PresentationThemeContextMenu: Codable { - enum CodingKeys: String, CodingKey { - case dim - case background - case itemSeparator - case sectionSeparator - case itemBg - case itemHighlightedBg - case primary - case secondary - case destructive - } - - public convenience init(from decoder: Decoder) throws { - let values = try decoder.container(keyedBy: CodingKeys.self) - self.init(dimColor: try decodeColor(values, .dim), - backgroundColor: try decodeColor(values, .background), - itemSeparatorColor: try decodeColor(values, .itemSeparator), - sectionSeparatorColor: try decodeColor(values, .sectionSeparator), - itemBackgroundColor: try decodeColor(values, .itemBg), - itemHighlightedBackgroundColor: try decodeColor(values, .itemHighlightedBg), - primaryColor: try decodeColor(values, .primary), - secondaryColor: try decodeColor(values, .secondary), - destructiveColor: try decodeColor(values, .destructive) - ) - } - - public func encode(to encoder: Encoder) throws { - var values = encoder.container(keyedBy: CodingKeys.self) - try encodeColor(&values, self.dimColor, .dim) - try encodeColor(&values, self.backgroundColor, .background) - try encodeColor(&values, self.itemSeparatorColor, .itemSeparator) - try encodeColor(&values, self.sectionSeparatorColor, .sectionSeparator) - try encodeColor(&values, self.itemBackgroundColor, .itemBg) - try encodeColor(&values, self.itemHighlightedBackgroundColor, .itemHighlightedBg) - try encodeColor(&values, self.primaryColor, .primary) - try encodeColor(&values, self.secondaryColor, .secondary) - try encodeColor(&values, self.destructiveColor, .destructive) - } -} - extension PresentationThemeSwitch: Codable { enum CodingKeys: String, CodingKey { case frame @@ -1404,6 +1378,47 @@ extension PresentationThemeExpandedNotification: Codable { } } +extension PresentationThemeContextMenu: Codable { + enum CodingKeys: String, CodingKey { + case dim + case background + case itemSeparator + case sectionSeparator + case itemBg + case itemHighlightedBg + case primary + case secondary + case destructive + } + + public convenience init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + self.init(dimColor: try decodeColor(values, .dim), + backgroundColor: try decodeColor(values, .background), + itemSeparatorColor: try decodeColor(values, .itemSeparator), + sectionSeparatorColor: try decodeColor(values, .sectionSeparator), + itemBackgroundColor: try decodeColor(values, .itemBg), + itemHighlightedBackgroundColor: try decodeColor(values, .itemHighlightedBg), + primaryColor: try decodeColor(values, .primary), + secondaryColor: try decodeColor(values, .secondary), + destructiveColor: try decodeColor(values, .destructive) + ) + } + + public func encode(to encoder: Encoder) throws { + var values = encoder.container(keyedBy: CodingKeys.self) + try encodeColor(&values, self.dimColor, .dim) + try encodeColor(&values, self.backgroundColor, .background) + try encodeColor(&values, self.itemSeparatorColor, .itemSeparator) + try encodeColor(&values, self.sectionSeparatorColor, .sectionSeparator) + try encodeColor(&values, self.itemBackgroundColor, .itemBg) + try encodeColor(&values, self.itemHighlightedBackgroundColor, .itemHighlightedBg) + try encodeColor(&values, self.primaryColor, .primary) + try encodeColor(&values, self.secondaryColor, .secondary) + try encodeColor(&values, self.destructiveColor, .destructive) + } +} + extension PresentationThemeInAppNotification: Codable { enum CodingKeys: String, CodingKey { case bg @@ -1452,10 +1467,47 @@ extension PresentationThemeName: Codable { } } +extension PresentationBuiltinThemeReference: Codable { + public init(from decoder: Decoder) throws { + let values = try decoder.singleValueContainer() + if let value = try? values.decode(String.self) { + switch value.lowercased() { + case "day": + self = .day + case "classic": + self = .dayClassic + case "nightTinted": + self = .nightAccent + case "night": + self = .night + default: + self = .dayClassic + } + } else { + self = .dayClassic + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + switch self { + case .day: + try container.encode("day") + case .dayClassic: + try container.encode("classic") + case .nightAccent: + try container.encode("nightTinted") + case .night: + try container.encode("night") + } + } +} + extension PresentationTheme: Codable { enum CodingKeys: String, CodingKey { case name case author + case basedOn case dark case intro case passcode @@ -1470,20 +1522,32 @@ extension PresentationTheme: Codable { public convenience init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) - self.init( - name: try values.decode(PresentationThemeName.self, forKey: .name), - author: (try? values.decode(String.self, forKey: .author)) ?? nil, - overallDarkAppearance: (try? values.decode(Bool.self, forKey: .dark)) ?? false, - baseColor: nil, - intro: try values.decode(PresentationThemeIntro.self, forKey: .intro), - passcode: try values.decode(PresentationThemePasscode.self, forKey: .passcode), - rootController: try values.decode(PresentationThemeRootController.self, forKey: .root), - list: try values.decode(PresentationThemeList.self, forKey: .list), - chatList: try values.decode(PresentationThemeChatList.self, forKey: .chatList), - chat: try values.decode(PresentationThemeChat.self, forKey: .chat), - actionSheet: try values.decode(PresentationThemeActionSheet.self, forKey: .actionSheet), - contextMenu: try values.decode(PresentationThemeContextMenu.self, forKey: .contextMenu), - inAppNotification: try values.decode(PresentationThemeInAppNotification.self, forKey: .notification) + let referenceTheme: PresentationBuiltinThemeReference + if let theme = try? values.decode(PresentationBuiltinThemeReference.self, forKey: .basedOn) { + referenceTheme = theme + } else { + referenceTheme = .dayClassic + } + + if let decoder = decoder as? PresentationThemeDecoding { + let serviceBackgroundColor = decoder.serviceBackgroundColor ?? .black + decoder.referenceTheme = makeDefaultPresentationTheme(reference: referenceTheme, accentColor: nil, serviceBackgroundColor: serviceBackgroundColor, baseColor: nil) + } + + self.init(name: (try? values.decode(PresentationThemeName.self, forKey: .name)) ?? .custom("Untitled"), + author: (try? values.decode(String.self, forKey: .author)) ?? nil, + referenceTheme: referenceTheme, + overallDarkAppearance: (try? values.decode(Bool.self, forKey: .dark)) ?? false, + baseColor: nil, + intro: try values.decode(PresentationThemeIntro.self, forKey: .intro), + passcode: try values.decode(PresentationThemePasscode.self, forKey: .passcode), + rootController: try values.decode(PresentationThemeRootController.self, forKey: .root), + list: try values.decode(PresentationThemeList.self, forKey: .list), + chatList: try values.decode(PresentationThemeChatList.self, forKey: .chatList), + chat: try values.decode(PresentationThemeChat.self, forKey: .chat), + actionSheet: try values.decode(PresentationThemeActionSheet.self, forKey: .actionSheet), + contextMenu: try values.decode(PresentationThemeContextMenu.self, forKey: .contextMenu), + inAppNotification: try values.decode(PresentationThemeInAppNotification.self, forKey: .notification) ) } @@ -1491,6 +1555,7 @@ extension PresentationTheme: Codable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(self.name, forKey: .name) try container.encode(self.author, forKey: .author) + try container.encode(self.referenceTheme, forKey: .basedOn) try container.encode(self.overallDarkAppearance, forKey: .dark) try container.encode(self.intro, forKey: .intro) try container.encode(self.passcode, forKey: .passcode) diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeDecoder.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCoder.swift similarity index 53% rename from submodules/TelegramPresentationData/Sources/PresentationThemeDecoder.swift rename to submodules/TelegramPresentationData/Sources/PresentationThemeCoder.swift index ee3f80624c..5627dc92aa 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeDecoder.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCoder.swift @@ -1,5 +1,298 @@ import Foundation +public func encodePresentationTheme(_ theme: PresentationTheme) -> String? { + let encoding = PresentationThemeEncoding() + if let _ = try? theme.encode(to: encoding) { + return encoding.data.formatted + } else { + return nil + } +} + +private func renderNodes(string: inout String, nodes: [PresentationThemeEncoding.Node], level: Int = 0) { + for node in nodes { + if level > 1 { + string.append(String(repeating: " ", count: level - 1)) + } + switch node.value { + case let .string(value): + if let key = node.key { + string.append("\(key): \(value)\n") + } + case let .subnode(nodes): + if let key = node.key { + string.append("\(key):\n") + } + renderNodes(string: &string, nodes: nodes, level: level + 1) + } + } +} + +fileprivate class PresentationThemeEncoding: Encoder { + fileprivate enum NodeValue { + case string(String) + case subnode([Node]) + } + + fileprivate final class Node { + var key: String? + var value: NodeValue + + init(key: String? = nil, value: NodeValue) { + self.key = key + self.value = value + } + } + + fileprivate final class Data { + private(set) var rootNode = Node(value: .subnode([])) + + func encode(key codingKey: [CodingKey], value: String) { + var currentNode: Node = self.rootNode + for i in 0 ..< codingKey.count { + let key = codingKey[i].stringValue + var found = false + switch currentNode.value { + case var .subnode(nodes): + for node in nodes { + if node.key == key { + currentNode = node + found = true + } + } + if !found { + let newNode: Node + if i == codingKey.count - 1 { + newNode = Node(key: key, value: .string(value)) + } else { + newNode = Node(key: key, value: .subnode([])) + } + nodes.append(newNode) + currentNode.value = .subnode(nodes) + currentNode = newNode + } + case .string: + break + } + } + } + + var formatted: String { + var result = "" + renderNodes(string: &result, nodes: [self.rootNode]) + return result + } + } + + fileprivate var data: Data + var codingPath: [CodingKey] = [] + let userInfo: [CodingUserInfoKey : Any] = [:] + + init(to encodedData: Data = Data()) { + self.data = encodedData + } + + func container(keyedBy type: Key.Type) -> KeyedEncodingContainer { + var container = StringsKeyedEncoding(to: self.data) + container.codingPath = self.codingPath + return KeyedEncodingContainer(container) + } + + func unkeyedContainer() -> UnkeyedEncodingContainer { + var container = StringsUnkeyedEncoding(to: self.data) + container.codingPath = self.codingPath + return container + } + + func singleValueContainer() -> SingleValueEncodingContainer { + var container = StringsSingleValueEncoding(to: self.data) + container.codingPath = self.codingPath + return container + } + + func entry(for codingKey: [String]) -> Any? { + var currentNode: Node = self.data.rootNode + for component in codingKey { + switch currentNode.value { + case let .subnode(nodes): + inner: for node in nodes { + if node.key == component { + if component == codingKey.last { + if case let .string(string) = node.value { + return string + } else { + return nil + } + } else { + currentNode = node + break inner + } + } + } + case let .string(string): + if component == codingKey.last { + return string + } + } + } + return nil + } +} + +fileprivate struct StringsKeyedEncoding: KeyedEncodingContainerProtocol { + private let data: PresentationThemeEncoding.Data + var codingPath: [CodingKey] = [] + + init(to data: PresentationThemeEncoding.Data) { + self.data = data + } + + mutating func encodeNil(forKey key: Key) throws { + } + + mutating func encode(_ value: Bool, forKey key: Key) throws { + self.data.encode(key: self.codingPath + [key], value: value.description) + } + + mutating func encode(_ value: String, forKey key: Key) throws { + self.data.encode(key: self.codingPath + [key], value: value) + } + + mutating func encode(_ value: Int32, forKey key: Key) throws { + self.data.encode(key: self.codingPath + [key], value: value.description) + } + + mutating func encode(_ value: T, forKey key: Key) throws { + let stringsEncoding = PresentationThemeEncoding(to: self.data) + stringsEncoding.codingPath = self.codingPath + [key] + try value.encode(to: stringsEncoding) + } + + mutating func nestedContainer(keyedBy keyType: NestedKey.Type, forKey key: Key) -> KeyedEncodingContainer { + var container = StringsKeyedEncoding(to: self.data) + container.codingPath = self.codingPath + [key] + return KeyedEncodingContainer(container) + } + + mutating func nestedUnkeyedContainer(forKey key: Key) -> UnkeyedEncodingContainer { + var container = StringsUnkeyedEncoding(to: data) + container.codingPath = self.codingPath + [key] + return container + } + + mutating func superEncoder() -> Encoder { + let superKey = Key(stringValue: "super")! + return superEncoder(forKey: superKey) + } + + mutating func superEncoder(forKey key: Key) -> Encoder { + let stringsEncoding = PresentationThemeEncoding(to: self.data) + stringsEncoding.codingPath = self.codingPath + [key] + return stringsEncoding + } +} + +fileprivate struct StringsUnkeyedEncoding: UnkeyedEncodingContainer { + private let data: PresentationThemeEncoding.Data + var codingPath: [CodingKey] = [] + private(set) var count: Int = 0 + + init(to data: PresentationThemeEncoding.Data) { + self.data = data + } + + private mutating func nextIndexedKey() -> CodingKey { + let nextCodingKey = IndexedCodingKey(intValue: count)! + self.count += 1 + return nextCodingKey + } + + private struct IndexedCodingKey: CodingKey { + let intValue: Int? + let stringValue: String + + init?(intValue: Int) { + self.intValue = intValue + self.stringValue = intValue.description + } + + init?(stringValue: String) { + return nil + } + } + + mutating func encodeNil() throws { + } + + mutating func encode(_ value: Bool) throws { + self.data.encode(key: self.codingPath + [self.nextIndexedKey()], value: value.description) + } + + mutating func encode(_ value: String) throws { + self.data.encode(key: self.codingPath + [self.nextIndexedKey()], value: value) + } + + mutating func encode(_ value: Int32) throws { + self.data.encode(key: self.codingPath + [self.nextIndexedKey()], value: value.description) + } + + mutating func encode(_ value: T) throws { + let stringsEncoding = PresentationThemeEncoding(to: self.data) + stringsEncoding.codingPath = self.codingPath + [self.nextIndexedKey()] + try value.encode(to: stringsEncoding) + } + + mutating func nestedContainer( + keyedBy keyType: NestedKey.Type) -> KeyedEncodingContainer { + var container = StringsKeyedEncoding(to: self.data) + container.codingPath = self.codingPath + [self.nextIndexedKey()] + return KeyedEncodingContainer(container) + } + + mutating func nestedUnkeyedContainer() -> UnkeyedEncodingContainer { + var container = StringsUnkeyedEncoding(to: self.data) + container.codingPath = self.codingPath + [self.nextIndexedKey()] + return container + } + + mutating func superEncoder() -> Encoder { + let stringsEncoding = PresentationThemeEncoding(to: self.data) + stringsEncoding.codingPath = self.codingPath + return stringsEncoding + } +} + +fileprivate struct StringsSingleValueEncoding: SingleValueEncodingContainer { + private let data: PresentationThemeEncoding.Data + var codingPath: [CodingKey] = [] + + init(to data: PresentationThemeEncoding.Data) { + self.data = data + } + + mutating func encodeNil() throws { + } + + mutating func encode(_ value: Bool) throws { + self.data.encode(key: self.codingPath, value: value.description) + } + + mutating func encode(_ value: String) throws { + self.data.encode(key: self.codingPath, value: value) + } + + mutating func encode(_ value: Int32) throws { + self.data.encode(key: self.codingPath, value: value.description) + } + + mutating func encode(_ value: T) throws { + let stringsEncoding = PresentationThemeEncoding(to: self.data) + stringsEncoding.codingPath = self.codingPath + try value.encode(to: stringsEncoding) + } +} + + public enum PresentationThemeDecodingError: Error { case generic case dataCorrupted @@ -16,27 +309,82 @@ extension Dictionary : _YAMLStringDictionaryDecodableMarker where Key == String, static var elementType: Decodable.Type { return Value.self } } -open class PresentationThemeDecoder { - public init() {} - - open func decode(_ type: T.Type, from data: Data) throws -> T { - let topLevel: Any - do { - topLevel = try JSONSerialization.jsonObject(with: data) - } catch { - throw PresentationThemeDecodingError.dataCorrupted - } - - let decoder = PresentationThemeDecoding(referencing: topLevel) - guard let value = try decoder.unbox(topLevel, as: type) else { - throw PresentationThemeDecodingError.valueNotFound - } - - return value +private class PresentationThemeDecodingLevel { + let data: NSMutableDictionary + let index: Int + let previous: PresentationThemeDecodingLevel? + + init(data: NSMutableDictionary, index: Int, previous: PresentationThemeDecodingLevel?) { + self.data = data + self.index = index + self.previous = previous } } -fileprivate class PresentationThemeDecoding : Decoder { +public func makePresentationTheme(data: Data) -> PresentationTheme? { + guard let string = String(data: data, encoding: .utf8) else { + return nil + } + let lines = string.split { $0.isNewline } + + let topLevel = PresentationThemeDecodingLevel(data: NSMutableDictionary(), index: 0, previous: nil) + var currentLevel = topLevel + + for line in lines { + if let rangeOfColon = line.firstIndex(of: ":") { + let key = line.prefix(upTo: rangeOfColon) + + var lineLevel = 0 + inner: for c in key { + if c == " " { + lineLevel += 1 + } else { + break inner + } + } + guard lineLevel % 2 == 0 else { + return nil + } + lineLevel = lineLevel / 2 + guard lineLevel <= currentLevel.index else { + return nil + } + + while lineLevel < currentLevel.index, let previous = currentLevel.previous { + currentLevel = previous + } + + let value: String? + if let valueStartIndex = line.index(rangeOfColon, offsetBy: 1, limitedBy: line.endIndex) { + let substring = line.suffix(from: valueStartIndex).trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + if !substring.isEmpty { + value = substring + } else { + value = nil + } + } else { + value = nil + } + + let trimmedKey = key.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + if let value = value { + currentLevel.data[trimmedKey] = value + } else { + let newLevel = PresentationThemeDecodingLevel(data: NSMutableDictionary(), index: currentLevel.index + 1, previous: currentLevel) + currentLevel.data[trimmedKey] = newLevel.data + currentLevel = newLevel + } + } + } + + let decoder = PresentationThemeDecoding(referencing: topLevel.data) + if let value = try? decoder.unbox(topLevel.data, as: PresentationTheme.self) { + return value + } + return nil +} + +class PresentationThemeDecoding: Decoder { fileprivate var storage: PresentationThemeDecodingStorage fileprivate(set) public var codingPath: [CodingKey] @@ -45,6 +393,24 @@ fileprivate class PresentationThemeDecoding : Decoder { return [:] } + var referenceTheme: PresentationTheme? + var serviceBackgroundColor: UIColor? + + private var _referenceCoding: PresentationThemeEncoding? + fileprivate var referenceCoding: PresentationThemeEncoding? { + if let referenceCoding = self._referenceCoding { + return referenceCoding + } + + let encoding = PresentationThemeEncoding() + if let theme = self.referenceTheme, let _ = try? theme.encode(to: encoding) { + self._referenceCoding = encoding + return encoding + } else { + return nil + } + } + fileprivate init(referencing container: Any, at codingPath: [CodingKey] = []) { self.storage = PresentationThemeDecodingStorage() self.storage.push(container: container) @@ -103,7 +469,7 @@ fileprivate struct PresentationThemeDecodingStorage { } } -fileprivate struct PresentationThemeKeyedDecodingContainer : KeyedDecodingContainerProtocol { +fileprivate struct PresentationThemeKeyedDecodingContainer: KeyedDecodingContainerProtocol { typealias Key = K private let decoder: PresentationThemeDecoding @@ -137,7 +503,12 @@ fileprivate struct PresentationThemeKeyedDecodingContainer : Keye } public func decode(_ type: Bool.Type, forKey key: Key) throws -> Bool { - guard let entry = self.container[key.stringValue] else { + var containerEntry: Any? = self.container[key.stringValue] + if containerEntry == nil { + containerEntry = self.decoder.referenceCoding?.entry(for: self.codingPath.map { $0.stringValue } + [key.stringValue]) + } + + guard let entry = containerEntry else { throw PresentationThemeDecodingError.keyNotFound } @@ -152,7 +523,12 @@ fileprivate struct PresentationThemeKeyedDecodingContainer : Keye } public func decode(_ type: Int32.Type, forKey key: Key) throws -> Int32 { - guard let entry = self.container[key.stringValue] else { + var containerEntry: Any? = self.container[key.stringValue] + if containerEntry == nil { + containerEntry = self.decoder.referenceCoding?.entry(for: self.codingPath.map { $0.stringValue } + [key.stringValue]) + } + + guard let entry = containerEntry else { throw PresentationThemeDecodingError.keyNotFound } @@ -167,7 +543,12 @@ fileprivate struct PresentationThemeKeyedDecodingContainer : Keye } public func decode(_ type: String.Type, forKey key: Key) throws -> String { - guard let entry = self.container[key.stringValue] else { + var containerEntry: Any? = self.container[key.stringValue] + if containerEntry == nil { + containerEntry = self.decoder.referenceCoding?.entry(for: self.codingPath.map { $0.stringValue } + [key.stringValue]) + } + + guard let entry = containerEntry else { throw PresentationThemeDecodingError.keyNotFound } @@ -182,7 +563,12 @@ fileprivate struct PresentationThemeKeyedDecodingContainer : Keye } public func decode(_ type: T.Type, forKey key: Key) throws -> T { - guard let entry = self.container[key.stringValue] else { + var containerEntry: Any? = self.container[key.stringValue] + if containerEntry == nil { + containerEntry = self.decoder.referenceCoding?.entry(for: self.codingPath.map { $0.stringValue } + [key.stringValue]) + } + + guard let entry = containerEntry else { throw PresentationThemeDecodingError.keyNotFound } @@ -244,7 +630,7 @@ fileprivate struct PresentationThemeKeyedDecodingContainer : Keye } } -fileprivate struct PresentationThemeUnkeyedDecodingContainer : UnkeyedDecodingContainer { +fileprivate struct PresentationThemeUnkeyedDecodingContainer: UnkeyedDecodingContainer { private let decoder: PresentationThemeDecoding private let container: [Any] @@ -401,7 +787,7 @@ fileprivate struct PresentationThemeUnkeyedDecodingContainer : UnkeyedDecodingCo } } -extension PresentationThemeDecoding : SingleValueDecodingContainer { +extension PresentationThemeDecoding: SingleValueDecodingContainer { private func expectNonNull(_ type: T.Type) throws { guard !self.decodeNil() else { throw PresentationThemeDecodingError.valueNotFound @@ -497,20 +883,7 @@ extension PresentationThemeDecoding { } fileprivate func unbox_(_ value: Any, as type: Decodable.Type) throws -> Any? { - if type == Date.self || type == NSDate.self { - return try self.unbox(value, as: Date.self) - } else if type == Data.self || type == NSData.self { - return try self.unbox(value, as: Data.self) - } else if type == URL.self || type == NSURL.self { - guard let urlString = try self.unbox(value, as: String.self) else { - return nil - } - - guard let url = URL(string: urlString) else { - throw PresentationThemeDecodingError.dataCorrupted - } - return url - } else if type == Decimal.self || type == NSDecimalNumber.self { + if type == Decimal.self || type == NSDecimalNumber.self { return try self.unbox(value, as: Decimal.self) } else if let stringKeyedDictType = type as? _YAMLStringDictionaryDecodableMarker.Type { return try self.unbox(value, as: stringKeyedDictType) @@ -522,7 +895,7 @@ extension PresentationThemeDecoding { } } -fileprivate struct YAMLKey : CodingKey { +fileprivate struct YAMLKey: CodingKey { public var stringValue: String public var intValue: Int? diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeEncoder.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeEncoder.swift deleted file mode 100644 index d4938876f3..0000000000 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeEncoder.swift +++ /dev/null @@ -1,274 +0,0 @@ -import Foundation - -public final class PresentationThemeEncoder { - public init() { - } - - public func encode(_ value: T) throws -> String { - let encoding = PresentationThemeEncoding() - try value.encode(to: encoding) - return encoding.data.formatted - } - - private func stringsFormat(from strings: [(String, String)]) -> String { - let strings = strings.map { "\($0.0): \($0.1)" } - return strings.joined(separator: "\n") - } -} - -private func renderNodes(string: inout String, nodes: [PresentationThemeEncoding.Node], level: Int = 0) { - for node in nodes { - if level > 1 { - string.append(String(repeating: " ", count: level - 1)) - } - switch node.value { - case let .string(value): - if let key = node.key { - string.append("\(key): \(value)\n") - } - case let .subnode(nodes): - if let key = node.key { - string.append("\(key):\n") - } - renderNodes(string: &string, nodes: nodes, level: level + 1) - } - } -} - -fileprivate class PresentationThemeEncoding: Encoder { - fileprivate enum NodeValue { - case string(String) - case subnode([Node]) - } - - fileprivate final class Node { - var key: String? - var value: NodeValue - - init(key: String? = nil, value: NodeValue) { - self.key = key - self.value = value - } - } - - fileprivate final class Data { - private(set) var rootNode = Node(value: .subnode([])) - - func encode(key codingKey: [CodingKey], value: String) { - var currentNode: Node = self.rootNode - for i in 0 ..< codingKey.count { - let key = codingKey[i].stringValue - var found = false - switch currentNode.value { - case var .subnode(nodes): - for node in nodes { - if node.key == key { - currentNode = node - found = true - } - } - if !found { - let newNode: Node - if i == codingKey.count - 1 { - newNode = Node(key: key, value: .string(value)) - } else { - newNode = Node(key: key, value: .subnode([])) - } - nodes.append(newNode) - currentNode.value = .subnode(nodes) - currentNode = newNode - } - case .string: - break - } - } - } - - var formatted: String { - var result = "" - renderNodes(string: &result, nodes: [self.rootNode]) - return result - } - } - - fileprivate var data: Data - var codingPath: [CodingKey] = [] - let userInfo: [CodingUserInfoKey : Any] = [:] - - init(to encodedData: Data = Data()) { - self.data = encodedData - } - - func container(keyedBy type: Key.Type) -> KeyedEncodingContainer { - var container = StringsKeyedEncoding(to: data) - container.codingPath = self.codingPath - return KeyedEncodingContainer(container) - } - - func unkeyedContainer() -> UnkeyedEncodingContainer { - var container = StringsUnkeyedEncoding(to: data) - container.codingPath = self.codingPath - return container - } - - func singleValueContainer() -> SingleValueEncodingContainer { - var container = StringsSingleValueEncoding(to: data) - container.codingPath = self.codingPath - return container - } -} - -fileprivate struct StringsKeyedEncoding: KeyedEncodingContainerProtocol { - private let data: PresentationThemeEncoding.Data - var codingPath: [CodingKey] = [] - - init(to data: PresentationThemeEncoding.Data) { - self.data = data - } - - mutating func encodeNil(forKey key: Key) throws { - } - - mutating func encode(_ value: Bool, forKey key: Key) throws { - self.data.encode(key: codingPath + [key], value: value.description) - } - - mutating func encode(_ value: String, forKey key: Key) throws { - self.data.encode(key: codingPath + [key], value: value) - } - - mutating func encode(_ value: Int32, forKey key: Key) throws { - self.data.encode(key: codingPath + [key], value: value.description) - } - - mutating func encode(_ value: T, forKey key: Key) throws { - let stringsEncoding = PresentationThemeEncoding(to: self.data) - stringsEncoding.codingPath = self.codingPath + [key] - try value.encode(to: stringsEncoding) - } - - mutating func nestedContainer( - keyedBy keyType: NestedKey.Type, - forKey key: Key) -> KeyedEncodingContainer { - var container = StringsKeyedEncoding(to: self.data) - container.codingPath = self.codingPath + [key] - return KeyedEncodingContainer(container) - } - - mutating func nestedUnkeyedContainer(forKey key: Key) -> UnkeyedEncodingContainer { - var container = StringsUnkeyedEncoding(to: data) - container.codingPath = self.codingPath + [key] - return container - } - - mutating func superEncoder() -> Encoder { - let superKey = Key(stringValue: "super")! - return superEncoder(forKey: superKey) - } - - mutating func superEncoder(forKey key: Key) -> Encoder { - let stringsEncoding = PresentationThemeEncoding(to: self.data) - stringsEncoding.codingPath = self.codingPath + [key] - return stringsEncoding - } -} - -fileprivate struct StringsUnkeyedEncoding: UnkeyedEncodingContainer { - private let data: PresentationThemeEncoding.Data - var codingPath: [CodingKey] = [] - private(set) var count: Int = 0 - - init(to data: PresentationThemeEncoding.Data) { - self.data = data - } - - private mutating func nextIndexedKey() -> CodingKey { - let nextCodingKey = IndexedCodingKey(intValue: count)! - self.count += 1 - return nextCodingKey - } - - private struct IndexedCodingKey: CodingKey { - let intValue: Int? - let stringValue: String - - init?(intValue: Int) { - self.intValue = intValue - self.stringValue = intValue.description - } - - init?(stringValue: String) { - return nil - } - } - - mutating func encodeNil() throws { - } - - mutating func encode(_ value: Bool) throws { - self.data.encode(key: self.codingPath + [self.nextIndexedKey()], value: value.description) - } - - mutating func encode(_ value: String) throws { - self.data.encode(key: self.codingPath + [self.nextIndexedKey()], value: value) - } - - mutating func encode(_ value: Int32) throws { - self.data.encode(key: self.codingPath + [self.nextIndexedKey()], value: value.description) - } - - mutating func encode(_ value: T) throws { - let stringsEncoding = PresentationThemeEncoding(to: self.data) - stringsEncoding.codingPath = self.codingPath + [self.nextIndexedKey()] - try value.encode(to: stringsEncoding) - } - - mutating func nestedContainer( - keyedBy keyType: NestedKey.Type) -> KeyedEncodingContainer { - var container = StringsKeyedEncoding(to: self.data) - container.codingPath = self.codingPath + [self.nextIndexedKey()] - return KeyedEncodingContainer(container) - } - - mutating func nestedUnkeyedContainer() -> UnkeyedEncodingContainer { - var container = StringsUnkeyedEncoding(to: self.data) - container.codingPath = self.codingPath + [self.nextIndexedKey()] - return container - } - - mutating func superEncoder() -> Encoder { - let stringsEncoding = PresentationThemeEncoding(to: self.data) - stringsEncoding.codingPath = self.codingPath - return stringsEncoding - } -} - -fileprivate struct StringsSingleValueEncoding: SingleValueEncodingContainer { - private let data: PresentationThemeEncoding.Data - var codingPath: [CodingKey] = [] - - init(to data: PresentationThemeEncoding.Data) { - self.data = data - } - - mutating func encodeNil() throws { - } - - mutating func encode(_ value: Bool) throws { - self.data.encode(key: self.codingPath, value: value.description) - } - - mutating func encode(_ value: String) throws { - self.data.encode(key: self.codingPath, value: value) - } - - mutating func encode(_ value: Int32) throws { - self.data.encode(key: self.codingPath, value: value.description) - } - - mutating func encode(_ value: T) throws { - let stringsEncoding = PresentationThemeEncoding(to: self.data) - stringsEncoding.codingPath = self.codingPath - try value.encode(to: stringsEncoding) - } -} diff --git a/submodules/TelegramPresentationData/TelegramPresentationData_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramPresentationData/TelegramPresentationData_Xcode.xcodeproj/project.pbxproj index f751f9ce8b..bda6b87d51 100644 --- a/submodules/TelegramPresentationData/TelegramPresentationData_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramPresentationData/TelegramPresentationData_Xcode.xcodeproj/project.pbxproj @@ -8,8 +8,7 @@ /* Begin PBXBuildFile section */ 0938677D22E0B9CB000EF19E /* MakePresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0938677C22E0B9CB000EF19E /* MakePresentationTheme.swift */; }; - 0957DE1522D88B82001B4D57 /* PresentationThemeEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0957DE1422D88B82001B4D57 /* PresentationThemeEncoder.swift */; }; - 0957DE1922D95E0F001B4D57 /* PresentationThemeDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0957DE1822D95E0F001B4D57 /* PresentationThemeDecoder.swift */; }; + 0957DE1922D95E0F001B4D57 /* PresentationThemeCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0957DE1822D95E0F001B4D57 /* PresentationThemeCoder.swift */; }; 097A581B22D528680078B73C /* PresentationThemeCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097A581A22D528680078B73C /* PresentationThemeCodable.swift */; }; D06017EB22F3578200796784 /* PresentationResourcesSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06017E422F3578100796784 /* PresentationResourcesSettings.swift */; }; D06017EC22F3578200796784 /* PresentationResourcesChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06017E522F3578100796784 /* PresentationResourcesChat.swift */; }; @@ -49,8 +48,7 @@ /* Begin PBXFileReference section */ 0938677C22E0B9CB000EF19E /* MakePresentationTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakePresentationTheme.swift; sourceTree = ""; }; - 0957DE1422D88B82001B4D57 /* PresentationThemeEncoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationThemeEncoder.swift; sourceTree = ""; }; - 0957DE1822D95E0F001B4D57 /* PresentationThemeDecoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationThemeDecoder.swift; sourceTree = ""; }; + 0957DE1822D95E0F001B4D57 /* PresentationThemeCoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationThemeCoder.swift; sourceTree = ""; }; 097A581A22D528680078B73C /* PresentationThemeCodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationThemeCodable.swift; sourceTree = ""; }; D06017E422F3578100796784 /* PresentationResourcesSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationResourcesSettings.swift; sourceTree = ""; }; D06017E522F3578100796784 /* PresentationResourcesChat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationResourcesChat.swift; sourceTree = ""; }; @@ -161,8 +159,7 @@ D0AE31B122B2746B0058D3BC /* PresentationStrings.swift */, D0AE31B322B2746B0058D3BC /* PresentationTheme.swift */, 097A581A22D528680078B73C /* PresentationThemeCodable.swift */, - 0957DE1422D88B82001B4D57 /* PresentationThemeEncoder.swift */, - 0957DE1822D95E0F001B4D57 /* PresentationThemeDecoder.swift */, + 0957DE1822D95E0F001B4D57 /* PresentationThemeCoder.swift */, D06017F422F35A4000796784 /* PresentationThemeEssentialGraphics.swift */, D06017F622F35A9200796784 /* ChatMessageBubbleImages.swift */, D06017F822F35ACF00796784 /* WallpaperUtils.swift */, @@ -280,7 +277,7 @@ D06017EB22F3578200796784 /* PresentationResourcesSettings.swift in Sources */, D0AE31CB22B279D00058D3BC /* NumericFormat.swift in Sources */, D06017F722F35A9200796784 /* ChatMessageBubbleImages.swift in Sources */, - 0957DE1922D95E0F001B4D57 /* PresentationThemeDecoder.swift in Sources */, + 0957DE1922D95E0F001B4D57 /* PresentationThemeCoder.swift in Sources */, D0AE31B422B2746B0058D3BC /* PresentationStrings.swift in Sources */, D0AE321422B2826A0058D3BC /* ComponentsThemes.swift in Sources */, D084F9F022F3AEFD004874CE /* ChatControllerBackgroundNode.swift in Sources */, @@ -294,7 +291,6 @@ D0AE31D322B27A780058D3BC /* DefaultDarkTintedPresentationTheme.swift in Sources */, D0AE31B622B2746B0058D3BC /* PresentationTheme.swift in Sources */, D06017ED22F3578200796784 /* PresentationResourcesCallList.swift in Sources */, - 0957DE1522D88B82001B4D57 /* PresentationThemeEncoder.swift in Sources */, D0AE31D222B27A780058D3BC /* DefaultDarkPresentationTheme.swift in Sources */, D06017EE22F3578200796784 /* PresentationResourcesRootController.swift in Sources */, D06017F522F35A4000796784 /* PresentationThemeEssentialGraphics.swift in Sources */, diff --git a/submodules/TelegramUI/TelegramUI/BundleResource.swift b/submodules/TelegramUI/TelegramUI/BundleResource.swift deleted file mode 100644 index cb09193ee0..0000000000 --- a/submodules/TelegramUI/TelegramUI/BundleResource.swift +++ /dev/null @@ -1,82 +0,0 @@ -import Foundation -import SwiftSignalKit -import Postbox -import TelegramCore - -public struct LocalBundleResourceId: MediaResourceId { - public let name: String - public let ext: String - - public var uniqueId: String { - return "local-bundle-\(self.name)-\(self.ext)" - } - - public var hashValue: Int { - return self.name.hashValue - } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? LocalBundleResourceId { - return self.name == to.name && self.ext == to.ext - } else { - return false - } - } -} - -public class LocalBundleResource: TelegramMediaResource { - public let name: String - public let ext: String - - public init(name: String, ext: String) { - self.name = name - self.ext = ext - } - - public required init(decoder: PostboxDecoder) { - self.name = decoder.decodeStringForKey("n", orElse: "") - self.ext = decoder.decodeStringForKey("e", orElse: "") - } - - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeString(self.name, forKey: "n") - encoder.encodeString(self.ext, forKey: "e") - } - - public var id: MediaResourceId { - return LocalBundleResourceId(name: self.name, ext: self.ext) - } - - public func isEqual(to: MediaResource) -> Bool { - if let to = to as? LocalBundleResource { - return self.name == to.name && self.ext == to.ext - } else { - return false - } - } -} - -private final class LocalBundleResourceCopyFile : MediaResourceDataFetchCopyLocalItem { - let path: String - init(path: String) { - self.path = path - } - func copyTo(url: URL) -> Bool { - do { - try FileManager.default.copyItem(at: URL(fileURLWithPath: self.path), to: url) - return true - } catch { - return false - } - } -} - -func fetchLocalBundleResource(postbox: Postbox, resource: LocalBundleResource) -> Signal { - return Signal { subscriber in - if let path = frameworkBundle.path(forResource: resource.name, ofType: resource.ext), let _ = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { - subscriber.putNext(.copyLocalItem(LocalBundleResourceCopyFile(path: path))) - subscriber.putCompletion() - } - return EmptyDisposable - } -} diff --git a/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift b/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift index 372cf9a173..8097d213a2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift @@ -116,7 +116,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { break case .ignore: return .fail - case .url, .peerMention, .textMention, .botCommand, .hashtag, .instantPage, .wallpaper, .call, .openMessage, .timecode, .tooltip: + case .url, .peerMention, .textMention, .botCommand, .hashtag, .instantPage, .wallpaper, .theme, .call, .openMessage, .timecode, .tooltip: return .waitForSingleTap } } diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 57c555c1c1..f69baf07c2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -971,6 +971,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self?.present(c, in: .window(.root), with: a, blockInteraction: true) }) } + }, openTheme: { [weak self] message in + if let strongSelf = self, strongSelf.isNodeLoaded, let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(message.id) { + strongSelf.chatDisplayNode.dismissInput() + openChatTheme(context: strongSelf.context, message: message, present: { [weak self] c, a in + self?.present(c, in: .window(.root), with: a, blockInteraction: true) + }) + } }, openHashtag: { [weak self] peerName, hashtag in guard let strongSelf = self else { return diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift index c36a16e51d..1c2c3f86a3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift @@ -67,6 +67,7 @@ public final class ChatControllerInteraction { let sendBotCommand: (MessageId?, String) -> Void let openInstantPage: (Message, ChatMessageItemAssociatedData?) -> Void let openWallpaper: (Message) -> Void + let openTheme: (Message) -> Void let openHashtag: (String?, String) -> Void let updateInputState: ((ChatTextInputState) -> ChatTextInputState) -> Void let updateInputMode: ((ChatInputMode) -> ChatInputMode) -> Void @@ -109,7 +110,7 @@ public final class ChatControllerInteraction { var searchTextHighightState: String? var seenOneTimeAnimatedMedia = Set() - init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, TapLongTapOrDoubleTapGestureRecognizer?) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, String, TextSelectionAction) -> Void, updateMessageReaction: @escaping (MessageId, String) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { + init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, TapLongTapOrDoubleTapGestureRecognizer?) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openTheme: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, String, TextSelectionAction) -> Void, updateMessageReaction: @escaping (MessageId, String) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { self.openMessage = openMessage self.openPeer = openPeer self.openPeerMention = openPeerMention @@ -130,6 +131,7 @@ public final class ChatControllerInteraction { self.sendBotCommand = sendBotCommand self.openInstantPage = openInstantPage self.openWallpaper = openWallpaper + self.openTheme = openTheme self.openHashtag = openHashtag self.updateInputState = updateInputState self.updateInputMode = updateInputMode @@ -170,7 +172,7 @@ public final class ChatControllerInteraction { static var `default`: ChatControllerInteraction { return ChatControllerInteraction(openMessage: { _, _ in - return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, navigateToMessage: { _, _ in }, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, navigateToMessage: { _, _ in }, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift index 3a6d352d0f..1146e2917f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift @@ -397,9 +397,16 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { var automaticPlayback = false + var skipStandardStatus = false + if let (media, flags) = mediaAndFlags { if let file = media as? TelegramMediaFile { - if file.isInstantVideo { + if file.mimeType == "application/x-tgtheme-ios", let size = file.size, size < 16 * 1024 { + let automaticDownload = shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: file) + let (_, initialImageWidth, refineLayout) = contentImageLayout(context, presentationData.theme.theme, presentationData.strings, presentationData.dateTimeFormat, message, file, automaticDownload ? .full : .none, associatedData.automaticDownloadPeerType, .constrained(CGSize(width: constrainedSize.width - horizontalInsets.left - horizontalInsets.right, height: constrainedSize.height)), layoutConstants, contentMode) + initialWidth = initialImageWidth + horizontalInsets.left + horizontalInsets.right + refineContentImageLayout = refineLayout + } else if file.isInstantVideo { let automaticDownload = shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: file) let (videoLayout, apply) = contentInstantVideoLayout(ChatMessageBubbleContentItem(context: context, controllerInteraction: controllerInteraction, message: message, read: messageRead, presentationData: presentationData, associatedData: associatedData), constrainedSize.width - horizontalInsets.left - horizontalInsets.right, CGSize(width: 212.0, height: 212.0), .bubble, automaticDownload) initialWidth = videoLayout.contentSize.width + videoLayout.overflowLeft + videoLayout.overflowRight @@ -476,6 +483,9 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { let (_, initialImageWidth, refineLayout) = contentImageLayout(context, presentationData.theme.theme, presentationData.strings, presentationData.dateTimeFormat, message, wallpaper, .full, associatedData.automaticDownloadPeerType, .constrained(CGSize(width: constrainedSize.width - horizontalInsets.left - horizontalInsets.right, height: constrainedSize.height)), layoutConstants, contentMode) initialWidth = initialImageWidth + horizontalInsets.left + horizontalInsets.right refineContentImageLayout = refineLayout + if case let .file(_, _, isTheme) = wallpaper.content, isTheme { + skipStandardStatus = true + } } } @@ -509,7 +519,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { let imageMode = !((refineContentImageLayout == nil && refineContentFileLayout == nil && contentInstantVideoSizeAndApply == nil) || preferMediaBeforeText) statusInText = !imageMode - var skipStandardStatus = false + if let count = webpageGalleryMediaCount { additionalImageBadgeContent = .text(inset: 0.0, backgroundColor: presentationData.theme.theme.chat.message.mediaDateAndStatusFillColor, foregroundColor: presentationData.theme.theme.chat.message.mediaDateAndStatusTextColor, text: NSAttributedString(string: "1 \(presentationData.strings.Common_of) \(count)")) skipStandardStatus = imageMode diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift index c1ac9f8340..8b610f0ee1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift @@ -74,6 +74,7 @@ enum ChatMessageBubbleContentTapAction { case hashtag(String?, String) case instantPage case wallpaper + case theme case call(PeerId) case openMessage case timecode(Double, String) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 5d42a6e92e..62704c2ec6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -339,7 +339,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode break case .ignore: return .fail - case .url, .peerMention, .textMention, .botCommand, .hashtag, .instantPage, .wallpaper, .call, .openMessage, .timecode, .tooltip: + case .url, .peerMention, .textMention, .botCommand, .hashtag, .instantPage, .wallpaper, .theme, .call, .openMessage, .timecode, .tooltip: return .waitForSingleTap } } @@ -2290,6 +2290,12 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode item.controllerInteraction.openWallpaper(item.message) } break loop + case .theme: + foundTapAction = true + if let item = self.item { + item.controllerInteraction.openTheme(item.message) + } + break loop case let .call(peerId): foundTapAction = true self.item?.controllerInteraction.callPeer(peerId) @@ -2359,6 +2365,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode break case .wallpaper: break + case .theme: + break case .call: break case .openMessage: diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 84061192a0..bd592ac4ad 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -297,7 +297,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio unboundSize = CGSize(width: floor(dimensions.width * 0.5), height: floor(dimensions.height * 0.5)) } else if let wallpaper = media as? WallpaperPreviewMedia { switch wallpaper.content { - case let .file(file, _): + case let .file(file, _, isTheme): if let thumbnail = file.previewRepresentations.first, var dimensions = file.dimensions { let dimensionsVertical = dimensions.width < dimensions.height let thumbnailVertical = thumbnail.dimensions.width < thumbnail.dimensions.height @@ -305,6 +305,8 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio dimensions = CGSize(width: dimensions.height, height: dimensions.width) } unboundSize = CGSize(width: floor(dimensions.width * 0.5), height: floor(dimensions.height * 0.5)).fitted(CGSize(width: 240.0, height: 240.0)) + } else if isTheme { + unboundSize = CGSize(width: 160.0, height: 240.0).fitted(CGSize(width: 240.0, height: 240.0)) } else { unboundSize = CGSize(width: 54.0, height: 54.0) } @@ -424,7 +426,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio } else { emptyColor = message.effectivelyIncoming(context.account.peerId) ? theme.chat.message.incoming.mediaPlaceholderColor : theme.chat.message.outgoing.mediaPlaceholderColor } - if let wallpaper = media as? WallpaperPreviewMedia, case let .file(_, patternColor) = wallpaper.content { + if let wallpaper = media as? WallpaperPreviewMedia, case let .file(_, patternColor, _) = wallpaper.content { emptyColor = patternColor ?? UIColor(rgb: 0xd6e2ee, alpha: 0.5) } @@ -554,19 +556,23 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio } else if let wallpaper = media as? WallpaperPreviewMedia { updateImageSignal = { synchronousLoad in switch wallpaper.content { - case let .file(file, _): - let representations: [ImageRepresentationWithReference] = file.previewRepresentations.map({ ImageRepresentationWithReference(representation: $0, reference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference($0.resource)) }) - if file.mimeType == "image/png" { - return patternWallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: representations, mode: .thumbnail) + case let .file(file, _, isTheme): + if isTheme { + return themeImage(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: FileMediaReference.message(message: MessageReference(message), media: file)) } else { - return wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: FileMediaReference.message(message: MessageReference(message), media: file), representations: representations, alwaysShowThumbnailFirst: false, thumbnail: true, autoFetchFullSize: true) + let representations: [ImageRepresentationWithReference] = file.previewRepresentations.map({ ImageRepresentationWithReference(representation: $0, reference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference($0.resource)) }) + if file.mimeType == "image/png" { + return patternWallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: representations, mode: .thumbnail) + } else { + return wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: FileMediaReference.message(message: MessageReference(message), media: file), representations: representations, alwaysShowThumbnailFirst: false, thumbnail: true, autoFetchFullSize: true) + } } case let .color(color): return solidColor(color) } } - if case let .file(file, _) = wallpaper.content { + if case let .file(file, _, _) = wallpaper.content { updatedFetchControls = FetchControls(fetch: { manual in if let strongSelf = self { strongSelf.fetchDisposable.set(messageMediaFileInteractiveFetched(context: context, message: message, file: file, userInitiated: manual).start()) @@ -610,7 +616,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio } } else if let wallpaper = media as? WallpaperPreviewMedia { switch wallpaper.content { - case let .file(file, _): + case let .file(file, _, _): updatedStatusSignal = messageMediaFileStatus(context: context, messageId: message.id, file: file) |> map { resourceStatus -> (MediaResourceStatus, MediaResourceStatus?) in return (resourceStatus, nil) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 28e189b189..1b752cd9c0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -87,7 +87,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { var maxTextWidth = CGFloat.greatestFiniteMagnitude for media in item.message.media { - if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content, content.type == "telegram_background" { + if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content, content.type == "telegram_background" || content.type == "telegram_theme" { maxTextWidth = layoutConstants.wallpapers.maxTextWidth break } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift index c9f047d38c..223f86a833 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift @@ -129,6 +129,9 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { } else if content.type == "telegram_background" { item.controllerInteraction.openWallpaper(item.message) return + } else if content.type == "telegram_theme" { + item.controllerInteraction.openTheme(item.message) + return } } let openChatMessageMode: ChatControllerInteractionOpenMessageMode @@ -255,7 +258,7 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { if let wallpaper = parseWallpaperUrl(webpage.url), case let .slug(_, _, color, intensity) = wallpaper { patternColor = color?.withAlphaComponent(CGFloat(intensity ?? 50) / 100.0) } - let media = WallpaperPreviewMedia(content: .file(file, patternColor)) + let media = WallpaperPreviewMedia(content: .file(file, patternColor, false)) mediaAndFlags = (media, [.preferMediaAspectFilled]) if let fileSize = file.size { badge = dataSizeString(fileSize, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator) @@ -281,13 +284,18 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { } mediaAndFlags = (image, flags) } - } else if let type = webpage.type, type == "telegram_background" { - if let text = webpage.text, let colorCodeRange = text.range(of: "#") { - let colorCode = String(text[colorCodeRange.upperBound...]) - if colorCode.rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789abcdefABCDEF").inverted) == nil, let color = UIColor(hexString: colorCode) { - let media = WallpaperPreviewMedia(content: .color(color)) - mediaAndFlags = (media, ChatMessageAttachedContentNodeMediaFlags()) + } else if let type = webpage.type { + if type == "telegram_backgroud" { + if let text = webpage.text, let colorCodeRange = text.range(of: "#") { + let colorCode = String(text[colorCodeRange.upperBound...]) + if colorCode.rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789abcdefABCDEF").inverted) == nil, let color = UIColor(hexString: colorCode) { + let media = WallpaperPreviewMedia(content: .color(color)) + mediaAndFlags = (media, ChatMessageAttachedContentNodeMediaFlags()) + } } + } else if type == "telegram_theme", let files = webpage.files, let file = files.first { + let media = WallpaperPreviewMedia(content: .file(file, nil, true)) + mediaAndFlags = (media, ChatMessageAttachedContentNodeMediaFlags()) } } @@ -312,6 +320,10 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { subtitle = nil text = nil actionTitle = item.presentationData.strings.Conversation_ViewBackground + case "telegram_theme": + title = item.presentationData.strings.Conversation_Theme + text = nil + actionTitle = item.presentationData.strings.Conversation_ViewTheme default: break } @@ -414,6 +426,8 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { } } else if content.type == "telegram_background" { return .wallpaper + } else if content.type == "telegram_theme" { + return .theme } } if self.contentNode.hasActionAtPoint(point.offsetBy(dx: -contentNodeFrame.minX, dy: -contentNodeFrame.minY)) { diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 3cdbbaf05d..74895cdde5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -204,6 +204,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self?.presentController(c, a) }) } + }, openTheme: { _ in }, openHashtag: { [weak self] peerName, hashtag in guard let strongSelf = self else { return diff --git a/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift b/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift deleted file mode 100644 index 1d92f867f1..0000000000 --- a/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift +++ /dev/null @@ -1,479 +0,0 @@ -import Foundation -import UIKit -import TelegramCore -import Postbox -import SwiftSignalKit -import CoreMedia -import Display -import UIKit -import VideoToolbox -import FFMpeg - -/* -private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: UnsafeMutablePointer?, bufferSize: Int32) -> Int32 { - guard let buffer = buffer else { - return 0 - } - let context = Unmanaged.fromOpaque(userData!).takeUnretainedValue() - while !context.cancelled && !context.readingError { - if !RunLoop.current.run(mode: RunLoopMode.defaultRunLoopMode, before: .distantFuture) { - break - } - } - return -1 - //return Int32(bufferPointer) -} - -private func seekCallback(userData: UnsafeMutableRawPointer?, offset: Int64, whence: Int32) -> Int64 { - let context = Unmanaged.fromOpaque(userData!).takeUnretainedValue() - if (whence & FFMPEG_AVSEEK_SIZE) != 0 { - return Int64(context.size) - } else { - context.readOffset = Int(offset) - return offset - } -} - -private final class SoftwareVideoStream { - let index: Int - let fps: CMTime - let timebase: CMTime - let duration: CMTime - let decoder: FFMpegMediaVideoFrameDecoder - let rotationAngle: Double - let aspect: Double - - init(index: Int, fps: CMTime, timebase: CMTime, duration: CMTime, decoder: FFMpegMediaVideoFrameDecoder, rotationAngle: Double, aspect: Double) { - self.index = index - self.fps = fps - self.timebase = timebase - self.duration = duration - self.decoder = decoder - self.rotationAngle = rotationAngle - self.aspect = aspect - } -} - -private final class FetchVideoThumbnailSource { - fileprivate let mediaBox: MediaBox - fileprivate let resourceReference: MediaResourceReference - fileprivate let size: Int32 - fileprivate var readOffset: Int = 0 - - fileprivate var cancelled = false - fileprivate var readingError = false - - private var videoStream: SoftwareVideoStream? - private var avIoContext: UnsafeMutablePointer? - private var avFormatContext: UnsafeMutablePointer? - -// init(mediaBox: MediaBox, resourceReference: MediaResourceReference, size: Int32) { - let _ = FFMpegMediaFrameSourceContextHelpers.registerFFMpegGlobals - - self.mediaBox = mediaBox - self.resourceReference = resourceReference - self.size = size - - var avFormatContextRef = avformat_alloc_context() - guard let avFormatContext = avFormatContextRef else { - self.readingError = true - return - } - - let ioBufferSize = 8 * 1024 - let avIoBuffer = av_malloc(ioBufferSize)! - let avIoContextRef = avio_alloc_context(avIoBuffer.assumingMemoryBound(to: UInt8.self), Int32(ioBufferSize), 0, Unmanaged.passUnretained(self).toOpaque(), readPacketCallback, nil, seekCallback) - self.avIoContext = avIoContextRef - - avFormatContext.pointee.pb = self.avIoContext - - guard avformat_open_input(&avFormatContextRef, nil, nil, nil) >= 0 else { - self.readingError = true - return - } - - guard avformat_find_stream_info(avFormatContext, nil) >= 0 else { - self.readingError = true - return - } - - self.avFormatContext = avFormatContext - - var videoStream: SoftwareVideoStream? - - for streamIndex in FFMpegMediaFrameSourceContextHelpers.streamIndices(formatContext: avFormatContext, codecType: AVMEDIA_TYPE_VIDEO) { - if (avFormatContext.pointee.streams.advanced(by: streamIndex).pointee!.pointee.disposition & Int32(AV_DISPOSITION_ATTACHED_PIC)) == 0 { - - let codecPar = avFormatContext.pointee.streams.advanced(by: streamIndex).pointee!.pointee.codecpar! - - if let codec = avcodec_find_decoder(codecPar.pointee.codec_id) { - if let codecContext = avcodec_alloc_context3(codec) { - if avcodec_parameters_to_context(codecContext, avFormatContext.pointee.streams[streamIndex]!.pointee.codecpar) >= 0 { - if avcodec_open2(codecContext, codec, nil) >= 0 { - let (fps, timebase) = FFMpegMediaFrameSourceContextHelpers.streamFpsAndTimeBase(stream: avFormatContext.pointee.streams.advanced(by: streamIndex).pointee!, defaultTimeBase: CMTimeMake(1, 24)) - - let duration = CMTimeMake(avFormatContext.pointee.streams.advanced(by: streamIndex).pointee!.pointee.duration, timebase.timescale) - - var rotationAngle: Double = 0.0 - if let rotationInfo = av_dict_get(avFormatContext.pointee.streams.advanced(by: streamIndex).pointee!.pointee.metadata, "rotate", nil, 0), let value = rotationInfo.pointee.value { - if strcmp(value, "0") != 0 { - if let angle = Double(String(cString: value)) { - rotationAngle = angle * Double.pi / 180.0 - } - } - } - - let aspect = Double(codecPar.pointee.width) / Double(codecPar.pointee.height) - - videoStream = SoftwareVideoStream(index: streamIndex, fps: fps, timebase: timebase, duration: duration, decoder: FFMpegMediaVideoFrameDecoder(codecContext: codecContext), rotationAngle: rotationAngle, aspect: aspect) - break - } else { - var codecContextRef: UnsafeMutablePointer? = codecContext - avcodec_free_context(&codecContextRef) - } - } else { - var codecContextRef: UnsafeMutablePointer? = codecContext - avcodec_free_context(&codecContextRef) - } - } - } - } - } - - self.videoStream = videoStream - if self.videoStream == nil { - self.readingError = true - } - } - - deinit { - if let avIoContext = self.avIoContext { - if avIoContext.pointee.buffer != nil { - av_free(avIoContext.pointee.buffer) - } - av_free(avIoContext) - } - if let avFormatContext = self.avFormatContext { - avformat_free_context(avFormatContext) - } - } - - private func readPacketInternal() -> FFMpegPacket? { - guard let avFormatContext = self.avFormatContext else { - return nil - } - - let packet = FFMpegPacket() - if av_read_frame(avFormatContext, &packet.packet) < 0 { - return nil - } else { - return packet - } - } - - func readDecodableFrame() -> MediaTrackDecodableFrame? { - var frames: [MediaTrackDecodableFrame] = [] - - while !self.readingError && frames.isEmpty { - if let packet = self.readPacketInternal() { - if let videoStream = videoStream, Int(packet.streamIndex) == videoStream.index { - let avNoPtsRawValue: UInt64 = 0x8000000000000000 - let avNoPtsValue = Int64(bitPattern: avNoPtsRawValue) - let packetPts = packet.pts == avNoPtsValue ? packet.dts : packet.pts - - let pts = CMTimeMake(packetPts, videoStream.timebase.timescale) - let dts = CMTimeMake(packet.dts, videoStream.timebase.timescale) - - let duration: CMTime - - let frameDuration = packet.duration - if frameDuration != 0 { - duration = CMTimeMake(frameDuration * videoStream.timebase.value, videoStream.timebase.timescale) - } else { - duration = videoStream.fps - } - - let frame = MediaTrackDecodableFrame(type: .video, packet: packet, pts: pts, dts: dts, duration: duration) - frames.append(frame) - } - } else { - self.readingError = true - } - } - - return frames.first - } - - func readFrame() -> (frame: MediaTrackFrame, rotationAngle: CGFloat, aspect: CGFloat)? { - guard let videoStream = self.videoStream else { - return nil - } - guard let decodableFrame = self.readDecodableFrame() else { - return nil - } - guard let decodedFrame = videoStream.decoder.decode(frame: decodableFrame, ptsOffset: nil) else { - return nil - } - - return (decodedFrame, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect)) - } -} - -private final class FetchVideoThumbnailSourceParameters: NSObject { - let mediaBox: MediaBox - let resourceReference: MediaResourceReference - let size: Int32 - - init(mediaBox: MediaBox, resourceReference: MediaResourceReference, size: Int32) { - self.mediaBox = mediaBox - self.resourceReference = resourceReference - self.size = size - } -} - -private final class FetchVideoThumbnailSourceTimerTarget: NSObject { - @objc func noop() { - } -} - -private let threadContextKey = "FetchVideoThumbnailSourceThreadContext" - -private final class FetchVideoThumbnailSourceThreadContext { - -} - -private final class FetchVideoThumbnailSourceThreadImpl: NSObject { - private var timer: Foundation.Timer - private var disposed = false - - override init() { - self.timer = Foundation.Timer.scheduledTimer(timeInterval: .greatestFiniteMagnitude, target: FetchVideoThumbnailSourceTimerTarget(), selector: #selector(FetchVideoThumbnailSourceTimerTarget.noop), userInfo: nil, repeats: true) - - super.init() - } - - @objc func dispose() { - self.disposed = true - self.timer.invalidate() - } - - @objc func entryPoint() { - Thread.current.threadDictionary[threadContextKey] = FetchVideoThumbnailSourceThreadContext() - RunLoop.current.add(self.timer, forMode: RunLoopMode.defaultRunLoopMode) - while !self.disposed { - if !RunLoop.current.run(mode: RunLoopMode.defaultRunLoopMode, before: .distantFuture) { - break - } - } - } - - @objc func fetch(_ parameters: FetchVideoThumbnailSourceParameters) { - let source = FetchVideoThumbnailSource(mediaBox: parameters.mediaBox, resourceReference: parameters.resourceReference, size: parameters.size) - let _ = source.readFrame() - } -} - -private func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer) -> UIImage? { - guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { - return nil - } - var maybeImage: CGImage? - if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { - guard VTCreateCGImageFromCVPixelBuffer(imageBuffer, nil, &maybeImage) == noErr, let image = maybeImage else { - return nil - } - return UIImage(cgImage: image) - } else { - return nil - } - - /*CVPixelBufferLockBaseAddress(imageBuffer, []) - defer { - CVPixelBufferUnlockBaseAddress(imageBuffer, []) - } - - let width = CVPixelBufferGetWidth(imageBuffer) - let height = CVPixelBufferGetHeight(imageBuffer) - guard let yBuffer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)?.assumingMemoryBound(to: UInt8.self) else { - return nil - } - let yPitch = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0) - guard let cbCrBuffer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 1)?.assumingMemoryBound(to: UInt8.self) else { - return nil - } - let cbCrPitch = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 1) - - let bytesPerPixel = 4 - let context = DrawingContext(size: CGSize(width: CGFloat(width), height: CGFloat(height)), scale: 1.0, clear: false) - let rgbBuffer = context.bytes.assumingMemoryBound(to: UInt8.self) - - for y in 0 ..< height { - let rgbBufferLine = rgbBuffer.advanced(by: y * width * bytesPerPixel) - let yBufferLine = yBuffer.advanced(by: y * yPitch) - let cbCrBufferLine = cbCrBuffer.advanced(by: y * 2 * cbCrPitch) - - for x in 0 ..< width { - let y = UInt16(yBufferLine[x]) - let cb = UInt16(cbCrBufferLine[x & ~1]) - 128 - let cr = UInt16(cbCrBufferLine[x | 1]) - 128 - - let rgbOutput = rgbBufferLine.advanced(by: x * bytesPerPixel) - - let r = UInt16(round(Float(y) + Float(cr) * 1.4)) - let g = UInt16(round(Float(y) + Float(cb) * -0.343 + Float(cr) * -0.711)) - let b = UInt16(round(Float(y) + Float(cb) * 1.765)) - - rgbOutput[0] = 0xff - rgbOutput[1] = UInt8(clamping: b > 255 ? 255 : (b < 0 ? 0 : b)) - rgbOutput[2] = UInt8(clamping: g > 255 ? 255 : (g < 0 ? 0 : g)) - rgbOutput[3] = UInt8(clamping: r > 255 ? 255 : (r < 0 ? 0 : r)) - } - } - - - return context.generateImage()*/ -} - -private let headerSize = 250 * 1024 -private let tailSize = 16 * 1024 - -func fetchedPartialVideoThumbnailData(postbox: Postbox, fileReference: FileMediaReference) -> Signal { - return Signal { subscriber in - guard let size = fileReference.media.size else { - subscriber.putCompletion() - return EmptyDisposable - } - let fetchedHead = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource), range: (0 ..< min(size, headerSize), .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() - let fetchedTail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource), range: (max(0, size - tailSize) ..< size, .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() - - return ActionDisposable { - fetchedHead.dispose() - fetchedTail.dispose() - } - } -} - -private func partialVideoThumbnailData(postbox: Postbox, resource: MediaResource) -> Signal<(Data, Int, Data), NoError> { - guard let size = resource.size else { - return .complete() - } - return combineLatest(postbox.mediaBox.resourceData(resource, size: size, in: 0 ..< min(size, headerSize)), postbox.mediaBox.resourceData(resource, size: size, in: max(0, size - tailSize) ..< size)) - |> mapToSignal { header, tail -> Signal<(Data, Int, Data), NoError> in - return .single((header, max(0, size - header.count - tail.count), tail)) - } -} - -func fetchedStreamingVideoThumbnail(postbox: Postbox, fileReference: FileMediaReference) -> Signal { - return Signal { subscriber in - let resourceReference = fileReference.resourceReference(fileReference.media.resource) - guard let size = resourceReference.resource.size else { - subscriber.putCompletion() - return EmptyDisposable - } - let impl = FetchVideoThumbnailSourceThreadImpl() - let thread = Thread(target: impl, selector: #selector(impl.entryPoint), object: nil) - thread.name = "fetchedStreamingVideoThumbnail" - impl.perform(#selector(impl.fetch(_:)), on: thread, with: FetchVideoThumbnailSourceParameters(mediaBox: postbox.mediaBox, resourceReference: resourceReference, size: Int32(size)), waitUntilDone: false) - thread.start() - - return ActionDisposable { - impl.perform(#selector(impl.dispose), on: thread, with: nil, waitUntilDone: false) - } - } -} - -func streamingVideoThumbnail(postbox: Postbox, fileReference: FileMediaReference) -> Signal { - return Signal { subscriber in - let impl = FetchVideoThumbnailSourceThreadImpl() - let thread = Thread(target: impl, selector: #selector(impl.entryPoint), object: nil) - thread.name = "streamingVideoThumbnail" - //impl.perform(#selector(impl.fetch(_:)), on: thread, with: FetchVideoThumbnailSourceParameters(), waitUntilDone: false) - thread.start() - - return ActionDisposable { - impl.perform(#selector(impl.dispose), on: thread, with: nil, waitUntilDone: false) - } - } -} - - - - - - - - - - -//func fetchPartialVideoThumbnail(postbox: Postbox, resource: MediaResource) -> Signal { -// return partialVideoThumbnailData(postbox: postbox, resource: resource) -// |> take(1) -// |> mapToSignal { header, spacing, tail -> Signal in -// return Signal { subscriber in -// let source = FetchVideoThumbnailSource(header: header, spacing: spacing, tail: tail) -// guard let (frame, rotationAngle, aspect) = source.readFrame() else { -// subscriber.putNext(nil) -// subscriber.putCompletion() -// return EmptyDisposable -// } -// guard let image = imageFromSampleBuffer(sampleBuffer: frame.sampleBuffer) else { -// subscriber.putNext(nil) -// subscriber.putCompletion() -// return EmptyDisposable -// } -// guard let data = UIImageJPEGRepresentation(image, 0.7) else { -// subscriber.putNext(nil) -// subscriber.putCompletion() -// return EmptyDisposable -// } -// subscriber.putNext(data) -// subscriber.putCompletion() -// return EmptyDisposable -// } -// } -// /*return Signal { subscriber in -// let impl = FetchVideoThumbnailSourceThreadImpl() -// let thread = Thread(target: impl, selector: #selector(impl.entryPoint), object: nil) -// thread.name = "fetchPartialVideoThumbnail" -// impl.perform(#selector(impl.fetch(_:)), on: thread, with: FetchVideoThumbnailSourceParameters(), waitUntilDone: false) -// thread.start() -// -// return ActionDisposable { -// impl.perform(#selector(impl.dispose), on: thread, with: nil, waitUntilDone: false) -// } -// }*/ -//} -// -//func fetchedStreamingVideoThumbnail(postbox: Postbox, fileReference: FileMediaReference) -> Signal { -// return Signal { subscriber in -// let resourceReference = fileReference.resourceReference(fileReference.media.resource) -// guard let size = resourceReference.resource.size else { -// subscriber.putCompletion() -// return EmptyDisposable -// } -// let impl = FetchVideoThumbnailSourceThreadImpl() -// let thread = Thread(target: impl, selector: #selector(impl.entryPoint), object: nil) -// thread.name = "fetchedStreamingVideoThumbnail" -// impl.perform(#selector(impl.fetch(_:)), on: thread, with: FetchVideoThumbnailSourceParameters(mediaBox: postbox.mediaBox, resourceReference: resourceReference, size: Int32(size)), waitUntilDone: false) -// thread.start() -// -// return ActionDisposable { -// impl.perform(#selector(impl.dispose), on: thread, with: nil, waitUntilDone: false) -// } -// } -//} -// -////func streamingVideoThumbnail(postbox: Postbox, fileReference: FileMediaReference) -> Signal { -//// return Signal { subscriber in -//// let impl = FetchVideoThumbnailSourceThreadImpl() -//// let thread = Thread(target: impl, selector: #selector(impl.entryPoint), object: nil) -//// thread.name = "streamingVideoThumbnail" -//// impl.perform(#selector(impl.fetch(_:)), on: thread, with: FetchVideoThumbnailSourceParameters(), waitUntilDone: false) -//// thread.start() -//// -//// return ActionDisposable { -//// impl.perform(#selector(impl.dispose), on: thread, with: nil, waitUntilDone: false) -//// } -//// } -////} -*/ diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index 0a16d86dd7..2eaeceb1b5 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -367,7 +367,18 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool { return nil })) case let .theme(media): - let controller = ThemePreviewController(context: params.context, previewTheme: makeDefaultDayPresentationTheme(accentColor: nil, serviceBackgroundColor: .black, baseColor: nil, day: true, preview: false), source: .media(.message(message: MessageReference(params.message), media: media))) + let path = params.context.account.postbox.mediaBox.completedResourcePath(media.resource) + var previewTheme: PresentationTheme? + if let path = path, let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { + let startTime = CACurrentMediaTime() + previewTheme = makePresentationTheme(data: data) + print("time \(CACurrentMediaTime() - startTime)") + } + + guard let theme = previewTheme else { + return false + } + let controller = ThemePreviewController(context: params.context, previewTheme: theme, source: .media(.message(message: MessageReference(params.message), media: media))) params.present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) } } @@ -445,3 +456,20 @@ func openChatWallpaper(context: AccountContext, message: Message, present: @esca } } } + +func openChatTheme(context: AccountContext, message: Message, present: @escaping (ViewController, Any?) -> Void) { + for media in message.media { + if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content { + let _ = (context.sharedContext.resolveUrl(account: context.account, url: content.url) + |> deliverOnMainQueue).start(next: { resolvedUrl in + if case let .theme(slug) = resolvedUrl { + let file = content.files!.first! + if let path = context.account.postbox.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let theme = makePresentationTheme(data: data) { + let controller = ThemePreviewController(context: context, previewTheme: theme, source: .slug(slug, file)) + present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + } + } + }) + } + } +} diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index 30bc71d58a..b247f22f96 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -239,17 +239,50 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur dismissInput() case let .theme(slug): let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let signal = getTheme(account: context.account, slug: slug) + |> mapToSignal { themeInfo -> Signal<(Data, TelegramTheme), GetThemeError> in + return Signal<(Data, TelegramTheme), GetThemeError> { subscriber in + let disposables = DisposableSet() + let mediaBox = context.sharedContext.accountManager.mediaBox + let resource = themeInfo.file.resource + + disposables.add(fetchedMediaResource(mediaBox: mediaBox, reference: .standalone(resource: resource)).start()) + + let maybeFetched = mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) + |> take(1) + |> mapToSignal { maybeData -> Signal in + if maybeData.complete { + let loadedData = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) + return .single(loadedData) + } else { + return mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) + |> map { next -> Data? in + return next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) + } + } + } + + disposables.add(maybeFetched.start(next: { data in + if let data = data { + subscriber.putNext((data, themeInfo)) + subscriber.putCompletion() + } + })) + + return disposables + } + } let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) present(controller, nil) let _ = (signal - |> deliverOnMainQueue).start(next: { [weak controller] theme in + |> deliverOnMainQueue).start(next: { [weak controller] dataAndTheme in controller?.dismiss() - let previewTheme = makePresentationTheme(themeReference: .cloud(theme), accentColor: nil, serviceBackgroundColor: .black, baseColor: nil) - let previewController = ThemePreviewController(context: context, previewTheme: previewTheme, source: .theme(theme)) - present(previewController, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + + if let theme = makePresentationTheme(data: dataAndTheme.0) { + let previewController = ThemePreviewController(context: context, previewTheme: theme, source: .theme(dataAndTheme.1)) + present(previewController, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + } }, error: { [weak controller] error in controller?.dismiss() }) diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift index 76554ee22c..ae65391e47 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift @@ -81,6 +81,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu }, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in + }, openTheme: {_ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index 4702f224f8..27cd58847a 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -210,6 +210,7 @@ public class PeerMediaCollectionController: TelegramBaseController { self?.present(c, in: .window(.root), with: a, blockInteraction: true) }) } + }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 15581c43547a9ecd589f3acd25f4d61ad96340c7..6309b3c6811fbdb03e74f2aaa510fd2d52d87e96 100644 GIT binary patch delta 34319 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 delta 33704 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 YcGl|bDWajGq&ev@qn;))^;Z1<09IvE5C8xG diff --git a/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift b/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift index c3c08e9415..ead9c783c1 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift +++ b/submodules/TelegramUI/TelegramUI/TelegramAccountAuxiliaryMethods.swift @@ -36,8 +36,6 @@ public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(updatePeerC return fetchOpenInAppIconResource(resource: resource) } else if let resource = resource as? EmojiSpriteResource { return fetchEmojiSpriteResource(postbox: account.postbox, network: account.network, resource: resource) - } else if let resource = resource as? LocalBundleResource { - return fetchLocalBundleResource(postbox: account.postbox, resource: resource) } return nil }, fetchResourceMediaReferenceHash: { resource in diff --git a/submodules/TelegramUI/TelegramUI/WallpaperPreviewMedia.swift b/submodules/TelegramUI/TelegramUI/WallpaperPreviewMedia.swift index 9f05bb490b..79a24beea2 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperPreviewMedia.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperPreviewMedia.swift @@ -4,7 +4,7 @@ import Postbox import TelegramCore enum WallpaperPreviewMediaContent: Equatable { - case file(TelegramMediaFile, UIColor?) + case file(TelegramMediaFile, UIColor?, Bool) case color(UIColor) } diff --git a/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift b/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift index c573482058..941a8337be 100644 --- a/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift @@ -111,6 +111,8 @@ final class WebpagePreviewAccessoryPanelNode: AccessoryPanelNode { if let file = content.file, let mediaKind = mediaContentKind(file) { if content.type == "telegram_background" { text = strings.Message_Wallpaper + } else if content.type == "telegram_theme" { + text = strings.Message_Wallpaper } else { text = stringForMediaKind(mediaKind, strings: self.strings).0 } diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index 994c9fab79..3e323db2ee 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -29,7 +29,6 @@ 094735162275D72100EA2312 /* anim_unmute.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350C2275D72100EA2312 /* anim_unmute.json */; }; 094735172275D72100EA2312 /* anim_pin.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350D2275D72100EA2312 /* anim_pin.json */; }; 094735192277483C00EA2312 /* anim_infotip.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735182277483B00EA2312 /* anim_infotip.json */; }; - 09510B0F22F9347E0078CAB7 /* BundleResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09510B0E22F9347E0078CAB7 /* BundleResource.swift */; }; 09510B1322F96E5B0078CAB7 /* ChatScheduleTimeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09510B1222F96E5B0078CAB7 /* ChatScheduleTimeController.swift */; }; 09510B1522F96E6C0078CAB7 /* ChatScheduleTimeControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09510B1422F96E6C0078CAB7 /* ChatScheduleTimeControllerNode.swift */; }; 0962E67921B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67821B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift */; }; @@ -47,6 +46,7 @@ 099529B421D3E5D800805E13 /* CheckDiskSpace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529B321D3E5D800805E13 /* CheckDiskSpace.swift */; }; 09A218D9229EE1B600DE6898 /* HorizontalStickerGridItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A218D7229EE1B500DE6898 /* HorizontalStickerGridItem.swift */; }; 09A218DA229EE1B600DE6898 /* HorizontalStickersChatContextPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A218D8229EE1B500DE6898 /* HorizontalStickersChatContextPanelNode.swift */; }; + 09B4A9BA231519CD005C2E08 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09B4A9B9231519CD005C2E08 /* VideoToolbox.framework */; }; 09CE95002232729A00A7D2C3 /* StickerPaneSearchContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE94FF2232729A00A7D2C3 /* StickerPaneSearchContentNode.swift */; }; 09CE9502223272B700A7D2C3 /* GifPaneSearchContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CE9501223272B700A7D2C3 /* GifPaneSearchContentNode.swift */; }; 09D304152173C0E900C00567 /* WatchManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D304142173C0E900C00567 /* WatchManager.swift */; }; @@ -83,7 +83,6 @@ D0192D44210A5AA50005FA10 /* DeviceContactDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0192D43210A5AA50005FA10 /* DeviceContactDataManager.swift */; }; D01C06B51FBB7720001561AB /* ChatMediaInputSettingsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C06B41FBB7720001561AB /* ChatMediaInputSettingsItem.swift */; }; D01DBA9B209CC6AD00C64E64 /* ChatLinkPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01DBA9A209CC6AD00C64E64 /* ChatLinkPreview.swift */; }; - D01FB437217CEC62009C6134 /* FetchVideoThumbnail.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01FB436217CEC62009C6134 /* FetchVideoThumbnail.swift */; }; D020A9DA1FEAE675008C66F7 /* OverlayAudioPlayerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020A9D91FEAE675008C66F7 /* OverlayAudioPlayerController.swift */; }; D020A9DC1FEAE6E7008C66F7 /* OverlayPlayerControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020A9DB1FEAE6E7008C66F7 /* OverlayPlayerControllerNode.swift */; }; D025402522E1E00100AC0195 /* ChatSlowmodeHintController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D025402422E1E00100AC0195 /* ChatSlowmodeHintController.swift */; }; @@ -595,7 +594,6 @@ 0947350C2275D72100EA2312 /* anim_unmute.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_unmute.json; sourceTree = ""; }; 0947350D2275D72100EA2312 /* anim_pin.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_pin.json; sourceTree = ""; }; 094735182277483B00EA2312 /* anim_infotip.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_infotip.json; sourceTree = ""; }; - 09510B0E22F9347E0078CAB7 /* BundleResource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleResource.swift; sourceTree = ""; }; 09510B1222F96E5B0078CAB7 /* ChatScheduleTimeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatScheduleTimeController.swift; sourceTree = ""; }; 09510B1422F96E6C0078CAB7 /* ChatScheduleTimeControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatScheduleTimeControllerNode.swift; sourceTree = ""; }; 0962E67821B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageAnimatedStickerItemNode.swift; sourceTree = ""; }; @@ -613,6 +611,7 @@ 099529B321D3E5D800805E13 /* CheckDiskSpace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckDiskSpace.swift; sourceTree = ""; }; 09A218D7229EE1B500DE6898 /* HorizontalStickerGridItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalStickerGridItem.swift; sourceTree = ""; }; 09A218D8229EE1B500DE6898 /* HorizontalStickersChatContextPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalStickersChatContextPanelNode.swift; sourceTree = ""; }; + 09B4A9B9231519CD005C2E08 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; 09CE94FF2232729A00A7D2C3 /* StickerPaneSearchContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerPaneSearchContentNode.swift; sourceTree = ""; }; 09CE9501223272B700A7D2C3 /* GifPaneSearchContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GifPaneSearchContentNode.swift; sourceTree = ""; }; 09D304142173C0E900C00567 /* WatchManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchManager.swift; sourceTree = ""; }; @@ -670,7 +669,6 @@ D01C2AA01E758F90001F6F9A /* NavigateToChatController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigateToChatController.swift; sourceTree = ""; }; D01DBA9A209CC6AD00C64E64 /* ChatLinkPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatLinkPreview.swift; sourceTree = ""; }; D01F66121DE8903300345CBE /* ChatTextInputMediaRecordingButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatTextInputMediaRecordingButton.swift; sourceTree = ""; }; - D01FB436217CEC62009C6134 /* FetchVideoThumbnail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchVideoThumbnail.swift; sourceTree = ""; }; D020A9D91FEAE675008C66F7 /* OverlayAudioPlayerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayAudioPlayerController.swift; sourceTree = ""; }; D020A9DB1FEAE6E7008C66F7 /* OverlayPlayerControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayPlayerControllerNode.swift; sourceTree = ""; }; D021E0CD1DB4135500C6B04F /* ChatMediaInputNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputNode.swift; sourceTree = ""; }; @@ -1169,6 +1167,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 09B4A9BA231519CD005C2E08 /* VideoToolbox.framework in Frameworks */, D03E495D230868DF0049C28B /* PersistentStringHash.framework in Frameworks */, D03E493C2308679D0049C28B /* InstantPageCache.framework in Frameworks */, D03E4910230866280049C28B /* GridMessageSelectionNode.framework in Frameworks */, @@ -1773,6 +1772,7 @@ D08D45281D5E340200A7428A /* Frameworks */ = { isa = PBXGroup; children = ( + 09B4A9B9231519CD005C2E08 /* VideoToolbox.framework */, D03E495C230868DF0049C28B /* PersistentStringHash.framework */, D03E493B2308679D0049C28B /* InstantPageCache.framework */, D03E490F230866280049C28B /* GridMessageSelectionNode.framework */, @@ -2553,10 +2553,8 @@ D0F3A8B51E83120A00B4C64C /* FetchResource.swift */, D0F3A8B91E831E6300B4C64C /* FetchVideoMediaResource.swift */, D007019D2029EFDD006B9E34 /* ICloudResources.swift */, - D01FB436217CEC62009C6134 /* FetchVideoThumbnail.swift */, D0CCD61A222E8B4500EE1E08 /* TimeBasedVideoPreload.swift */, 09E2D9F0226F214000EA0AA4 /* EmojiResources.swift */, - 09510B0E22F9347E0078CAB7 /* BundleResource.swift */, ); name = Resources; sourceTree = ""; @@ -2857,7 +2855,6 @@ D0EC6D291EB9F58800EBF1C3 /* FetchVideoMediaResource.swift in Sources */, 099529B421D3E5D800805E13 /* CheckDiskSpace.swift in Sources */, D0EC6D2B1EB9F58800EBF1C3 /* FileMediaResourceStatus.swift in Sources */, - 09510B0F22F9347E0078CAB7 /* BundleResource.swift in Sources */, D025402522E1E00100AC0195 /* ChatSlowmodeHintController.swift in Sources */, D0EC6D301EB9F58800EBF1C3 /* RadialProgressNode.swift in Sources */, D0EC6D311EB9F58800EBF1C3 /* RadialTimeoutNode.swift in Sources */, @@ -3100,7 +3097,6 @@ D0EC6E581EB9F58900EBF1C3 /* PeerSelectionController.swift in Sources */, D0EC6E591EB9F58900EBF1C3 /* PeerSelectionControllerNode.swift in Sources */, D0AB262921C307D7008F6685 /* ChatMessagePollBubbleContentNode.swift in Sources */, - D01FB437217CEC62009C6134 /* FetchVideoThumbnail.swift in Sources */, D0B85C231FF70BF400E795B4 /* AuthorizationSequenceAwaitingAccountResetController.swift in Sources */, D0C0B5B11EE1C421000F4D2C /* ChatDateSelectionSheet.swift in Sources */, D025A4261F79428E00563950 /* FetchManagerLocation.swift in Sources */, diff --git a/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift b/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift index ad84018836..eceae3dba9 100644 --- a/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift +++ b/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift @@ -64,10 +64,12 @@ private enum ApplicationSpecificOrderedItemListCollectionIdValues: Int32 { case webSearchRecentQueries = 0 case wallpaperSearchRecentQueries = 1 case settingsSearchRecentItems = 2 + case localThemes = 3 } public struct ApplicationSpecificOrderedItemListCollectionId { public static let webSearchRecentQueries = applicationSpecificOrderedItemListCollectionId(ApplicationSpecificOrderedItemListCollectionIdValues.webSearchRecentQueries.rawValue) public static let wallpaperSearchRecentQueries = applicationSpecificOrderedItemListCollectionId(ApplicationSpecificOrderedItemListCollectionIdValues.wallpaperSearchRecentQueries.rawValue) public static let settingsSearchRecentItems = applicationSpecificOrderedItemListCollectionId(ApplicationSpecificOrderedItemListCollectionIdValues.settingsSearchRecentItems.rawValue) + public static let localThemes = applicationSpecificOrderedItemListCollectionId(ApplicationSpecificOrderedItemListCollectionIdValues.localThemes.rawValue) } diff --git a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index 764864694d..0e48b1ffc8 100644 --- a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -26,9 +26,39 @@ public struct WallpaperPresentationOptions: OptionSet { public static let blur = WallpaperPresentationOptions(rawValue: 1 << 1) } +public struct PresentationLocalTheme: PostboxCoding, Equatable { + public let title: String + public let resource: LocalFileMediaResource + + public init(title: String, resource: LocalFileMediaResource) { + self.title = title + self.resource = resource + } + + public init(decoder: PostboxDecoder) { + self.title = decoder.decodeStringForKey("title", orElse: "") + self.resource = decoder.decodeObjectForKey("resource", decoder: { LocalFileMediaResource(decoder: $0) }) as! LocalFileMediaResource + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.title, forKey: "title") + encoder.encodeObject(self.resource, forKey: "resource") + } + + public static func ==(lhs: PresentationLocalTheme, rhs: PresentationLocalTheme) -> Bool { + if lhs.title != rhs.title { + return false + } + if !lhs.resource.isEqual(to: rhs.resource) { + return false + } + return true + } +} + public enum PresentationThemeReference: PostboxCoding, Equatable { case builtin(PresentationBuiltinThemeReference) - case local(LocalFileMediaResource) + case local(PresentationLocalTheme) case cloud(TelegramTheme) public init(decoder: PostboxDecoder) { @@ -36,7 +66,7 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { case 0: self = .builtin(PresentationBuiltinThemeReference(rawValue: decoder.decodeInt32ForKey("t", orElse: 0))!) case 1: - self = .local(decoder.decodeObjectForKey("resource", decoder: { LocalFileMediaResource(decoder: $0) }) as! LocalFileMediaResource) + self = .local(decoder.decodeObjectForKey("localTheme", decoder: { PresentationLocalTheme(decoder: $0) }) as! PresentationLocalTheme) case 2: self = .cloud(decoder.decodeObjectForKey("theme", decoder: { TelegramTheme(decoder: $0) }) as! TelegramTheme) default: @@ -50,9 +80,9 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { case let .builtin(reference): encoder.encodeInt32(0, forKey: "v") encoder.encodeInt32(reference.rawValue, forKey: "t") - case let .local(resource): + case let .local(theme): encoder.encodeInt32(1, forKey: "v") - encoder.encodeObject(resource, forKey: "resource") + encoder.encodeObject(theme, forKey: "localTheme") case let .cloud(theme): encoder.encodeInt32(2, forKey: "v") encoder.encodeObject(theme, forKey: "theme") @@ -67,8 +97,8 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { } else { return false } - case let .local(lhsResource): - if case let .local(rhsResource) = rhs, lhsResource.isEqual(to: rhsResource) { + case let .local(lhsTheme): + if case let .local(rhsTheme) = rhs, lhsTheme == rhsTheme { return true } else { return false @@ -85,16 +115,27 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { public var index: Int64 { let namespace: Int32 let id: Int32 + + func themeId(for id: Int64) -> Int32 { + var acc: UInt32 = 0 + let low = UInt32(UInt64(bitPattern: id) & (0xffffffff as UInt64)) + let high = UInt32((UInt64(bitPattern: id) >> 32) & (0xffffffff as UInt64)) + acc = (acc &* 20261) &+ high + acc = (acc &* 20261) &+ low + + return Int32(bitPattern: acc & UInt32(0x7FFFFFFF)) + } + switch self { case let .builtin(reference): namespace = 0 id = reference.rawValue - case let .local(resource): + case let .local(theme): namespace = 1 - id = 1//1reference.rawValue + id = themeId(for: theme.resource.fileId) case let .cloud(theme): namespace = 2 - id = Int32(clamping: theme.id) + id = themeId(for: theme.id) } return (Int64(namespace) << 32) | Int64(bitPattern: UInt64(UInt32(bitPattern: id))) @@ -335,8 +376,8 @@ public struct PresentationThemeSettings: PreferencesEntry { switch self.theme { case .builtin: break - case let .local(resource): - resources.append(resource.id) + case let .local(theme): + resources.append(theme.resource.id) case let .cloud(theme): resources.append(theme.file.resource.id) } diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index 1ba9d78e9b..18f4224b8a 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -9,6 +9,7 @@ import ImageBlur import TinyThumbnail import PhotoResources import LocalMediaResources +import TelegramPresentationData private func wallpaperDatas(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(Data?, Data?, Bool), NoError> { if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) { @@ -586,3 +587,129 @@ public func photoWallpaper(postbox: Postbox, photoLibraryResource: PhotoLibraryM } } } + +public func telegramThemeData(account: Account, accountManager: AccountManager, resource: MediaResource, synchronousLoad: Bool) -> Signal { + let maybeFetched = accountManager.mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: synchronousLoad) + return maybeFetched + |> take(1) + |> mapToSignal { maybeData in + if maybeData.complete { + let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) + return .single(loadedData) + } else { + let data = account.postbox.mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) + return Signal { subscriber in + let fetch = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .standalone(resource: resource)).start() + let disposable = (data + |> map { data -> Data? in + return data.complete ? try? Data(contentsOf: URL(fileURLWithPath: data.path)) : nil + }).start(next: { next in + if let data = next { + accountManager.mediaBox.storeResourceData(resource.id, data: data) + } + subscriber.putNext(next) + }, error: { error in + subscriber.putError(error) + }, completed: { + subscriber.putCompletion() + }) + return ActionDisposable { + fetch.dispose() + disposable.dispose() + } + } + } + } +} + +private func generateBackArrowImage(color: UIColor) -> UIImage? { + return generateImage(CGSize(width: 13.0, height: 22.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(color.cgColor) + + context.translateBy(x: 0.0, y: -UIScreenPixel) + + let _ = try? drawSvgPath(context, path: "M3.60751322,11.5 L11.5468531,3.56066017 C12.1326395,2.97487373 12.1326395,2.02512627 11.5468531,1.43933983 C10.9610666,0.853553391 10.0113191,0.853553391 9.42553271,1.43933983 L0.449102936,10.4157696 C-0.149700979,11.0145735 -0.149700979,11.9854265 0.449102936,12.5842304 L9.42553271,21.5606602 C10.0113191,22.1464466 10.9610666,22.1464466 11.5468531,21.5606602 C12.1326395,20.9748737 12.1326395,20.0251263 11.5468531,19.4393398 L3.60751322,11.5 Z ") + }) +} + +public func themeImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + + return telegramThemeData(account: account, accountManager: accountManager, resource: fileReference.media.resource, synchronousLoad: synchronousLoad) + |> map { data in + let theme: PresentationTheme? + if let data = data { + theme = makePresentationTheme(data: data) + } else { + theme = nil + } + + return { arguments in + let context = DrawingContext(size: arguments.drawingSize, scale: 0.0, clear: true) + + let drawingRect = arguments.drawingRect + + context.withFlippedContext { c in + c.setBlendMode(.normal) + + if let theme = theme { + if case let .color(value) = theme.chat.defaultWallpaper { + c.setFillColor(UIColor(rgb: UInt32(bitPattern: value)).cgColor) + } else { + c.setFillColor(theme.chatList.backgroundColor.cgColor) + } + c.fill(drawingRect) + + c.setFillColor(theme.rootController.navigationBar.backgroundColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 0.0, y: drawingRect.height - 42.0), size: CGSize(width: drawingRect.width, height: 42.0))) + + c.setFillColor(theme.rootController.navigationBar.separatorColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 0.0, y: drawingRect.height - 43.0), size: CGSize(width: drawingRect.width, height: 1.0))) + + c.setFillColor(theme.rootController.navigationBar.secondaryTextColor.cgColor) + c.fillEllipse(in: CGRect(origin: CGPoint(x: drawingRect.width - 28.0 - 7.0, y: drawingRect.height - 7.0 - 28.0 - UIScreenPixel), size: CGSize(width: 28.0, height: 28.0))) + + if let arrow = generateBackArrowImage(color: theme.rootController.navigationBar.buttonColor), let image = arrow.cgImage { + c.draw(image, in: CGRect(x: 9.0, y: drawingRect.height - 11.0 - 22.0 + UIScreenPixel, width: 13.0, height: 22.0)) + } + c.setFillColor(theme.chat.inputPanel.panelBackgroundColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: drawingRect.width, height: 42.0))) + + c.setFillColor(theme.chat.inputPanel.panelSeparatorColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 0.0, y: 42.0), size: CGSize(width: drawingRect.width, height: 1.0))) + + c.setFillColor(theme.chat.inputPanel.inputBackgroundColor.cgColor) + c.setStrokeColor(theme.chat.inputPanel.inputStrokeColor.cgColor) + + c.setLineWidth(1.0) + let path = UIBezierPath(roundedRect: CGRect(x: 34.0, y: 6.0, width: drawingRect.width - 34.0 * 2.0, height: 31.0), cornerRadius: 15.5) + c.addPath(path.cgPath) + c.drawPath(using: .fillStroke) + + if let attachment = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/IconAttachment"), color: theme.chat.inputPanel.panelControlColor), let image = attachment.cgImage { + c.draw(image, in: CGRect(origin: CGPoint(x: 3.0, y: 6.0 + UIScreenPixel), size: attachment.size.fitted(CGSize(width: 30.0, height: 30.0)))) + } + + if let microphone = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/IconMicrophone"), color: theme.chat.inputPanel.panelControlColor), let image = microphone.cgImage { + c.draw(image, in: CGRect(origin: CGPoint(x: drawingRect.width - 3.0 - 29.0, y: 7.0 + UIScreenPixel), size: microphone.size.fitted(CGSize(width: 30.0, height: 30.0)))) + } + } else if let emptyColor = arguments.emptyColor { + c.setFillColor(emptyColor.cgColor) + c.fill(drawingRect) + } + + if let emptyColor = arguments.emptyColor?.withAlphaComponent(1.0) { + c.setStrokeColor(emptyColor.cgColor) + c.setLineWidth(2.0) + let borderPath = UIBezierPath(roundedRect: drawingRect, cornerRadius: 4.0) + c.addPath(borderPath.cgPath) + c.drawPath(using: .stroke) + } + } + + addCorners(context, arguments: arguments) + + return context + } + } +} diff --git a/submodules/libtgvoip/libtgvoip_Xcode.xcodeproj/project.pbxproj b/submodules/libtgvoip/libtgvoip_Xcode.xcodeproj/project.pbxproj index 9ad7eb16dc..8b33ae584f 100644 --- a/submodules/libtgvoip/libtgvoip_Xcode.xcodeproj/project.pbxproj +++ b/submodules/libtgvoip/libtgvoip_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 09B4A9BC23151A40005C2E08 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09B4A9BB23151A3F005C2E08 /* VideoToolbox.framework */; }; 69015D941E9D848700AC9763 /* NetworkSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69015D921E9D848700AC9763 /* NetworkSocket.cpp */; }; 6915307B1E6B5BAB004F643F /* logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6915307A1E6B5BAB004F643F /* logging.cpp */; }; 6929CD102233ED81009B7378 /* PrivateDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 6929CD0F2233ED81009B7378 /* PrivateDefines.h */; }; @@ -381,6 +382,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 09B4A9BB23151A3F005C2E08 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; 69015D921E9D848700AC9763 /* NetworkSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkSocket.cpp; sourceTree = ""; }; 69015D931E9D848700AC9763 /* NetworkSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkSocket.h; sourceTree = ""; }; 6915307A1E6B5BAB004F643F /* logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logging.cpp; sourceTree = ""; }; @@ -1057,6 +1059,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 09B4A9BC23151A40005C2E08 /* VideoToolbox.framework in Frameworks */, 692AB91F1E675F7000706ACC /* AudioToolbox.framework in Frameworks */, 692AB9201E675F7000706ACC /* AudioUnit.framework in Frameworks */, 692AB9211E675F7000706ACC /* CoreAudio.framework in Frameworks */, @@ -1172,6 +1175,7 @@ 692AB9061E675E8700706ACC /* Frameworks */ = { isa = PBXGroup; children = ( + 09B4A9BB23151A3F005C2E08 /* VideoToolbox.framework */, 692AB91C1E675F7000706ACC /* AudioToolbox.framework */, 692AB91D1E675F7000706ACC /* AudioUnit.framework */, 692AB91E1E675F7000706ACC /* CoreAudio.framework */, @@ -2415,6 +2419,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = 69F8422C1E67540700C110F7; From 819b608ec8471cdf602dde2cad620ea5797c64b0 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 27 Aug 2019 23:01:33 +0400 Subject: [PATCH 40/86] Adjust context menu blur --- .../ContextUI/Sources/ContextController.swift | 42 ++++++++++--------- submodules/Display/Display/UIKitUtils.m | 10 ++++- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 37efed99fa..19933b15c8 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -7,6 +7,8 @@ import TextSelectionNode import ReactionSelectionNode import TelegramCore +private let animationDurationFactor: Double = 1.0 + public enum ContextMenuActionItemTextLayout { case singleLine case twoLinesMax @@ -282,7 +284,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } strongSelf.originalProjectedContentViewFrame = (parentSupernode.view.convert(contentParentNode.frame, to: strongSelf.view), contentParentNode.view.convert(contentParentNode.contentRect, to: strongSelf.view)) if let validLayout = strongSelf.validLayout { - strongSelf.updateLayout(layout: validLayout, transition: .animated(duration: 0.2, curve: .easeInOut), previousActionsContainerNode: nil) + strongSelf.updateLayout(layout: validLayout, transition: .animated(duration: 0.2 * animationDurationFactor, curve: .easeInOut), previousActionsContainerNode: nil) } } takenViewInfo.contentContainingNode.updateDistractionFreeMode = { [weak self] value in @@ -293,14 +295,14 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if !reactionContextNode.alpha.isZero { reactionContextNode.alpha = 0.0 reactionContextNode.allowsGroupOpacity = true - reactionContextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, completion: { [weak reactionContextNode] _ in + reactionContextNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3 * animationDurationFactor, completion: { [weak reactionContextNode] _ in reactionContextNode?.allowsGroupOpacity = false }) } } else if reactionContextNode.alpha != 1.0 { reactionContextNode.alpha = 1.0 reactionContextNode.allowsGroupOpacity = true - reactionContextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, completion: { [weak reactionContextNode] _ in + reactionContextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3 * animationDurationFactor, completion: { [weak reactionContextNode] _ in reactionContextNode?.allowsGroupOpacity = false }) } @@ -313,8 +315,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi self.originalProjectedContentViewFrame = (parentSupernode.view.convert(takenViewInfo.contentContainingNode.frame, to: self.view), takenViewInfo.contentContainingNode.view.convert(takenViewInfo.contentContainingNode.contentRect, to: self.view)) - self.clippingNode.layer.animateFrame(from: takenViewInfo.contentAreaInScreenSpace, to: self.clippingNode.frame, duration: 0.18, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) - self.clippingNode.layer.animateBoundsOriginYAdditive(from: takenViewInfo.contentAreaInScreenSpace.minY, to: 0.0, duration: 0.18, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + self.clippingNode.layer.animateFrame(from: takenViewInfo.contentAreaInScreenSpace, to: self.clippingNode.frame, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + self.clippingNode.layer.animateBoundsOriginYAdditive(from: takenViewInfo.contentAreaInScreenSpace.minY, to: 0.0, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) } if let validLayout = self.validLayout { @@ -322,10 +324,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } self.dimNode.alpha = 1.0 - self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor) if let _ = self.propertyAnimator { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { - self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.25, from: 0.0, to: 1.0, update: { [weak self] value in + self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.25 * animationDurationFactor, from: 0.0, to: 1.0, update: { [weak self] value in (self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value }, completion: { [weak self] in self?.didCompleteAnimationIn = true @@ -333,15 +335,15 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi }) } } else { - UIView.animate(withDuration: 0.2, animations: { + UIView.animate(withDuration: 0.2 * animationDurationFactor, animations: { self.effectView.effect = makeCustomZoomBlurEffect() }, completion: { [weak self] _ in self?.didCompleteAnimationIn = true }) } - self.actionsContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.actionsContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor) - let springDuration: Double = 0.42 + let springDuration: Double = 0.42 * animationDurationFactor let springDamping: CGFloat = 104.0 self.actionsContainerNode.layer.animateSpring(from: 0.1 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping) if let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode { @@ -371,8 +373,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let putBackInfo = putBackInfo, let contentParentNode = self.contentParentNode, let parentSupernode = contentParentNode.supernode { self.originalProjectedContentViewFrame = (parentSupernode.view.convert(contentParentNode.frame, to: self.view), contentParentNode.view.convert(contentParentNode.contentRect, to: self.view)) - self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: putBackInfo.contentAreaInScreenSpace, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) - self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: putBackInfo.contentAreaInScreenSpace.minY, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) + self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: putBackInfo.contentAreaInScreenSpace, duration: 0.2 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) + self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: putBackInfo.contentAreaInScreenSpace.minY, duration: 0.2 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) } let contentParentNode = self.contentParentNode @@ -398,7 +400,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let propertyAnimator = self.propertyAnimator { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { - self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2, from: (propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete ?? 0.2, to: 0.0, update: { [weak self] value in + self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor, from: (propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete ?? 0.2, to: 0.0, update: { [weak self] value in (self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value }, completion: { [weak self] in self?.effectView.isHidden = true @@ -407,7 +409,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi }) } } else { - UIView.animate(withDuration: 0.2, animations: { + UIView.animate(withDuration: 0.21 * animationDurationFactor, animations: { if #available(iOS 9.0, *) { self.effectView.effect = nil } else { @@ -419,17 +421,17 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi }) } - self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) - self.actionsContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in + self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false) + self.actionsContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in completedActionsNode = true intermediateCompletion() }) - self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: 0.2, removeOnCompletion: false) + self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: 0.2 * animationDurationFactor, removeOnCompletion: false) if case .default = result, let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode { let localSourceFrame = self.view.convert(originalProjectedContentViewFrame.1, to: self.scrollNode.view) - self.actionsContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y), duration: 0.2, removeOnCompletion: false, additive: true) + self.actionsContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y), duration: 0.2 * animationDurationFactor, removeOnCompletion: false, additive: true) let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y - contentParentNode.contentRect.minY) - self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: contentContainerOffset, duration: 0.2, removeOnCompletion: false, additive: true, completion: { _ in + self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: contentContainerOffset, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, additive: true, completion: { _ in completedContentNode = true intermediateCompletion() }) @@ -448,7 +450,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi contentParentNode.isExtractedToContextPreview = false contentParentNode.isExtractedToContextPreviewUpdated?(false) - self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in + self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in completedContentNode = true intermediateCompletion() }) diff --git a/submodules/Display/Display/UIKitUtils.m b/submodules/Display/Display/UIKitUtils.m index 14f981b2a8..15f54b3b95 100644 --- a/submodules/Display/Display/UIKitUtils.m +++ b/submodules/Display/Display/UIKitUtils.m @@ -114,16 +114,22 @@ void testZoomBlurEffect(UIVisualEffect *effect) { } UIBlurEffect *makeCustomZoomBlurEffect() { + //return [UIBlurEffect effectWithStyle:UIBlurEffectStyleRegular]; + NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; CustomBlurEffect *result = (CustomBlurEffect *)[NSClassFromString(string) effectWithStyle:0]; - result.blurRadius = 9.0; + result.blurRadius = 20.0; result.zoom = 0.015; result.colorTint = nil; result.colorTintAlpha = 0.0; result.darkeningTintAlpha = 0.0; result.grayscaleTintAlpha = 0.0; result.saturationDeltaFactor = 1.0; - result.scale = 0.5; + /*if ([UIScreen mainScreen].scale > 2.5f) { + result.scale = 0.25; + } else { + result.scale = 0.5; + }*/ return result; } From c729e5d18f8f7e945a56a36ed72d9e1965a2dc96 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 27 Aug 2019 23:16:31 +0400 Subject: [PATCH 41/86] Fix mute icon alignment --- submodules/ChatListUI/Sources/Node/ChatListItem.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index 129717df82..093efb130d 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1331,7 +1331,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { if let currentMutedIconImage = currentMutedIconImage { strongSelf.mutedIconNode.image = currentMutedIconImage strongSelf.mutedIconNode.isHidden = false - transition.updateFrame(node: strongSelf.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin, y: contentRect.origin.y + 5.0), size: currentMutedIconImage.size)) + transition.updateFrame(node: strongSelf.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 6.0, y: contentRect.origin.y - 1.0), size: currentMutedIconImage.size)) nextTitleIconOrigin += currentMutedIconImage.size.width + 3.0 } else { strongSelf.mutedIconNode.image = nil @@ -1569,7 +1569,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } let mutedIconFrame = self.mutedIconNode.frame - transition.updateFrame(node: self.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin, y: contentRect.origin.y + 5.0), size: mutedIconFrame.size)) + transition.updateFrame(node: self.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 6.0, y: contentRect.origin.y - 1.0), size: mutedIconFrame.size)) nextTitleIconOrigin += mutedIconFrame.size.width + 3.0 let badgeFrame = self.badgeNode.frame From 7b4e5a14d36879ae131dcb80e5624cc9708583e4 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 27 Aug 2019 23:19:47 +0400 Subject: [PATCH 42/86] Adjust blur radius --- submodules/Display/Display/UIKitUtils.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/Display/Display/UIKitUtils.m b/submodules/Display/Display/UIKitUtils.m index 15f54b3b95..ddd3184b6b 100644 --- a/submodules/Display/Display/UIKitUtils.m +++ b/submodules/Display/Display/UIKitUtils.m @@ -118,7 +118,7 @@ UIBlurEffect *makeCustomZoomBlurEffect() { NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; CustomBlurEffect *result = (CustomBlurEffect *)[NSClassFromString(string) effectWithStyle:0]; - result.blurRadius = 20.0; + result.blurRadius = 18.0; result.zoom = 0.015; result.colorTint = nil; result.colorTintAlpha = 0.0; From b61e442d065dbcdf20cd8b3973a2230b737b19b3 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 00:30:05 +0300 Subject: [PATCH 43/86] Fix build --- .../ChatListUI/Sources/Node/ChatListItem.swift | 3 +-- submodules/SettingsUI/Sources/DebugController.swift | 13 +++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index 250bcaf62a..b31dd70383 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1329,7 +1329,6 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { if let currentMutedIconImage = currentMutedIconImage { strongSelf.mutedIconNode.image = currentMutedIconImage strongSelf.mutedIconNode.isHidden = false - transition.updateFrame(node: strongSelf.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 4.0, y: contentRect.origin.y - 2.0), size: currentMutedIconImage.size)) nextTitleIconOrigin += currentMutedIconImage.size.width + 1.0 } else { @@ -1568,7 +1567,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } let mutedIconFrame = self.mutedIconNode.frame - transition.updateFrame(node: self.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 6.0, y: contentRect.origin.y - 1.0), size: mutedIconFrame.size)) + transition.updateFrame(node: self.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 4.0, y: contentRect.origin.y - 2.0), size: mutedIconFrame.size)) nextTitleIconOrigin += mutedIconFrame.size.width + 3.0 let badgeFrame = self.badgeNode.frame diff --git a/submodules/SettingsUI/Sources/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift index b7a0f60284..bebb164068 100644 --- a/submodules/SettingsUI/Sources/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -144,6 +144,10 @@ private enum DebugControllerEntry: ItemListNodeEntry { return ItemListDisclosureItem(theme: theme, title: "Send Logs", label: "", sectionId: self.section, style: .blocks, action: { let _ = (Logger.shared.collectLogs() |> deliverOnMainQueue).start(next: { logs in + guard let context = arguments.context else { + return + } + let presentationData = arguments.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) @@ -153,7 +157,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { items.append(ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) + let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled])) controller.peerSelected = { [weak controller] peerId in if let strongController = controller { strongController.dismiss() @@ -253,7 +257,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { guard let context = arguments.context else { return } - let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) + let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled])) controller.peerSelected = { [weak controller] peerId in if let strongController = controller { strongController.dismiss() @@ -282,7 +286,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { items.append(ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) + let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled])) controller.peerSelected = { [weak controller] peerId in if let strongController = controller { strongController.dismiss() @@ -522,7 +526,8 @@ private func debugControllerEntries(presentationData: PresentationData, loggingS entries.append(.resetHoles(presentationData.theme)) entries.append(.optimizeDatabase(presentationData.theme)) entries.append(.photoPreview(presentationData.theme, experimentalSettings.chatListPhotos)) - + entries.append(.knockoutWallpaper(presentationData.theme, experimentalSettings.knockoutWallpaper)) + entries.append(.versionInfo(presentationData.theme)) return entries From 20ed214511767450e92fe92bb2b2aa1aa86bbe0a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 00:34:07 +0300 Subject: [PATCH 44/86] Fix builld --- .../SettingsUI/Sources/DebugController.swift | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/submodules/SettingsUI/Sources/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift index bebb164068..9c9be159f9 100644 --- a/submodules/SettingsUI/Sources/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -68,6 +68,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { case resetBiometricsData(PresentationTheme) case optimizeDatabase(PresentationTheme) case photoPreview(PresentationTheme, Bool) + case knockoutWallpaper(PresentationTheme, Bool) case versionInfo(PresentationTheme) var section: ItemListSectionId { @@ -80,7 +81,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .enableRaiseToSpeak, .keepChatNavigationStack, .skipReadHistory, .crashOnSlowQueries: return DebugControllerSection.experiments.rawValue - case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview: + case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper: return DebugControllerSection.experiments.rawValue case .versionInfo: return DebugControllerSection.info.rawValue @@ -129,8 +130,10 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 18 case .photoPreview: return 19 - case .versionInfo: + case .knockoutWallpaper: return 20 + case .versionInfo: + return 21 } } @@ -208,7 +211,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { items.append(ActionSheetButtonItem(title: "Via Telegram", color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - let controller = PeerSelectionController(context: context, filter: [.onlyWriteable, .excludeDisabled]) + let controller = context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: context, filter: [.onlyWriteable, .excludeDisabled])) controller.peerSelected = { [weak controller] peerId in if let strongController = controller { strongController.dismiss() @@ -488,6 +491,16 @@ private enum DebugControllerEntry: ItemListNodeEntry { }) }).start() }) + case let .knockoutWallpaper(theme, value): + return ItemListSwitchItem(theme: theme, title: "Knockout Wallpaper", value: value, sectionId: self.section, style: .blocks, updated: { value in + let _ = arguments.sharedContext.accountManager.transaction ({ transaction in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { settings in + var settings = settings as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings + settings.knockoutWallpaper = value + return settings + }) + }).start() + }) case let .versionInfo(theme): let bundle = Bundle.main let bundleId = bundle.bundleIdentifier ?? "" From 413faaa9081812d1eaf2ac879267f51dc2f4a211 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 12:27:43 +0400 Subject: [PATCH 45/86] Disable features --- .../Sources/CreatePollController.swift | 2 +- .../Display/Display/PresentationContext.swift | 2 +- submodules/Display/Display/UIKitUtils.m | 12 ++++++------ .../ItemListUI/Sources/ItemListController.swift | 2 +- .../TelegramUI/TelegramUI/ChatController.swift | 17 +++++++++-------- .../ChatInterfaceStateNavigationButtons.swift | 4 ++-- .../TelegramUI/ChatMessageBubbleItemNode.swift | 12 ++++++------ 7 files changed, 26 insertions(+), 25 deletions(-) diff --git a/submodules/ComposePollUI/Sources/CreatePollController.swift b/submodules/ComposePollUI/Sources/CreatePollController.swift index a18cf59863..72d7283927 100644 --- a/submodules/ComposePollUI/Sources/CreatePollController.swift +++ b/submodules/ComposePollUI/Sources/CreatePollController.swift @@ -513,7 +513,7 @@ public func createPollController(context: AccountContext, peerId: PeerId, comple } } controller.isOpaqueWhenInOverlay = true - controller.isModalWhenInOverlay = true + //controller.isModalWhenInOverlay = true controller.blocksBackgroundWhenInOverlay = true controller.experimentalSnapScrollToItem = true diff --git a/submodules/Display/Display/PresentationContext.swift b/submodules/Display/Display/PresentationContext.swift index 3f81254d34..1896af3593 100644 --- a/submodules/Display/Display/PresentationContext.swift +++ b/submodules/Display/Display/PresentationContext.swift @@ -308,7 +308,7 @@ public final class PresentationContext { for (controller, _) in self.controllers.reversed() { if controller.isModalWhenInOverlay { if modalController == nil { - modalController = controller + //modalController = controller } } if topHasOpaque { diff --git a/submodules/Display/Display/UIKitUtils.m b/submodules/Display/Display/UIKitUtils.m index ddd3184b6b..aa0ac1763e 100644 --- a/submodules/Display/Display/UIKitUtils.m +++ b/submodules/Display/Display/UIKitUtils.m @@ -88,7 +88,7 @@ CGFloat springAnimationValueAt(CABasicAnimation * _Nonnull animation, CGFloat t) return [(CASpringAnimation *)animation valueAt:t]; } -@interface CustomBlurEffect : UIBlurEffect +/*@interface CustomBlurEffect : UIBlurEffect @property (nonatomic) double blurRadius; @property (nonatomic) double colorBurnTintAlpha; @@ -108,15 +108,15 @@ CGFloat springAnimationValueAt(CABasicAnimation * _Nonnull animation, CGFloat t) + (id)effectWithStyle:(long long)arg1; -@end +@end*/ void testZoomBlurEffect(UIVisualEffect *effect) { } UIBlurEffect *makeCustomZoomBlurEffect() { - //return [UIBlurEffect effectWithStyle:UIBlurEffectStyleRegular]; + return [UIBlurEffect effectWithStyle:UIBlurEffectStyleRegular]; - NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; + /*NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; CustomBlurEffect *result = (CustomBlurEffect *)[NSClassFromString(string) effectWithStyle:0]; result.blurRadius = 18.0; result.zoom = 0.015; @@ -129,7 +129,7 @@ UIBlurEffect *makeCustomZoomBlurEffect() { result.scale = 0.25; } else { result.scale = 0.5; - }*/ + } - return result; + return result;*/ } diff --git a/submodules/ItemListUI/Sources/ItemListController.swift b/submodules/ItemListUI/Sources/ItemListController.swift index 82491278b5..cddec7f95b 100644 --- a/submodules/ItemListUI/Sources/ItemListController.swift +++ b/submodules/ItemListUI/Sources/ItemListController.swift @@ -230,7 +230,7 @@ open class ItemListController: ViewController, KeyShor super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: NavigationBarTheme(rootControllerTheme: theme), strings: NavigationBarStrings(presentationStrings: strings))) self.isOpaqueWhenInOverlay = true - self.isModalWhenInOverlay = true + //self.isModalWhenInOverlay = true self.blocksBackgroundWhenInOverlay = true self.statusBar.statusBarStyle = theme.rootController.statusBarStyle.style diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 63a4ab2bd1..36788365b1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -347,7 +347,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.blocksBackgroundWhenInOverlay = true if let subject = subject, case .scheduledMessages = subject { - self.isModalWhenInOverlay = true + //self.isModalWhenInOverlay = true } self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) @@ -535,7 +535,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self, !actions.isEmpty else { return } - let reactions: [(String, String, String)] = [ + /*let reactions: [(String, String, String)] = [ ("😔", "Sad", "sad"), ("😳", "Surprised", "surprised"), ("😂", "Fun", "lol"), @@ -548,14 +548,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G ("😐", "Poker", "poker"), ("💩", "Poop", "poop"), ("😊", "Smile", "smile") - ] + ]*/ var reactionItems: [ReactionContextItem] = [] - for (value, text, name) in reactions { + /*for (value, text, name) in reactions { if let path = frameworkBundle.path(forResource: name, ofType: "tgs", inDirectory: "BuiltinReactions") { reactionItems.append(ReactionContextItem(value: value, text: text, path: path)) } - } + }*/ if Namespaces.Message.allScheduled.contains(message.id.namespace) { reactionItems = [] } @@ -4312,10 +4312,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } - if let subject = self.subject, case .scheduledMessages = subject { + /*if let subject = self.subject, case .scheduledMessages = subject { self.chatDisplayNode.animateIn() self.updateTransitionWhenPresentedAsModal?(1.0, .animated(duration: 0.5, curve: .spring)) - } + }*/ } override public func viewWillDisappear(_ animated: Bool) { @@ -7639,7 +7639,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private func openScheduledMessages() { let controller = ChatControllerImpl(context: self.context, chatLocation: self.chatLocation, subject: .scheduledMessages) - self.present(controller, in: .window(.root)) + (self.navigationController as? NavigationController)?.pushViewController(controller) + //self.present(controller, in: .window(.root)) } override public func dismiss(completion: (() -> Void)? = nil) { diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift index aee93f6cd7..c95e116af4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift @@ -47,13 +47,13 @@ func leftNavigationButtonForChatInterfaceState(_ presentationInterfaceState: Cha } } } - if let subject = subject, case .scheduledMessages = subject { + /*if let subject = subject, case .scheduledMessages = subject { if let currentButton = currentButton, currentButton.action == .dismiss { return currentButton } else { return ChatNavigationButton(action: .dismiss, buttonItem: UIBarButtonItem(title: strings.Common_Done, style: .plain, target: target, action: selector)) } - } + }*/ return nil } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 62704c2ec6..8086c07788 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -373,7 +373,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode self.tapRecognizer = recognizer self.view.addGestureRecognizer(recognizer) - /*let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:))) + let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:))) replyRecognizer.shouldBegin = { [weak self] in if let strongSelf = self, let item = strongSelf.item { if strongSelf.selectionNode != nil { @@ -395,9 +395,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } return false } - self.view.addGestureRecognizer(replyRecognizer)*/ + self.view.addGestureRecognizer(replyRecognizer) - let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil) + /*let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil) self.reactionRecognizer = reactionRecognizer reactionRecognizer.availableReactions = { [weak self] in guard let strongSelf = self, let item = strongSelf.item, !item.presentationData.isPreview && !Namespaces.Message.allScheduled.contains(item.message.id.namespace) else { @@ -542,7 +542,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } } - self.view.addGestureRecognizer(reactionRecognizer) + self.view.addGestureRecognizer(reactionRecognizer)*/ } override func asyncLayout() -> (_ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: Bool) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, Bool) -> Void) { @@ -2716,7 +2716,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } @objc func swipeToReplyGesture(_ recognizer: ChatSwipeToReplyRecognizer) { - /*switch recognizer.state { + switch recognizer.state { case .began: self.currentSwipeToReplyTranslation = 0.0 if self.swipeToReplyFeedback == nil { @@ -2775,7 +2775,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } default: break - }*/ + } } private var absoluteRect: (CGRect, CGSize)? From ed4c53fb1262edb25ad243eaa6e9a9b75c88b5cf Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 14:43:37 +0400 Subject: [PATCH 46/86] Adjust blur --- .../ContextUI/Sources/ContextController.swift | 14 +++- submodules/Display/Display/UIKitUtils.m | 81 ++++++++++++++----- 2 files changed, 71 insertions(+), 24 deletions(-) diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 19933b15c8..6e7a6cc673 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -398,16 +398,22 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } } - if let propertyAnimator = self.propertyAnimator { + if #available(iOS 10.0, *) { + self.propertyAnimator = UIViewPropertyAnimator(duration: 0.2, curve: .easeInOut, animations: { [weak self] in + self?.effectView.effect = nil + }) + } + + if let _ = self.propertyAnimator { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { - self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor, from: (propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete ?? 0.2, to: 0.0, update: { [weak self] value in + self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor, from: 0.0, to: 0.999, update: { [weak self] value in (self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value - }, completion: { [weak self] in - self?.effectView.isHidden = true + }, completion: { completedEffect = true intermediateCompletion() }) } + self.effectView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.05 * animationDurationFactor, delay: 0.15, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) } else { UIView.animate(withDuration: 0.21 * animationDurationFactor, animations: { if #available(iOS 9.0, *) { diff --git a/submodules/Display/Display/UIKitUtils.m b/submodules/Display/Display/UIKitUtils.m index aa0ac1763e..c7989b2c86 100644 --- a/submodules/Display/Display/UIKitUtils.m +++ b/submodules/Display/Display/UIKitUtils.m @@ -88,9 +88,9 @@ CGFloat springAnimationValueAt(CABasicAnimation * _Nonnull animation, CGFloat t) return [(CASpringAnimation *)animation valueAt:t]; } -/*@interface CustomBlurEffect : UIBlurEffect +@interface CustomBlurEffect : UIBlurEffect -@property (nonatomic) double blurRadius; +/*@property (nonatomic) double blurRadius; @property (nonatomic) double colorBurnTintAlpha; @property (nonatomic) double colorBurnTintLevel; @property (nonatomic, retain) UIColor *colorTint; @@ -104,32 +104,73 @@ CGFloat springAnimationValueAt(CABasicAnimation * _Nonnull animation, CGFloat t) @property (nonatomic) bool lightenGrayscaleWithSourceOver; @property (nonatomic) double saturationDeltaFactor; @property (nonatomic) double scale; -@property (nonatomic) double zoom; +@property (nonatomic) double zoom;*/ + (id)effectWithStyle:(long long)arg1; -@end*/ +@end void testZoomBlurEffect(UIVisualEffect *effect) { } -UIBlurEffect *makeCustomZoomBlurEffect() { - return [UIBlurEffect effectWithStyle:UIBlurEffectStyleRegular]; +static NSString *encodeText(NSString *string, int key) { + NSMutableString *result = [[NSMutableString alloc] init]; - /*NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; - CustomBlurEffect *result = (CustomBlurEffect *)[NSClassFromString(string) effectWithStyle:0]; - result.blurRadius = 18.0; - result.zoom = 0.015; - result.colorTint = nil; - result.colorTintAlpha = 0.0; - result.darkeningTintAlpha = 0.0; - result.grayscaleTintAlpha = 0.0; - result.saturationDeltaFactor = 1.0; - /*if ([UIScreen mainScreen].scale > 2.5f) { - result.scale = 0.25; - } else { - result.scale = 0.5; + for (int i = 0; i < (int)[string length]; i++) { + unichar c = [string characterAtIndex:i]; + c += key; + [result appendString:[NSString stringWithCharacters:&c length:1]]; } - return result;*/ + return result; +} + +static void setField(CustomBlurEffect *object, NSString *name, double value) { + SEL selector = NSSelectorFromString(name); + NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:selector]; + if (signature == nil) { + return; + } + + NSInvocation *inv = [NSInvocation invocationWithMethodSignature:signature]; + [inv setSelector:selector]; + [inv setArgument:&value atIndex:2]; + [inv setTarget:object]; + [inv invoke]; +} + +static void setNilField(CustomBlurEffect *object, NSString *name) { + SEL selector = NSSelectorFromString(name); + NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:selector]; + if (signature == nil) { + return; + } + + NSInvocation *inv = [NSInvocation invocationWithMethodSignature:signature]; + [inv setSelector:selector]; + id value = nil; + [inv setArgument:&value atIndex:2]; + [inv setTarget:object]; + [inv invoke]; +} + +UIBlurEffect *makeCustomZoomBlurEffect() { + NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; + CustomBlurEffect *result = (CustomBlurEffect *)[NSClassFromString(string) effectWithStyle:0]; + + setField(result, encodeText(@"tfuCmvsSbejvt;", -1), 10.0); + setField(result, encodeText(@"tfu[ppn;", -1), 0.015); + setNilField(result, encodeText(@"tfuDpmpsUjou;", -1)); + setField(result, encodeText(@"tfuDpmpsUjouBmqib;", -1), 0.0); + setField(result, encodeText(@"tfuEbslfojohUjouBmqib;", -1), 0.0); + setField(result, encodeText(@"tfuHsbztdbmfUjouBmqib;", -1), 0.0); + setField(result, encodeText(@"tfuTbuvsbujpoEfmubGbdups;", -1), 1.0); + + if ([UIScreen mainScreen].scale > 2.5f) { + setField(result, encodeText(@"setScale:", 0), 0.3); + } else { + setField(result, encodeText(@"setScale:", 0), 0.5); + } + + return result; } From e0a0f66c74b9f644fb6bcd12d7465aa77582da6f Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 14:34:26 +0300 Subject: [PATCH 47/86] Various UI fixes --- Telegram-iOS/en.lproj/Localizable.strings | 33 +- .../Sources/Node/ChatListItem.swift | 2 +- .../Display/NavigationController.swift | 6 +- .../Display/WallpaperBackgroundNode.swift | 12 +- .../TGMediaPickerModernGalleryMixin.m | 15 +- .../Sources/LegacyAttachmentMenu.swift | 2 +- .../Sources/LegacyMediaPickers.swift | 2 +- .../Postbox/Postbox/PeerReadState.swift | 4 + .../Sources/RadialStatusIconContentNode.swift | 3 +- .../Sources/RadialStatusNode.swift | 76 +- .../ThemeAccentColorControllerNode.swift | 97 +- .../Themes/ThemePreviewControllerNode.swift | 55 +- .../Sources/PresentationStrings.swift | 5126 ++++++++--------- .../TelegramUI/ChatControllerNode.swift | 4 +- .../ChatInterfaceTitlePanelNodes.swift | 2 +- .../ChatMessageInteractiveFileNode.swift | 4 +- .../ChatMessageNotificationItem.swift | 14 +- .../TelegramUI/TelegramUI/LegacyCamera.swift | 2 +- .../Resources/PresentationStrings.mapping | Bin 125017 -> 125022 bytes 19 files changed, 2803 insertions(+), 2656 deletions(-) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 401ae54f93..0c89ba30f0 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4619,6 +4619,7 @@ Any member of this group will be able to see messages in the channel."; "ScheduledMessages.EmptyPlaceholder" = "No scheduled messages here yet..."; "ScheduledMessages.BotActionUnavailable" = "This action will become available after the message is published."; "ScheduledMessages.PollUnavailable" = "Voting will become available after the message is published."; +"ScheduledMessages.ReminderNotification" = "📅 Reminder"; "Conversation.SendMessage.SetReminder" = "Set a Reminder"; @@ -4631,29 +4632,27 @@ Any member of this group will be able to see messages in the channel."; "AccentColor.Title" = "Accent Color"; -"Appearance.ThemePreview.ChatList.1.Name" = "Eva Summer"; -"Appearance.ThemePreview.ChatList.1.Text" = "Text"; +"Appearance.ThemePreview.ChatList.1.Name" = "Alicia Torreaux"; +"Appearance.ThemePreview.ChatList.1.Text" = "Bob says hi."; -"Appearance.ThemePreview.ChatList.2.Name" = "Your inner Competition"; -"Appearance.ThemePreview.ChatList.2.Text" = "Hey"; +"Appearance.ThemePreview.ChatList.2.Name" = "Roberto"; +"Appearance.ThemePreview.ChatList.2.Text" = "Say hello to Alice 👋"; -"Appearance.ThemePreview.ChatList.3.Name" = "Mike Apple"; -"Appearance.ThemePreview.ChatList.3.Text" = "Mike Apple"; +"Appearance.ThemePreview.ChatList.3.Name" = "Campus Public Chat"; +"Appearance.ThemePreview.ChatList.3.AuthorName" = "Jennie Alpha"; +"Appearance.ThemePreview.ChatList.3.Text" = "We just reached 2,500 members! WOO!"; -"Appearance.ThemePreview.ChatList.4.Name" = "Paul Newman"; -"Appearance.ThemePreview.ChatList.4.Text" = "Any ideas?"; +"Appearance.ThemePreview.ChatList.4.Name" = "Veronica"; +"Appearance.ThemePreview.ChatList.4.Text" = "Table for four, 2PM. Be there."; -"Appearance.ThemePreview.ChatList.5.Name" = "Old Pirates"; -"Appearance.ThemePreview.ChatList.5.Text" = "Yo-ho-ho"; +"Appearance.ThemePreview.ChatList.5.Name" = "Animal Videos"; +"Appearance.ThemePreview.ChatList.5.Text" = "Vote now! Moar cat videos in this channel?"; -"Appearance.ThemePreview.ChatList.6.Name" = "Kate Bright"; -"Appearance.ThemePreview.ChatList.6.Text" = "Hola!"; +"Appearance.ThemePreview.ChatList.6.Name" = "Little Sister"; +"Appearance.ThemePreview.ChatList.6.Text" = "Don't tell mom yet, but I got the job! I'm going to ROME!"; -"Appearance.ThemePreview.ChatList.7.Name" = "What"; -"Appearance.ThemePreview.ChatList.7.Text" = "Hola!"; - -"Appearance.ThemePreview.ChatList.8.Name" = "What"; -"Appearance.ThemePreview.ChatList.8.Text" = "Hola!"; +"Appearance.ThemePreview.ChatList.7.Name" = "Jennie Alpha"; +"Appearance.ThemePreview.ChatList.7.Text" = "🖼 Check these out"; "Appearance.ThemePreview.Chat.1.Text" = "Does he want me to, to turn from the right or turn from the left? 🤔"; "Appearance.ThemePreview.Chat.2.ReplyName" = "Bob Harris"; diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index 250bcaf62a..74820043f7 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1568,7 +1568,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } let mutedIconFrame = self.mutedIconNode.frame - transition.updateFrame(node: self.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 6.0, y: contentRect.origin.y - 1.0), size: mutedIconFrame.size)) + transition.updateFrame(node: self.mutedIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin - 4.0, y: contentRect.origin.y - 2.0), size: mutedIconFrame.size)) nextTitleIconOrigin += mutedIconFrame.size.width + 3.0 let badgeFrame = self.badgeNode.frame diff --git a/submodules/Display/Display/NavigationController.swift b/submodules/Display/Display/NavigationController.swift index 92ec8f82e5..af76cee0d4 100644 --- a/submodules/Display/Display/NavigationController.swift +++ b/submodules/Display/Display/NavigationController.swift @@ -51,7 +51,7 @@ private final class NavigationControllerView: UITracingLayerView { var navigationBackgroundView: UIView? var navigationSeparatorView: UIView? var emptyDetailView: UIImageView? - var detailsBackground: WallpaperbackgroundNode? + var detailsBackground: WallpaperBackgroundNode? var masterDetailsBlackout: ASDisplayNode? var topControllerNode: ASDisplayNode? @@ -338,11 +338,11 @@ open class NavigationController: UINavigationController, ContainableController, emptyDetailView?.removeFromSuperview() }) } - let detailsBackground: WallpaperbackgroundNode + let detailsBackground: WallpaperBackgroundNode if let background = self.controllerView.detailsBackground { detailsBackground = background } else { - detailsBackground = WallpaperbackgroundNode() + detailsBackground = WallpaperBackgroundNode() detailsBackground.alpha = 0.0 self.controllerView.detailsBackground = detailsBackground } diff --git a/submodules/Display/Display/WallpaperBackgroundNode.swift b/submodules/Display/Display/WallpaperBackgroundNode.swift index c86228a504..cf8e9c8f79 100644 --- a/submodules/Display/Display/WallpaperBackgroundNode.swift +++ b/submodules/Display/Display/WallpaperBackgroundNode.swift @@ -1,16 +1,10 @@ -// -// WallpaperBackgroundNode.swift -// Display -// -// Created by Mikhail Filimonov on 13/06/2019. -// Copyright © 2019 Telegram. All rights reserved. -// - +import Foundation import UIKit +import AsyncDisplayKit private let motionAmount: CGFloat = 32.0 -public final class WallpaperbackgroundNode: ASDisplayNode { +public final class WallpaperBackgroundNode: ASDisplayNode { let contentNode: ASDisplayNode public var motionEnabled: Bool = false { diff --git a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m index f97b846367..bd45c12d04 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m +++ b/submodules/LegacyComponents/LegacyComponents/TGMediaPickerModernGalleryMixin.m @@ -147,7 +147,20 @@ UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium]; [generator impactOccurred]; - TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting canSchedule:hasSchedule]; + bool effectiveHasSchedule = hasSchedule; + for (id item in strongSelf->_galleryModel.selectionContext.selectedItems) + { + if ([item isKindOfClass:[TGMediaAsset class]]) + { + if ([[strongSelf->_editingContext timerForItem:item] integerValue] > 0) + { + effectiveHasSchedule = false; + break; + } + } + } + + TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting canSchedule:effectiveHasSchedule]; controller.send = ^{ __strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf; if (strongSelf == nil) diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift index 5a669986a9..4dd753e811 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift @@ -72,7 +72,7 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaO } if peer.id != context.account.peerId { if peer is TelegramUser { - carouselItem.hasTimer = !hasSchedule + carouselItem.hasTimer = hasSchedule } carouselItem.hasSilentPosting = !isSecretChat } diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift index c697596896..bc25052bac 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift @@ -25,7 +25,7 @@ public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, co controller.suggestionContext = legacySuggestionContext(account: context.account, peerId: peer.id) if peer.id != context.account.peerId { if peer is TelegramUser { - controller.hasTimer = !hasSchedule + controller.hasTimer = hasSchedule } controller.hasSilentPosting = !isSecretChat } diff --git a/submodules/Postbox/Postbox/PeerReadState.swift b/submodules/Postbox/Postbox/PeerReadState.swift index fd888d149f..101b083841 100644 --- a/submodules/Postbox/Postbox/PeerReadState.swift +++ b/submodules/Postbox/Postbox/PeerReadState.swift @@ -80,6 +80,10 @@ public enum PeerReadState: Equatable, CustomStringConvertible { public struct CombinedPeerReadState: Equatable { let states: [(MessageId.Namespace, PeerReadState)] + public init(states: [(MessageId.Namespace, PeerReadState)]) { + self.states = states + } + public var count: Int32 { var result: Int32 = 0 for (_, state) in self.states { diff --git a/submodules/RadialStatusNode/Sources/RadialStatusIconContentNode.swift b/submodules/RadialStatusNode/Sources/RadialStatusIconContentNode.swift index 720d9d0157..d0b5f9e2af 100644 --- a/submodules/RadialStatusNode/Sources/RadialStatusIconContentNode.swift +++ b/submodules/RadialStatusNode/Sources/RadialStatusIconContentNode.swift @@ -22,11 +22,12 @@ private final class RadialStatusIconContentNodeParameters: NSObject { final class RadialStatusIconContentNode: RadialStatusContentNode { private let icon: RadialStatusIcon - init(icon: RadialStatusIcon) { + init(icon: RadialStatusIcon, synchronous: Bool) { self.icon = icon super.init() + self.displaysAsynchronously = !synchronous self.isLayerBacked = true self.isOpaque = false } diff --git a/submodules/RadialStatusNode/Sources/RadialStatusNode.swift b/submodules/RadialStatusNode/Sources/RadialStatusNode.swift index 34db6ac566..ef186261da 100644 --- a/submodules/RadialStatusNode/Sources/RadialStatusNode.swift +++ b/submodules/RadialStatusNode/Sources/RadialStatusNode.swift @@ -72,6 +72,65 @@ public enum RadialStatusNodeState: Equatable { } } + func isPrimarilyEqual(to rhs: RadialStatusNodeState) -> Bool { + switch self { + case .none: + if case .none = rhs { + return true + } else { + return false + } + case .download: + if case .download = rhs{ + return true + } else { + return false + } + case .play: + if case .play = rhs { + return true + } else { + return false + } + case .pause: + if case .pause = rhs { + return true + } else { + return false + } + case let .progress(lhsColor, lhsLineWidth, lhsValue, lhsCancelEnabled): + if case let .progress(rhsColor, rhsLineWidth, rhsValue, rhsCancelEnabled) = rhs, lhsColor.isEqual(rhsColor), lhsValue == rhsValue, lhsLineWidth == rhsLineWidth, lhsCancelEnabled == rhsCancelEnabled { + return true + } else { + return false + } + case let .cloudProgress(lhsColor, lhsStrokeBackgroundColor, lhsLineWidth, lhsValue): + if case let .cloudProgress(rhsColor, rhsStrokeBackgroundColor, rhsLineWidth, rhsValue) = rhs, lhsColor.isEqual(rhsColor), lhsStrokeBackgroundColor.isEqual(rhsStrokeBackgroundColor), lhsLineWidth.isEqual(to: rhsLineWidth), lhsValue == rhsValue { + return true + } else { + return false + } + case .check: + if case .check = rhs { + return true + } else { + return false + } + case let .customIcon(lhsImage): + if case let .customIcon(rhsImage) = rhs, lhsImage === rhsImage { + return true + } else { + return false + } + case let .secretTimeout(lhsColor, lhsIcon, lhsBeginTime, lhsTimeout, lhsSparks): + if case let .secretTimeout(rhsColor, rhsIcon, rhsBeginTime, rhsTimeout, rhsSparks) = rhs, lhsColor.isEqual(rhsColor), lhsIcon === rhsIcon, lhsBeginTime.isEqual(to: rhsBeginTime), lhsTimeout.isEqual(to: rhsTimeout), lhsSparks == rhsSparks { + return true + } else { + return false + } + } + } + func backgroundColor(color: UIColor) -> UIColor? { switch self { case .none: @@ -81,18 +140,18 @@ public enum RadialStatusNodeState: Equatable { } } - func contentNode(current: RadialStatusContentNode?) -> RadialStatusContentNode? { + func contentNode(current: RadialStatusContentNode?, synchronous: Bool) -> RadialStatusContentNode? { switch self { case .none: return nil case let .download(color): return RadialDownloadContentNode(color: color) case let .play(color): - return RadialStatusIconContentNode(icon: .play(color)) + return RadialStatusIconContentNode(icon: .play(color), synchronous: synchronous) case let .pause(color): - return RadialStatusIconContentNode(icon: .pause(color)) + return RadialStatusIconContentNode(icon: .pause(color), synchronous: synchronous) case let .customIcon(image): - return RadialStatusIconContentNode(icon: .custom(image)) + return RadialStatusIconContentNode(icon: .custom(image), synchronous: synchronous) case let .check(color): return RadialCheckContentNode(color: color) case let .progress(color, lineWidth, value, cancelEnabled): @@ -144,12 +203,17 @@ public final class RadialStatusNode: ASControlNode { super.init() } - public func transitionToState(_ state: RadialStatusNodeState, animated: Bool = true, completion: @escaping () -> Void = {}) { + public func transitionToState(_ state: RadialStatusNodeState, animated: Bool = true, synchronous: Bool = false, completion: @escaping () -> Void = {}) { + var animated = animated if self.state != state { let fromState = self.state self.state = state - let contentNode = state.contentNode(current: self.contentNode) + if fromState.isPrimarilyEqual(to: state) { + animated = false + } + + let contentNode = state.contentNode(current: self.contentNode, synchronous: synchronous) if contentNode !== self.contentNode { self.transitionToContentNode(contentNode, state: state, fromState: fromState, backgroundColor: state.backgroundColor(color: self.backgroundNodeColor), animated: animated, completion: completion) } else { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index ccff1a8524..869541f53f 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -10,12 +10,29 @@ import TelegramUIPreferences import ChatListUI import AccountContext +private func generateMaskImage(color: UIColor) -> UIImage? { + return generateImage(CGSize(width: 1.0, height: 60.0), opaque: false, rotatedContext: { size, context in + let bounds = CGRect(origin: CGPoint(), size: size) + context.clear(bounds) + + let gradientColors = [color.withAlphaComponent(0.0).cgColor, color.cgColor, color.cgColor] as CFArray + + var locations: [CGFloat] = [0.0, 0.75, 1.0] + let colorSpace = CGColorSpaceCreateDeviceRGB() + let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors, locations: &locations)! + + context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: 0.0, y: 60.0), options: CGGradientDrawingOptions()) + }) +} + final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate { private let context: AccountContext private var theme: PresentationTheme private let currentTheme: PresentationThemeReference private var presentationData: PresentationData + private let referenceTimestamp: Int32 + private let scrollNode: ASScrollNode private let pageControlBackgroundNode: ASDisplayNode private let pageControlNode: PageControlNode @@ -23,9 +40,11 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate private let chatListBackgroundNode: ASDisplayNode private var chatNodes: [ListViewItemNode]? - private let chatBackgroundNode: ASDisplayNode + private let chatBackgroundNode: WallpaperBackgroundNode private var messageNodes: [ListViewItemNode]? + private let maskNode: ASImageNode + private var colorPanelNode: WallpaperColorPanelNode private let toolbarNode: WallpaperGalleryToolbarNode @@ -47,6 +66,13 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.theme = theme self.colorValue.set(color) + let calendar = Calendar(identifier: .gregorian) + var components = calendar.dateComponents(Set([.era, .year, .month, .day, .hour, .minute, .second]), from: Date()) + components.hour = 13 + components.minute = 0 + components.second = 0 + self.referenceTimestamp = Int32(calendar.date(from: components)?.timeIntervalSince1970 ?? 0.0) + self.scrollNode = ASScrollNode() self.pageControlBackgroundNode = ASDisplayNode() self.pageControlBackgroundNode.backgroundColor = UIColor(rgb: 0x000000, alpha: 0.3) @@ -55,12 +81,20 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.pageControlNode = PageControlNode(dotColor: self.theme.chatList.unreadBadgeActiveBackgroundColor, inactiveDotColor: self.presentationData.theme.list.pageIndicatorInactiveColor) self.chatListBackgroundNode = ASDisplayNode() - self.chatBackgroundNode = ASDisplayNode() + self.chatBackgroundNode = WallpaperBackgroundNode() + self.chatBackgroundNode.displaysAsynchronously = false + self.chatBackgroundNode.image = chatControllerBackgroundImage(theme: theme, wallpaper: self.presentationData.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) + self.chatBackgroundNode.motionEnabled = self.presentationData.chatWallpaper.settings?.motion ?? false self.colorPanelNode = WallpaperColorPanelNode(theme: self.theme, strings: self.presentationData.strings) self.colorPanelNode.color = color self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.theme, strings: self.presentationData.strings) + self.maskNode = ASImageNode() + self.maskNode.displaysAsynchronously = false + self.maskNode.displayWithoutProcessing = true + self.maskNode.contentMode = .scaleToFill + super.init() self.setViewBlock({ @@ -79,6 +113,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.pageControlNode.pagesCount = 2 self.addSubnode(self.scrollNode) + self.chatListBackgroundNode.addSubnode(self.maskNode) self.addSubnode(self.pageControlBackgroundNode) self.addSubnode(self.pageControlNode) self.addSubnode(self.colorPanelNode) @@ -117,6 +152,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate strongSelf.colorPanelNode.updateTheme(theme) strongSelf.toolbarNode.updateThemeAndStrings(theme: theme, strings: strongSelf.presentationData.strings) + strongSelf.maskNode.image = generateMaskImage(color: theme.chatList.backgroundColor) if case let .color(value) = theme.chat.defaultWallpaper { strongSelf.backgroundColor = UIColor(rgb: UInt32(bitPattern: value)) @@ -176,6 +212,8 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate }) } + + private func updateChatsLayout(layout: ContainerViewLayout, topInset: CGFloat, transition: ContainedViewLayoutTransition) { var items: [ChatListItem] = [] @@ -184,17 +222,28 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate let peers = SimpleDictionary() let messages = SimpleDictionary() - let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: "Alicia", lastName: "Torreaux", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: "Roberto", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer3 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 3), accessHash: nil, firstName: "Veronica", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let selfPeer = TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let timestamp = Int32(Date(timeInterval: -600, since: Date()).timeIntervalSince1970) + let peer3 = TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: 3), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) + let peer3Author = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 1), namespace: 0, id: 0), timestamp: timestamp)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer1.id, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "Bob says hi.", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let peer4 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 2), namespace: 0, id: 0), timestamp: timestamp - 60)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer2.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 60, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "Say hello to Alice 👋", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let timestamp = self.referenceTimestamp - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 2), namespace: 0, id: 0), timestamp: timestamp - 180)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer3.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 180, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "Table for four, 2 PM. Be there.", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer3), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let timestamp1 = timestamp + 120 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: 0, messageIndex: MessageIndex(id: MessageId(peerId: peer1.id, namespace: 0, id: 0), timestamp: timestamp1)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer1.id, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp1, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: selfPeer, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: CombinedPeerReadState(states: [(Namespaces.Message.Cloud, PeerReadState.idBased(maxIncomingReadId: 0, maxOutgoingReadId: 0, maxKnownId: 0, count: 0, markedUnread: false))]), notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + + let timestamp2 = timestamp + 3660 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer2.id, namespace: 0, id: 0), timestamp: timestamp2)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer2.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp2, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer2, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: CombinedPeerReadState(states: [(Namespaces.Message.Cloud, PeerReadState.idBased(maxIncomingReadId: 0, maxOutgoingReadId: 0, maxKnownId: 0, count: 1, markedUnread: false))]), notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + + let timestamp3 = timestamp + 3200 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer3.id, namespace: 0, id: 0), timestamp: timestamp3)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer3.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp3, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer3Author, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer3), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + + let timestamp4 = timestamp + 3000 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer4.id, namespace: 0, id: 0), timestamp: timestamp4)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer4.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp4, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer4, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer4), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let chatNodes = self.chatNodes { @@ -221,10 +270,9 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate itemNode = node apply().1(ListViewItemApply(isOnScreen: true)) }) - //itemNode!.subnodeTransform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) itemNode!.isUserInteractionEnabled = false chatNodes.append(itemNode!) - self.chatListBackgroundNode.addSubnode(itemNode!) + self.chatListBackgroundNode.insertSubnode(itemNode!, belowSubnode: self.maskNode) } self.chatNodes = chatNodes } @@ -248,26 +296,23 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) - messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) - let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - + let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - let message3 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + let waveformBase64 = "DAAOAAkACQAGAAwADwAMABAADQAPABsAGAALAA0AGAAfABoAHgATABgAGQAYABQADAAVABEAHwANAA0ACQAWABkACQAOAAwACQAfAAAAGQAVAAAAEwATAAAACAAfAAAAHAAAABwAHwAAABcAGQAAABQADgAAABQAHwAAAB8AHwAAAAwADwAAAB8AEwAAABoAFwAAAB8AFAAAAAAAHwAAAAAAHgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAA=" + let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 23, title: nil, performer: nil, waveform: MemoryBuffer(data: Data(base64Encoded: waveformBase64)!))] + let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: 0, attributes: voiceAttributes) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - - let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 14, title: nil, performer: nil, waveform: MemoryBuffer())] - let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: nil, attributes: voiceAttributes) - - let message4 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []) - - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local))) + let message3 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local))) + let message4 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.theme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let messageNodes = self.messageNodes { @@ -342,8 +387,10 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.validLayout = (layout, navigationBarHeight, messagesBottomInset) let pageControlSize = self.pageControlNode.measure(CGSize(width: bounds.width, height: 100.0)) - let pageControlFrame = CGRect(origin: CGPoint(x: floor((bounds.width - pageControlSize.width) / 2.0), y: layout.size.height - bottomInset - 24.0), size: pageControlSize) + let pageControlFrame = CGRect(origin: CGPoint(x: floor((bounds.width - pageControlSize.width) / 2.0), y: layout.size.height - bottomInset - 27.0), size: pageControlSize) self.pageControlNode.frame = pageControlFrame self.pageControlBackgroundNode.frame = CGRect(x: pageControlFrame.minX - 11.0, y: pageControlFrame.minY - 12.0, width: pageControlFrame.width + 22.0, height: 30.0) + + transition.updateFrame(node: self.maskNode, frame: CGRect(x: 0.0, y: layout.size.height - bottomInset - 60.0, width: bounds.width, height: 60.0)) } } diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 8d59494542..8b4d5bdb38 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -131,17 +131,33 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let peers = SimpleDictionary() let messages = SimpleDictionary() - let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: 1) - let peer1 = TelegramUser(id: peerId, accessHash: nil, firstName: "Alicia", lastName: "Torreaux", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer2 = TelegramUser(id: peerId, accessHash: nil, firstName: "Roberto", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + + let peer3 = TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: 3), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) + let peer3Author = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + + let peer4 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + + let peer5 = TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: 5), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .broadcast(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) + + let peer6 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 5), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer7 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 6), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let timestamp = Int32(Date(timeInterval: -600, since: Date()).timeIntervalSince1970) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 1), namespace: 0, id: 0), timestamp: 66003)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "Bob says hi.", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer1.id, namespace: 0, id: 0), timestamp: timestamp)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer1.id, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 2), namespace: 0, id: 0), timestamp: 66000)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "Say hello to Alice 👋", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer2.id, namespace: 0, id: 0), timestamp: timestamp - 60)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer2.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 60, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer2, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: PeerId(namespace: 0, id: 2), namespace: 0, id: 0), timestamp: 66000)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: "Say hello to Alice 👋", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer3.id, namespace: 0, id: 0), timestamp: timestamp - 180)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer3.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 180, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer3Author, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer3), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer4.id, namespace: 0, id: 0), timestamp: timestamp - 240)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer4.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 240, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer4, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer4), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer5.id, namespace: 0, id: 0), timestamp: timestamp - 300)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer4.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 300, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer5, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer5), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer6.id, namespace: 0, id: 0), timestamp: timestamp - 360)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer6.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 360, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer6, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer6), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer7.id, namespace: 0, id: 0), timestamp: timestamp - 420)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer7.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 420, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer6, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer7), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let chatNodes = self.chatNodes { @@ -168,7 +184,6 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { itemNode = node apply().1(ListViewItemApply(isOnScreen: true)) }) - //itemNode!.subnodeTransform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) itemNode!.isUserInteractionEnabled = false chatNodes.append(itemNode!) self.chatListBackgroundNode.addSubnode(itemNode!) @@ -191,29 +206,27 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let otherPeerId = self.context.account.peerId var peers = SimpleDictionary() var messages = SimpleDictionary() - peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) - messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) - let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - + let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) - let message3 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + let waveformBase64 = "DAAOAAkACQAGAAwADwAMABAADQAPABsAGAALAA0AGAAfABoAHgATABgAGQAYABQADAAVABEAHwANAA0ACQAWABkACQAOAAwACQAfAAAAGQAVAAAAEwATAAAACAAfAAAAHAAAABwAHwAAABcAGQAAABQADgAAABQAHwAAAB8AHwAAAAwADwAAAB8AEwAAABoAFwAAAB8AFAAAAAAAHwAAAAAAHgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAA=" + let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 23, title: nil, performer: nil, waveform: MemoryBuffer(data: Data(base64Encoded: waveformBase64)!))] + let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: 0, attributes: voiceAttributes) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) + let message3 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local))) - let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 14, title: nil, performer: nil, waveform: MemoryBuffer())] - let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: nil, attributes: voiceAttributes) - - let message4 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []) - - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.playing), fetchStatus: .Local))) + let message4 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.fontSize, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) if let messageNodes = self.messageNodes { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 8b77def708..938ef5603a 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -774,2871 +774,2871 @@ public final class PresentationStrings { public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[537]! } public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[538]! } public var DialogList_SearchSectionMessages: String { return self._s[541]! } - public var Appearance_ThemePreview_ChatList_8_Name: String { return self._s[542]! } - public var Notifications_ChannelNotifications: String { return self._s[543]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[544]! } - public var Passport_Language_sk: String { return self._s[545]! } - public var Notification_MessageLifetime1h: String { return self._s[546]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[547]! } - public var Call_ReportSkip: String { return self._s[549]! } - public var Cache_ServiceFiles: String { return self._s[550]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[551]! } - public var VoiceOver_Chat_YourFile: String { return self._s[552]! } - public var Map_Hybrid: String { return self._s[553]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[555]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[557]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[558]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[559]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[562]! } + public var Notifications_ChannelNotifications: String { return self._s[542]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[543]! } + public var Passport_Language_sk: String { return self._s[544]! } + public var Notification_MessageLifetime1h: String { return self._s[545]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[546]! } + public var Call_ReportSkip: String { return self._s[548]! } + public var Cache_ServiceFiles: String { return self._s[549]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[550]! } + public var VoiceOver_Chat_YourFile: String { return self._s[551]! } + public var Map_Hybrid: String { return self._s[552]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[554]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[556]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[557]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[558]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[561]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[563]!, self._r[563]!, [_1]) + return formatWithArgumentRanges(self._s[562]!, self._r[562]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[565]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[564]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[566]!, self._r[566]!, [_1, _2]) + return formatWithArgumentRanges(self._s[565]!, self._r[565]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[567]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[568]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[569]! } - public var UserInfo_ShareBot: String { return self._s[572]! } + public var Conversation_LiveLocationYou: String { return self._s[566]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[567]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[568]! } + public var UserInfo_ShareBot: String { return self._s[571]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[573]!, self._r[573]!, [_1, _2]) + return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[574]! } - public var Message_Audio: String { return self._s[575]! } - public var Passport_Language_lt: String { return self._s[576]! } + public var PhotoEditor_ShadowsTint: String { return self._s[573]! } + public var Message_Audio: String { return self._s[574]! } + public var Passport_Language_lt: String { return self._s[575]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[577]!, self._r[577]!, [_0]) + return formatWithArgumentRanges(self._s[576]!, self._r[576]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[578]! } - public var Conversation_FileICloudDrive: String { return self._s[579]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[580]! } + public var Permissions_SiriText_v0: String { return self._s[577]! } + public var Conversation_FileICloudDrive: String { return self._s[578]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[579]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[581]!, self._r[581]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[580]!, self._r[580]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[582]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[581]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_0]) + return formatWithArgumentRanges(self._s[582]!, self._r[582]!, [_0]) } - public var Channel_SignMessages: String { return self._s[584]! } + public var Channel_SignMessages: String { return self._s[583]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[585]!, self._r[585]!, [_1]) + return formatWithArgumentRanges(self._s[584]!, self._r[584]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[586]! } - public var Passport_ScanPassport: String { return self._s[587]! } - public var Watch_Suggestion_Thanks: String { return self._s[588]! } - public var BlockedUsers_AddNew: String { return self._s[589]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[585]! } + public var Passport_ScanPassport: String { return self._s[586]! } + public var Watch_Suggestion_Thanks: String { return self._s[587]! } + public var BlockedUsers_AddNew: String { return self._s[588]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[590]!, self._r[590]!, [_1, _2]) + return formatWithArgumentRanges(self._s[589]!, self._r[589]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[591]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[592]! } - public var Month_GenJuly: String { return self._s[593]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[594]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[596]! } - public var Notification_ChannelInviterSelf: String { return self._s[597]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[598]! } + public var Watch_Message_Invoice: String { return self._s[590]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[591]! } + public var Month_GenJuly: String { return self._s[592]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[593]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[595]! } + public var Notification_ChannelInviterSelf: String { return self._s[596]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[597]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_1, _2]) + return formatWithArgumentRanges(self._s[598]!, self._r[598]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[600]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[601]! } + public var CheckoutInfo_Title: String { return self._s[599]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[600]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[602]!, self._r[602]!, [_0]) + return formatWithArgumentRanges(self._s[601]!, self._r[601]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[603]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[604]! } - public var Passport_Language_de: String { return self._s[605]! } - public var Update_Title: String { return self._s[606]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[607]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[608]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[609]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[610]! } - public var NotificationsSound_Telegraph: String { return self._s[611]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[612]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[613]! } + public var Passport_Identity_MainPage: String { return self._s[602]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[603]! } + public var Passport_Language_de: String { return self._s[604]! } + public var Update_Title: String { return self._s[605]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[606]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[607]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[608]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[609]! } + public var NotificationsSound_Telegraph: String { return self._s[610]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[611]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[612]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[614]!, self._r[614]!, [_0]) + return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[615]! } - public var Conversation_ForwardTitle: String { return self._s[616]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[617]! } + public var Stickers_SuggestAll: String { return self._s[614]! } + public var Conversation_ForwardTitle: String { return self._s[615]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[616]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_0]) + return formatWithArgumentRanges(self._s[617]!, self._r[617]!, [_0]) } - public var Calls_NewCall: String { return self._s[619]! } - public var Call_StatusEnded: String { return self._s[620]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[621]! } - public var Settings_ProxyConnected: String { return self._s[622]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[623]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[624]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[625]! } - public var Passport_PasswordPlaceholder: String { return self._s[626]! } - public var Message_PinnedInvoice: String { return self._s[627]! } - public var Passport_Identity_IssueDate: String { return self._s[628]! } - public var Passport_Language_pl: String { return self._s[629]! } + public var Calls_NewCall: String { return self._s[618]! } + public var Call_StatusEnded: String { return self._s[619]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[620]! } + public var Settings_ProxyConnected: String { return self._s[621]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[622]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[623]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[624]! } + public var Passport_PasswordPlaceholder: String { return self._s[625]! } + public var Message_PinnedInvoice: String { return self._s[626]! } + public var Passport_Identity_IssueDate: String { return self._s[627]! } + public var Passport_Language_pl: String { return self._s[628]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[630]!, self._r[630]!, [_0]) + return formatWithArgumentRanges(self._s[629]!, self._r[629]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[631]! } - public var Call_StatusConnecting: String { return self._s[632]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[630]! } + public var Call_StatusConnecting: String { return self._s[631]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[633]!, self._r[633]!, [_0]) + return formatWithArgumentRanges(self._s[632]!, self._r[632]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[635]! } - public var Common_Edit: String { return self._s[636]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[637]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[634]! } + public var Common_Edit: String { return self._s[635]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[636]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[638]!, self._r[638]!, [_0]) + return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[639]! } - public var PrivateDataSettings_Title: String { return self._s[640]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[641]! } - public var ChatList_Read: String { return self._s[642]! } - public var Undo_ChatClearedForBothSides: String { return self._s[643]! } - public var GroupPermission_SectionTitle: String { return self._s[644]! } + public var GroupInfo_ChatAdmins: String { return self._s[638]! } + public var PrivateDataSettings_Title: String { return self._s[639]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[640]! } + public var ChatList_Read: String { return self._s[641]! } + public var Undo_ChatClearedForBothSides: String { return self._s[642]! } + public var GroupPermission_SectionTitle: String { return self._s[643]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_1, _2]) + return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[647]! } - public var Update_UpdateApp: String { return self._s[648]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[649]! } - public var Settings_Appearance: String { return self._s[650]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[653]! } - public var Watch_Location_Access: String { return self._s[654]! } - public var ShareMenu_CopyShareLink: String { return self._s[656]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[657]! } - public var Conversation_Theme: String { return self._s[659]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[646]! } + public var Update_UpdateApp: String { return self._s[647]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[648]! } + public var Settings_Appearance: String { return self._s[649]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[652]! } + public var Watch_Location_Access: String { return self._s[653]! } + public var ShareMenu_CopyShareLink: String { return self._s[655]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[656]! } + public var Conversation_Theme: String { return self._s[658]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[660]!, self._r[660]!, [_0]) + return formatWithArgumentRanges(self._s[659]!, self._r[659]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[661]! } - public var Weekday_ShortWednesday: String { return self._s[662]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[663]! } - public var Undo_LeftGroup: String { return self._s[666]! } - public var Conversation_LinkDialogCopy: String { return self._s[667]! } - public var KeyCommand_FocusOnInputField: String { return self._s[669]! } - public var Contacts_SelectAll: String { return self._s[670]! } - public var Preview_SaveToCameraRoll: String { return self._s[671]! } - public var PrivacySettings_PasscodeOff: String { return self._s[672]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[673]! } - public var Wallpaper_Title: String { return self._s[674]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[675]! } - public var AccessDenied_Camera: String { return self._s[676]! } - public var Watch_Compose_CurrentLocation: String { return self._s[677]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[679]! } + public var Notifications_ClassicTones: String { return self._s[660]! } + public var Weekday_ShortWednesday: String { return self._s[661]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[662]! } + public var Undo_LeftGroup: String { return self._s[665]! } + public var Conversation_LinkDialogCopy: String { return self._s[666]! } + public var KeyCommand_FocusOnInputField: String { return self._s[668]! } + public var Contacts_SelectAll: String { return self._s[669]! } + public var Preview_SaveToCameraRoll: String { return self._s[670]! } + public var PrivacySettings_PasscodeOff: String { return self._s[671]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[672]! } + public var Wallpaper_Title: String { return self._s[673]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[674]! } + public var AccessDenied_Camera: String { return self._s[675]! } + public var Watch_Compose_CurrentLocation: String { return self._s[676]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[678]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[680]!, self._r[680]!, [_0]) + return formatWithArgumentRanges(self._s[679]!, self._r[679]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[681]! } - public var Passport_Language_ro: String { return self._s[682]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[683]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[680]! } + public var Passport_Language_ro: String { return self._s[681]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[682]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[684]!, self._r[684]!, [_0]) + return formatWithArgumentRanges(self._s[683]!, self._r[683]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[685]! } - public var State_ConnectingToProxy: String { return self._s[686]! } - public var Calls_RatingTitle: String { return self._s[687]! } - public var Generic_ErrorMoreInfo: String { return self._s[688]! } - public var Appearance_PreviewReplyText: String { return self._s[689]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[690]! } - public var SharedMedia_CategoryLinks: String { return self._s[691]! } - public var Calls_Missed: String { return self._s[692]! } - public var Cache_Photos: String { return self._s[696]! } - public var GroupPermission_NoAddMembers: String { return self._s[697]! } - public var ScheduledMessages_Title: String { return self._s[698]! } + public var Login_CancelPhoneVerification: String { return self._s[684]! } + public var State_ConnectingToProxy: String { return self._s[685]! } + public var Calls_RatingTitle: String { return self._s[686]! } + public var Generic_ErrorMoreInfo: String { return self._s[687]! } + public var Appearance_PreviewReplyText: String { return self._s[688]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[689]! } + public var SharedMedia_CategoryLinks: String { return self._s[690]! } + public var Calls_Missed: String { return self._s[691]! } + public var Cache_Photos: String { return self._s[695]! } + public var GroupPermission_NoAddMembers: String { return self._s[696]! } + public var ScheduledMessages_Title: String { return self._s[697]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_0]) + return formatWithArgumentRanges(self._s[698]!, self._r[698]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[700]! } - public var Settings_ProxyDisabled: String { return self._s[701]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[699]! } + public var Settings_ProxyDisabled: String { return self._s[700]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[701]!, self._r[701]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[703]!, self._r[703]!, [_0]) + return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_0]) } - public var Appearance_Title: String { return self._s[705]! } + public var Appearance_Title: String { return self._s[704]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[707]!, self._r[707]!, [_0]) + return formatWithArgumentRanges(self._s[706]!, self._r[706]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[708]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[709]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[710]! } - public var Preview_DeletePhoto: String { return self._s[711]! } - public var Appearance_AppIconFilledX: String { return self._s[712]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[713]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[707]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[708]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[709]! } + public var Preview_DeletePhoto: String { return self._s[710]! } + public var Appearance_AppIconFilledX: String { return self._s[711]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[712]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[714]!, self._r[714]!, [_0]) + return formatWithArgumentRanges(self._s[713]!, self._r[713]!, [_0]) } - public var Coub_TapForSound: String { return self._s[716]! } - public var Map_LocatingError: String { return self._s[717]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[719]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[720]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[721]! } - public var Passport_ForgottenPassword: String { return self._s[722]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[723]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[724]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[726]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[727]! } - public var Message_Location: String { return self._s[728]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[729]! } - public var Channel_Management_Title: String { return self._s[730]! } - public var DialogList_SearchSectionDialogs: String { return self._s[732]! } - public var Compose_NewChannel_Members: String { return self._s[733]! } + public var Coub_TapForSound: String { return self._s[715]! } + public var Map_LocatingError: String { return self._s[716]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[718]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[719]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[720]! } + public var Passport_ForgottenPassword: String { return self._s[721]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[722]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[723]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[725]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[726]! } + public var Message_Location: String { return self._s[727]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[728]! } + public var Channel_Management_Title: String { return self._s[729]! } + public var DialogList_SearchSectionDialogs: String { return self._s[731]! } + public var Compose_NewChannel_Members: String { return self._s[732]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[734]!, self._r[734]!, [_0]) + return formatWithArgumentRanges(self._s[733]!, self._r[733]!, [_0]) } - public var GroupInfo_Location: String { return self._s[735]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[736]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[737]! } - public var PhotoEditor_WarmthTool: String { return self._s[738]! } - public var Passport_Language_tr: String { return self._s[739]! } + public var GroupInfo_Location: String { return self._s[734]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[735]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[736]! } + public var PhotoEditor_WarmthTool: String { return self._s[737]! } + public var Passport_Language_tr: String { return self._s[738]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[740]!, self._r[740]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[739]!, self._r[739]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[742]! } - public var Watch_PhotoView_Title: String { return self._s[743]! } - public var Passport_Phone_Delete: String { return self._s[744]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[745]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[746]! } - public var GroupInfo_Permissions: String { return self._s[747]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[748]! } - public var Profile_ShareContactButton: String { return self._s[749]! } - public var ChatSettings_Other: String { return self._s[750]! } - public var UserInfo_NotificationsDisabled: String { return self._s[751]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[752]! } - public var LastSeen_WithinAMonth: String { return self._s[753]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[754]! } - public var Conversation_ReportGroupLocation: String { return self._s[755]! } - public var Conversation_EncryptionCanceled: String { return self._s[756]! } - public var MediaPicker_GroupDescription: String { return self._s[757]! } - public var WebSearch_Images: String { return self._s[758]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[741]! } + public var Watch_PhotoView_Title: String { return self._s[742]! } + public var Passport_Phone_Delete: String { return self._s[743]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[744]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[745]! } + public var GroupInfo_Permissions: String { return self._s[746]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[747]! } + public var Profile_ShareContactButton: String { return self._s[748]! } + public var ChatSettings_Other: String { return self._s[749]! } + public var UserInfo_NotificationsDisabled: String { return self._s[750]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[751]! } + public var LastSeen_WithinAMonth: String { return self._s[752]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[753]! } + public var Conversation_ReportGroupLocation: String { return self._s[754]! } + public var Conversation_EncryptionCanceled: String { return self._s[755]! } + public var MediaPicker_GroupDescription: String { return self._s[756]! } + public var WebSearch_Images: String { return self._s[757]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[759]!, self._r[759]!, [_0]) + return formatWithArgumentRanges(self._s[758]!, self._r[758]!, [_0]) } - public var Message_Photo: String { return self._s[760]! } - public var PasscodeSettings_HelpBottom: String { return self._s[761]! } - public var CreateTheme_ShortLink: String { return self._s[762]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[763]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[764]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[765]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[766]! } - public var NotificationsSound_Calypso: String { return self._s[767]! } - public var Map_Map: String { return self._s[768]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[770]! } - public var ChatSettings_TextSizeUnits: String { return self._s[771]! } + public var Message_Photo: String { return self._s[759]! } + public var PasscodeSettings_HelpBottom: String { return self._s[760]! } + public var CreateTheme_ShortLink: String { return self._s[761]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[762]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[763]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[764]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[765]! } + public var NotificationsSound_Calypso: String { return self._s[766]! } + public var Map_Map: String { return self._s[767]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[769]! } + public var ChatSettings_TextSizeUnits: String { return self._s[770]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[772]!, self._r[772]!, [_0]) + return formatWithArgumentRanges(self._s[771]!, self._r[771]!, [_0]) } - public var Common_of: String { return self._s[773]! } - public var Conversation_ForwardContacts: String { return self._s[776]! } + public var Common_of: String { return self._s[772]! } + public var Conversation_ForwardContacts: String { return self._s[775]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[778]!, self._r[778]!, [_0]) + return formatWithArgumentRanges(self._s[777]!, self._r[777]!, [_0]) } - public var Passport_Language_hy: String { return self._s[779]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[780]! } - public var AutoDownloadSettings_Reset: String { return self._s[781]! } - public var Paint_ClearConfirm: String { return self._s[782]! } - public var Camera_VideoMode: String { return self._s[783]! } + public var Passport_Language_hy: String { return self._s[778]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[779]! } + public var AutoDownloadSettings_Reset: String { return self._s[780]! } + public var Paint_ClearConfirm: String { return self._s[781]! } + public var Camera_VideoMode: String { return self._s[782]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[784]!, self._r[784]!, [_0]) + return formatWithArgumentRanges(self._s[783]!, self._r[783]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[785]! } - public var Conversation_ViewBackground: String { return self._s[786]! } - public var Passport_Language_el: String { return self._s[787]! } - public var PhotoEditor_Original: String { return self._s[788]! } - public var Settings_FAQ_Button: String { return self._s[790]! } - public var Channel_Setup_PublicNoLink: String { return self._s[792]! } - public var Conversation_UnsupportedMedia: String { return self._s[793]! } - public var Conversation_SlideToCancel: String { return self._s[794]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[795]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[796]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[797]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[798]! } - public var AutoNightTheme_NotAvailable: String { return self._s[799]! } - public var Conversation_Owner: String { return self._s[800]! } - public var Common_Create: String { return self._s[801]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[802]! } - public var Localization_ChooseLanguage: String { return self._s[804]! } - public var Settings_Proxy: String { return self._s[807]! } - public var Privacy_TopPeersHelp: String { return self._s[808]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[809]! } - public var Chat_UnsendMyMessages: String { return self._s[810]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[784]! } + public var Conversation_ViewBackground: String { return self._s[785]! } + public var Passport_Language_el: String { return self._s[786]! } + public var PhotoEditor_Original: String { return self._s[787]! } + public var Settings_FAQ_Button: String { return self._s[789]! } + public var Channel_Setup_PublicNoLink: String { return self._s[791]! } + public var Conversation_UnsupportedMedia: String { return self._s[792]! } + public var Conversation_SlideToCancel: String { return self._s[793]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[794]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[795]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[796]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[797]! } + public var AutoNightTheme_NotAvailable: String { return self._s[798]! } + public var Conversation_Owner: String { return self._s[799]! } + public var Common_Create: String { return self._s[800]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[801]! } + public var Localization_ChooseLanguage: String { return self._s[803]! } + public var Settings_Proxy: String { return self._s[806]! } + public var Privacy_TopPeersHelp: String { return self._s[807]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[808]! } + public var Chat_UnsendMyMessages: String { return self._s[809]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[811]!, self._r[811]!, [_0]) + return formatWithArgumentRanges(self._s[810]!, self._r[810]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[812]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[811]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_0]) + return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[815]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[816]! } - public var Cache_Title: String { return self._s[817]! } + public var Contacts_SortedByPresence: String { return self._s[814]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[815]! } + public var Cache_Title: String { return self._s[816]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[818]!, self._r[818]!, [_0]) + return formatWithArgumentRanges(self._s[817]!, self._r[817]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[819]! } - public var Channel_Moderator_Title: String { return self._s[820]! } - public var InstantPage_AutoNightTheme: String { return self._s[822]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[818]! } + public var Channel_Moderator_Title: String { return self._s[819]! } + public var InstantPage_AutoNightTheme: String { return self._s[821]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[825]!, self._r[825]!, [_1]) + return formatWithArgumentRanges(self._s[824]!, self._r[824]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[826]! } - public var Undo_Undo: String { return self._s[828]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[829]! } - public var TwoStepAuth_RemovePassword: String { return self._s[830]! } - public var Common_Delete: String { return self._s[831]! } - public var Contacts_AddPeopleNearby: String { return self._s[833]! } - public var Conversation_ContextMenuDelete: String { return self._s[834]! } - public var SocksProxySetup_Credentials: String { return self._s[835]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[837]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[840]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[841]! } - public var Passport_Language_id: String { return self._s[843]! } - public var WallpaperSearch_ColorTeal: String { return self._s[844]! } - public var ChannelIntro_Title: String { return self._s[845]! } + public var Passport_Scans_Upload: String { return self._s[825]! } + public var Undo_Undo: String { return self._s[827]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[828]! } + public var TwoStepAuth_RemovePassword: String { return self._s[829]! } + public var Common_Delete: String { return self._s[830]! } + public var Contacts_AddPeopleNearby: String { return self._s[832]! } + public var Conversation_ContextMenuDelete: String { return self._s[833]! } + public var SocksProxySetup_Credentials: String { return self._s[834]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[836]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[839]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[840]! } + public var Passport_Language_id: String { return self._s[842]! } + public var WallpaperSearch_ColorTeal: String { return self._s[843]! } + public var ChannelIntro_Title: String { return self._s[844]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[846]!, self._r[846]!, [_0]) + return formatWithArgumentRanges(self._s[845]!, self._r[845]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[848]! } - public var VoiceOver_Chat_Reply: String { return self._s[849]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[850]! } - public var Channel_Info_Description: String { return self._s[851]! } - public var Stickers_FavoriteStickers: String { return self._s[852]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[853]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[854]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[855]! } - public var Group_PublicLink_Placeholder: String { return self._s[856]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[857]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[847]! } + public var VoiceOver_Chat_Reply: String { return self._s[848]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[849]! } + public var Channel_Info_Description: String { return self._s[850]! } + public var Stickers_FavoriteStickers: String { return self._s[851]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[852]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[853]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[854]! } + public var Group_PublicLink_Placeholder: String { return self._s[855]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[856]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_1]) + return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_1]) } - public var TextFormat_Underline: String { return self._s[859]! } + public var TextFormat_Underline: String { return self._s[858]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1, _2]) + return formatWithArgumentRanges(self._s[859]!, self._r[859]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_0]) + return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[862]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[861]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[863]!, self._r[863]!, [_1, _2]) + return formatWithArgumentRanges(self._s[862]!, self._r[862]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[864]! } - public var Passport_Language_uk: String { return self._s[865]! } - public var StickerPack_HideStickers: String { return self._s[867]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[868]! } + public var GroupPermission_Delete: String { return self._s[863]! } + public var Passport_Language_uk: String { return self._s[864]! } + public var StickerPack_HideStickers: String { return self._s[866]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[867]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[869]!, self._r[869]!, [_1, _2]) + return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[870]! } + public var Activity_UploadingVideoMessage: String { return self._s[869]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_0]) + return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[872]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[873]! } - public var Settings_CallSettings: String { return self._s[874]! } - public var Camera_SquareMode: String { return self._s[875]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[876]! } - public var GroupInfo_SharedMediaNone: String { return self._s[877]! } + public var Channel_TitleInfo: String { return self._s[871]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[872]! } + public var Settings_CallSettings: String { return self._s[873]! } + public var Camera_SquareMode: String { return self._s[874]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[875]! } + public var GroupInfo_SharedMediaNone: String { return self._s[876]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[878]!, self._r[878]!, [_1]) + return formatWithArgumentRanges(self._s[877]!, self._r[877]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[879]! } - public var Application_Update: String { return self._s[881]! } - public var Month_ShortJanuary: String { return self._s[882]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[883]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[884]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[885]! } - public var Passport_Address_Street2Placeholder: String { return self._s[886]! } + public var Bot_GenericBotStatus: String { return self._s[878]! } + public var Application_Update: String { return self._s[880]! } + public var Month_ShortJanuary: String { return self._s[881]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[882]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[883]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[884]! } + public var Passport_Address_Street2Placeholder: String { return self._s[885]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[887]!, self._r[887]!, [_0]) + return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[888]! } - public var Appearance_PreviewOutgoingText: String { return self._s[889]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[890]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[892]! } - public var Map_Directions: String { return self._s[893]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[895]! } - public var Appearance_ThemeDay: String { return self._s[896]! } - public var LogoutOptions_LogOut: String { return self._s[897]! } - public var Group_PublicLink_Title: String { return self._s[899]! } - public var Channel_AddBotErrorNoRights: String { return self._s[900]! } - public var Passport_Identity_AddPassport: String { return self._s[901]! } - public var LocalGroup_ButtonTitle: String { return self._s[902]! } - public var Call_Message: String { return self._s[903]! } - public var PhotoEditor_ExposureTool: String { return self._s[904]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[906]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[908]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[909]! } - public var Appearance_Preview: String { return self._s[910]! } - public var Compose_ChannelMembers: String { return self._s[911]! } - public var Conversation_DeleteManyMessages: String { return self._s[912]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[913]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[914]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[915]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[918]! } - public var Conversation_UpdateTelegram: String { return self._s[919]! } + public var NetworkUsageSettings_Cellular: String { return self._s[887]! } + public var Appearance_PreviewOutgoingText: String { return self._s[888]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[889]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[891]! } + public var Map_Directions: String { return self._s[892]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[894]! } + public var Appearance_ThemeDay: String { return self._s[895]! } + public var LogoutOptions_LogOut: String { return self._s[896]! } + public var Group_PublicLink_Title: String { return self._s[898]! } + public var Channel_AddBotErrorNoRights: String { return self._s[899]! } + public var Passport_Identity_AddPassport: String { return self._s[900]! } + public var LocalGroup_ButtonTitle: String { return self._s[901]! } + public var Call_Message: String { return self._s[902]! } + public var PhotoEditor_ExposureTool: String { return self._s[903]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[905]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[907]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[908]! } + public var Appearance_Preview: String { return self._s[909]! } + public var Compose_ChannelMembers: String { return self._s[910]! } + public var Conversation_DeleteManyMessages: String { return self._s[911]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[912]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[913]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[914]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[917]! } + public var Conversation_UpdateTelegram: String { return self._s[918]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_0]) + return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_1]) + return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[922]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[923]! } + public var GroupInfo_Administrators_Title: String { return self._s[921]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[922]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) + return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_0]) } - public var Tour_Title3: String { return self._s[925]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[926]! } - public var Clipboard_SendPhoto: String { return self._s[930]! } - public var MediaPicker_Videos: String { return self._s[931]! } - public var Passport_Email_Title: String { return self._s[932]! } + public var Tour_Title3: String { return self._s[924]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[925]! } + public var Clipboard_SendPhoto: String { return self._s[929]! } + public var MediaPicker_Videos: String { return self._s[930]! } + public var Passport_Email_Title: String { return self._s[931]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[933]!, self._r[933]!, [_0]) + return formatWithArgumentRanges(self._s[932]!, self._r[932]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[934]! } - public var Conversation_MessageDialogDelete: String { return self._s[935]! } - public var Privacy_Calls_CustomHelp: String { return self._s[937]! } - public var Message_Wallpaper: String { return self._s[938]! } - public var MemberSearch_BotSection: String { return self._s[939]! } - public var GroupInfo_SetSound: String { return self._s[940]! } - public var Core_ServiceUserStatus: String { return self._s[941]! } - public var LiveLocationUpdated_JustNow: String { return self._s[942]! } - public var Call_StatusFailed: String { return self._s[943]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[944]! } - public var TwoStepAuth_SetPassword: String { return self._s[945]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[946]! } + public var StickerPacksSettings_Title: String { return self._s[933]! } + public var Conversation_MessageDialogDelete: String { return self._s[934]! } + public var Privacy_Calls_CustomHelp: String { return self._s[936]! } + public var Message_Wallpaper: String { return self._s[937]! } + public var MemberSearch_BotSection: String { return self._s[938]! } + public var GroupInfo_SetSound: String { return self._s[939]! } + public var Core_ServiceUserStatus: String { return self._s[940]! } + public var LiveLocationUpdated_JustNow: String { return self._s[941]! } + public var Call_StatusFailed: String { return self._s[942]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[943]! } + public var TwoStepAuth_SetPassword: String { return self._s[944]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[945]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[948]!, self._r[948]!, [_0]) + return formatWithArgumentRanges(self._s[947]!, self._r[947]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[949]! } - public var Profile_Username: String { return self._s[950]! } - public var Bot_DescriptionTitle: String { return self._s[951]! } - public var MaskStickerSettings_Title: String { return self._s[952]! } - public var SharedMedia_CategoryOther: String { return self._s[953]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[954]! } - public var Common_NotNow: String { return self._s[955]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[956]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[957]! } - public var Map_Location: String { return self._s[958]! } - public var Invitation_JoinGroup: String { return self._s[959]! } - public var AutoDownloadSettings_Title: String { return self._s[961]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[962]! } - public var Channel_ErrorAddBlocked: String { return self._s[963]! } - public var Conversation_UnblockUser: String { return self._s[964]! } - public var Watch_Bot_Restart: String { return self._s[965]! } - public var TwoStepAuth_Title: String { return self._s[966]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[967]! } - public var Checkout_ShippingMethod: String { return self._s[968]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[969]! } + public var Calls_SubmitRating: String { return self._s[948]! } + public var Profile_Username: String { return self._s[949]! } + public var Bot_DescriptionTitle: String { return self._s[950]! } + public var MaskStickerSettings_Title: String { return self._s[951]! } + public var SharedMedia_CategoryOther: String { return self._s[952]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[953]! } + public var Common_NotNow: String { return self._s[954]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[955]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[956]! } + public var Map_Location: String { return self._s[957]! } + public var Invitation_JoinGroup: String { return self._s[958]! } + public var AutoDownloadSettings_Title: String { return self._s[960]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[961]! } + public var Channel_ErrorAddBlocked: String { return self._s[962]! } + public var Conversation_UnblockUser: String { return self._s[963]! } + public var Watch_Bot_Restart: String { return self._s[964]! } + public var TwoStepAuth_Title: String { return self._s[965]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[966]! } + public var Checkout_ShippingMethod: String { return self._s[967]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[968]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[970]!, self._r[970]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) + return formatWithArgumentRanges(self._s[971]!, self._r[971]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[973]!, self._r[973]!, [_0]) + return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[974]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[975]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[976]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[977]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[978]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[979]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[980]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[981]! } - public var Checkout_PaymentMethod_Title: String { return self._s[982]! } - public var SocksProxySetup_Connection: String { return self._s[983]! } - public var Group_MessagePhotoRemoved: String { return self._s[984]! } - public var Channel_Stickers_NotFound: String { return self._s[986]! } - public var Group_About_Help: String { return self._s[987]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[988]! } - public var PeopleNearby_Title: String { return self._s[990]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[973]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[974]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[975]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[976]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[977]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[978]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[979]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[980]! } + public var Checkout_PaymentMethod_Title: String { return self._s[981]! } + public var SocksProxySetup_Connection: String { return self._s[982]! } + public var Group_MessagePhotoRemoved: String { return self._s[983]! } + public var Channel_Stickers_NotFound: String { return self._s[985]! } + public var Group_About_Help: String { return self._s[986]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[987]! } + public var PeopleNearby_Title: String { return self._s[989]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[991]!, self._r[991]!, [_1]) + return formatWithArgumentRanges(self._s[990]!, self._r[990]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[993]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[994]! } - public var SocksProxySetup_Password: String { return self._s[995]! } - public var Notifications_PermissionsEnable: String { return self._s[996]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[998]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[992]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[993]! } + public var SocksProxySetup_Password: String { return self._s[994]! } + public var Notifications_PermissionsEnable: String { return self._s[995]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[997]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[999]!, self._r[999]!, [_1]) + return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_0]) + return formatWithArgumentRanges(self._s[1000]!, self._r[1000]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1002]! } - public var ArchivedPacksAlert_Title: String { return self._s[1003]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1001]! } + public var ArchivedPacksAlert_Title: String { return self._s[1002]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1003]!, self._r[1003]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1005]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1007]! } - public var Conversation_StatusTyping: String { return self._s[1008]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1009]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1010]! } - public var UserInfo_CreateNewContact: String { return self._s[1011]! } - public var Passport_Identity_FrontSide: String { return self._s[1012]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1013]! } - public var Calls_CallTabTitle: String { return self._s[1014]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1015]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1004]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1006]! } + public var Conversation_StatusTyping: String { return self._s[1007]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1008]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1009]! } + public var UserInfo_CreateNewContact: String { return self._s[1010]! } + public var Passport_Identity_FrontSide: String { return self._s[1011]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1012]! } + public var Calls_CallTabTitle: String { return self._s[1013]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1014]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_0]) + return formatWithArgumentRanges(self._s[1016]!, self._r[1016]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1018]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1019]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1020]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1021]! } - public var Paint_Stickers: String { return self._s[1022]! } - public var Privacy_GroupsAndChannels: String { return self._s[1023]! } - public var UserInfo_AddContact: String { return self._s[1025]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1017]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1018]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1019]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1020]! } + public var Paint_Stickers: String { return self._s[1021]! } + public var Privacy_GroupsAndChannels: String { return self._s[1022]! } + public var UserInfo_AddContact: String { return self._s[1024]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_0]) + return formatWithArgumentRanges(self._s[1025]!, self._r[1025]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1028]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1027]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1030]!, self._r[1030]!, [_0]) + return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1031]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1032]! } - public var BlockedUsers_BlockUser: String { return self._s[1033]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1034]! } - public var MediaPicker_UngroupDescription: String { return self._s[1035]! } - public var Watch_NoConnection: String { return self._s[1036]! } - public var Month_GenSeptember: String { return self._s[1037]! } - public var Conversation_ViewGroup: String { return self._s[1038]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1041]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1042]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1043]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1044]! } - public var MediaPicker_CameraRoll: String { return self._s[1046]! } - public var Month_GenAugust: String { return self._s[1047]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1048]! } - public var SharedMedia_EmptyText: String { return self._s[1049]! } - public var Map_ShareLiveLocation: String { return self._s[1050]! } - public var Calls_All: String { return self._s[1051]! } - public var Appearance_ThemeNight: String { return self._s[1054]! } - public var Conversation_HoldForAudio: String { return self._s[1055]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1058]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1059]! } - public var SocksProxySetup_Secret: String { return self._s[1060]! } + public var DialogList_NoMessagesTitle: String { return self._s[1030]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1031]! } + public var BlockedUsers_BlockUser: String { return self._s[1032]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1033]! } + public var MediaPicker_UngroupDescription: String { return self._s[1034]! } + public var Watch_NoConnection: String { return self._s[1035]! } + public var Month_GenSeptember: String { return self._s[1036]! } + public var Conversation_ViewGroup: String { return self._s[1037]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1040]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1041]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1042]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1043]! } + public var MediaPicker_CameraRoll: String { return self._s[1045]! } + public var Month_GenAugust: String { return self._s[1046]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1047]! } + public var SharedMedia_EmptyText: String { return self._s[1048]! } + public var Map_ShareLiveLocation: String { return self._s[1049]! } + public var Calls_All: String { return self._s[1050]! } + public var Appearance_ThemeNight: String { return self._s[1053]! } + public var Conversation_HoldForAudio: String { return self._s[1054]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1057]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1058]! } + public var SocksProxySetup_Secret: String { return self._s[1059]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_0]) + return formatWithArgumentRanges(self._s[1060]!, self._r[1060]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1063]! } - public var Conversation_Location: String { return self._s[1064]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1062]! } + public var Conversation_Location: String { return self._s[1063]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1065]!, self._r[1065]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1064]!, self._r[1064]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1067]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1068]! } - public var Notifications_PermissionsText: String { return self._s[1069]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1070]! } - public var Call_Flip: String { return self._s[1071]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1073]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1074]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1076]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1078]! } - public var Channel_TooMuchBots: String { return self._s[1080]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1081]! } - public var Login_InvalidCodeError: String { return self._s[1082]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1083]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1066]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1067]! } + public var Notifications_PermissionsText: String { return self._s[1068]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1069]! } + public var Call_Flip: String { return self._s[1070]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1072]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1073]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1075]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1077]! } + public var Channel_TooMuchBots: String { return self._s[1079]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1080]! } + public var Login_InvalidCodeError: String { return self._s[1081]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1082]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1084]!, self._r[1084]!, [_0]) + return formatWithArgumentRanges(self._s[1083]!, self._r[1083]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0]) + return formatWithArgumentRanges(self._s[1084]!, self._r[1084]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1086]! } - public var Call_CallInProgressTitle: String { return self._s[1087]! } - public var Month_ShortSeptember: String { return self._s[1088]! } - public var Watch_ChannelInfo_Title: String { return self._s[1089]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1092]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1093]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1094]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1095]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1096]! } - public var PhotoEditor_CropReset: String { return self._s[1097]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1099]! } - public var Channel_Management_LabelEditor: String { return self._s[1100]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1102]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1103]! } - public var UserInfo_Title: String { return self._s[1104]! } - public var ChatList_HideAction: String { return self._s[1105]! } - public var AccessDenied_Title: String { return self._s[1106]! } - public var DialogList_SearchLabel: String { return self._s[1107]! } - public var Group_Setup_HistoryHidden: String { return self._s[1108]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1109]! } - public var State_Updating: String { return self._s[1111]! } - public var Contacts_TabTitle: String { return self._s[1112]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1114]! } - public var GroupInfo_GroupHistory: String { return self._s[1115]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1116]! } - public var Wallpaper_SetColor: String { return self._s[1117]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1118]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1119]! } - public var Chat_AttachmentLimitReached: String { return self._s[1120]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1121]! } - public var Contacts_NotRegisteredSection: String { return self._s[1122]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1085]! } + public var Call_CallInProgressTitle: String { return self._s[1086]! } + public var Month_ShortSeptember: String { return self._s[1087]! } + public var Watch_ChannelInfo_Title: String { return self._s[1088]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1091]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1092]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1093]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1094]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1095]! } + public var PhotoEditor_CropReset: String { return self._s[1096]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1098]! } + public var Channel_Management_LabelEditor: String { return self._s[1099]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1101]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1102]! } + public var UserInfo_Title: String { return self._s[1103]! } + public var ChatList_HideAction: String { return self._s[1104]! } + public var AccessDenied_Title: String { return self._s[1105]! } + public var DialogList_SearchLabel: String { return self._s[1106]! } + public var Group_Setup_HistoryHidden: String { return self._s[1107]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1108]! } + public var State_Updating: String { return self._s[1110]! } + public var Contacts_TabTitle: String { return self._s[1111]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1113]! } + public var GroupInfo_GroupHistory: String { return self._s[1114]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1115]! } + public var Wallpaper_SetColor: String { return self._s[1116]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1117]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1118]! } + public var Chat_AttachmentLimitReached: String { return self._s[1119]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1120]! } + public var Contacts_NotRegisteredSection: String { return self._s[1121]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1123]!, self._r[1123]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1122]!, self._r[1122]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1124]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1125]! } - public var SocksProxySetup_Connecting: String { return self._s[1126]! } - public var ExplicitContent_AlertChannel: String { return self._s[1127]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1128]! } - public var Conversation_Contact: String { return self._s[1129]! } - public var Login_CodeExpired: String { return self._s[1130]! } - public var Passport_DiscardMessageAction: String { return self._s[1131]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1132]! } + public var Paint_Clear: String { return self._s[1123]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1124]! } + public var SocksProxySetup_Connecting: String { return self._s[1125]! } + public var ExplicitContent_AlertChannel: String { return self._s[1126]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1127]! } + public var Conversation_Contact: String { return self._s[1128]! } + public var Login_CodeExpired: String { return self._s[1129]! } + public var Passport_DiscardMessageAction: String { return self._s[1130]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1131]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1133]!, self._r[1133]!, [_0]) + return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1134]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1135]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1133]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1134]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1136]!, self._r[1136]!, [_0]) + return formatWithArgumentRanges(self._s[1135]!, self._r[1135]!, [_0]) } - public var Month_ShortApril: String { return self._s[1137]! } - public var AuthSessions_CurrentSession: String { return self._s[1138]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1141]! } - public var WallpaperPreview_CropTopText: String { return self._s[1143]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1144]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1145]! } + public var Month_ShortApril: String { return self._s[1136]! } + public var AuthSessions_CurrentSession: String { return self._s[1137]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1140]! } + public var WallpaperPreview_CropTopText: String { return self._s[1142]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1143]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1144]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1146]!, self._r[1146]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1145]!, self._r[1145]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1147]! } - public var Channel_Setup_TypePrivate: String { return self._s[1149]! } - public var Forward_ChannelReadOnly: String { return self._s[1152]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1153]! } - public var AddContact_SharedContactException: String { return self._s[1154]! } - public var UserInfo_BotPrivacy: String { return self._s[1156]! } - public var Notification_PassportValueEmail: String { return self._s[1157]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1158]! } - public var GroupPermission_NewTitle: String { return self._s[1159]! } - public var CallFeedback_ReasonDropped: String { return self._s[1160]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1161]! } - public var Channel_SignMessages_Help: String { return self._s[1163]! } - public var Undo_ChatDeleted: String { return self._s[1165]! } - public var Conversation_ChatBackground: String { return self._s[1166]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1167]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1168]! } - public var Passport_Language_pt: String { return self._s[1169]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1170]! } - public var NotificationsSound_Popcorn: String { return self._s[1173]! } - public var AutoNightTheme_Disabled: String { return self._s[1174]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1175]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1176]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1177]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1178]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1146]! } + public var Channel_Setup_TypePrivate: String { return self._s[1148]! } + public var Forward_ChannelReadOnly: String { return self._s[1151]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1152]! } + public var AddContact_SharedContactException: String { return self._s[1153]! } + public var UserInfo_BotPrivacy: String { return self._s[1155]! } + public var Notification_PassportValueEmail: String { return self._s[1156]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1157]! } + public var GroupPermission_NewTitle: String { return self._s[1158]! } + public var CallFeedback_ReasonDropped: String { return self._s[1159]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1160]! } + public var Channel_SignMessages_Help: String { return self._s[1162]! } + public var Undo_ChatDeleted: String { return self._s[1164]! } + public var Conversation_ChatBackground: String { return self._s[1165]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1166]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1167]! } + public var Passport_Language_pt: String { return self._s[1168]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1169]! } + public var NotificationsSound_Popcorn: String { return self._s[1172]! } + public var AutoNightTheme_Disabled: String { return self._s[1173]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1174]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1175]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1176]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1177]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1179]!, self._r[1179]!, [_0]) + return formatWithArgumentRanges(self._s[1178]!, self._r[1178]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1180]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1181]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1183]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1179]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1180]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1182]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1184]!, self._r[1184]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1183]!, self._r[1183]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1187]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1188]! } - public var Compose_NewEncryptedChat: String { return self._s[1189]! } - public var Login_CodeFloodError: String { return self._s[1190]! } - public var Calls_TabTitle: String { return self._s[1191]! } - public var Privacy_ProfilePhoto: String { return self._s[1192]! } - public var Passport_Language_he: String { return self._s[1193]! } + public var SocksProxySetup_Hostname: String { return self._s[1186]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1187]! } + public var Compose_NewEncryptedChat: String { return self._s[1188]! } + public var Login_CodeFloodError: String { return self._s[1189]! } + public var Calls_TabTitle: String { return self._s[1190]! } + public var Privacy_ProfilePhoto: String { return self._s[1191]! } + public var Passport_Language_he: String { return self._s[1192]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1194]!, self._r[1194]!, [_0]) + return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1195]! } + public var GroupPermission_Title: String { return self._s[1194]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1196]!, self._r[1196]!, [_0]) + return formatWithArgumentRanges(self._s[1195]!, self._r[1195]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1197]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1198]! } - public var Tour_Text1: String { return self._s[1199]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1200]! } - public var Month_ShortFebruary: String { return self._s[1201]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1202]! } - public var NotificationsSound_Glass: String { return self._s[1203]! } - public var Appearance_ThemeNightBlue: String { return self._s[1204]! } - public var CheckoutInfo_Pay: String { return self._s[1205]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1207]! } - public var Call_CallAgain: String { return self._s[1209]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1210]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1211]! } - public var Passport_InvalidPasswordError: String { return self._s[1212]! } - public var Watch_Message_Game: String { return self._s[1213]! } - public var Stickers_Install: String { return self._s[1214]! } - public var VoiceOver_Chat_Message: String { return self._s[1215]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1216]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1218]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1219]! } - public var AuthSessions_OtherSessions: String { return self._s[1220]! } - public var Channel_Username_Help: String { return self._s[1221]! } - public var Camera_Title: String { return self._s[1222]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1224]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1225]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1226]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1227]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1228]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1229]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1230]! } - public var Conversation_RestrictedStickers: String { return self._s[1231]! } - public var CreateTheme_Preview: String { return self._s[1232]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1234]! } - public var UserInfo_TelegramCall: String { return self._s[1236]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1237]! } - public var CreatePoll_OptionsHeader: String { return self._s[1238]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1239]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1240]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1241]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1242]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1196]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1197]! } + public var Tour_Text1: String { return self._s[1198]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1199]! } + public var Month_ShortFebruary: String { return self._s[1200]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1201]! } + public var NotificationsSound_Glass: String { return self._s[1202]! } + public var Appearance_ThemeNightBlue: String { return self._s[1203]! } + public var CheckoutInfo_Pay: String { return self._s[1204]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1206]! } + public var Call_CallAgain: String { return self._s[1208]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1209]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1210]! } + public var Passport_InvalidPasswordError: String { return self._s[1211]! } + public var Watch_Message_Game: String { return self._s[1212]! } + public var Stickers_Install: String { return self._s[1213]! } + public var VoiceOver_Chat_Message: String { return self._s[1214]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1215]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1217]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1218]! } + public var AuthSessions_OtherSessions: String { return self._s[1219]! } + public var Channel_Username_Help: String { return self._s[1220]! } + public var Camera_Title: String { return self._s[1221]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1223]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1224]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1225]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1226]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1227]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1228]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1229]! } + public var Conversation_RestrictedStickers: String { return self._s[1230]! } + public var CreateTheme_Preview: String { return self._s[1231]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1233]! } + public var UserInfo_TelegramCall: String { return self._s[1235]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1236]! } + public var CreatePoll_OptionsHeader: String { return self._s[1237]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1238]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1239]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1240]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1241]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1243]!, self._r[1243]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1242]!, self._r[1242]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1244]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1245]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1246]! } - public var Conversation_MessageDialogRetry: String { return self._s[1247]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1248]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1249]! } - public var Group_Setup_TypeHeader: String { return self._s[1250]! } - public var Paint_RecentStickers: String { return self._s[1251]! } - public var PhotoEditor_GrainTool: String { return self._s[1252]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1253]! } - public var EmptyGroupInfo_Line4: String { return self._s[1254]! } - public var Watch_AuthRequired: String { return self._s[1256]! } + public var Settings_SaveEditedPhotos: String { return self._s[1243]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1244]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1245]! } + public var Conversation_MessageDialogRetry: String { return self._s[1246]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1247]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1248]! } + public var Group_Setup_TypeHeader: String { return self._s[1249]! } + public var Paint_RecentStickers: String { return self._s[1250]! } + public var PhotoEditor_GrainTool: String { return self._s[1251]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1252]! } + public var EmptyGroupInfo_Line4: String { return self._s[1253]! } + public var Watch_AuthRequired: String { return self._s[1255]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1257]!, self._r[1257]!, [_0]) + return formatWithArgumentRanges(self._s[1256]!, self._r[1256]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1258]! } - public var ChannelIntro_Text: String { return self._s[1259]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1260]! } - public var GroupPermission_NoSendMedia: String { return self._s[1261]! } - public var Calls_AddTab: String { return self._s[1262]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1263]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1264]! } - public var Notification_MessageLifetime1d: String { return self._s[1265]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1266]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1267]! } - public var Passport_Identity_GenderFemale: String { return self._s[1268]! } - public var BlockedUsers_BlockTitle: String { return self._s[1269]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1257]! } + public var ChannelIntro_Text: String { return self._s[1258]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1259]! } + public var GroupPermission_NoSendMedia: String { return self._s[1260]! } + public var Calls_AddTab: String { return self._s[1261]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1262]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1263]! } + public var Notification_MessageLifetime1d: String { return self._s[1264]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1265]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1266]! } + public var Passport_Identity_GenderFemale: String { return self._s[1267]! } + public var BlockedUsers_BlockTitle: String { return self._s[1268]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_1]) + return formatWithArgumentRanges(self._s[1269]!, self._r[1269]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1271]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1272]! } - public var ChatList_ArchiveAction: String { return self._s[1273]! } - public var AutoNightTheme_Scheduled: String { return self._s[1274]! } + public var Weekday_Yesterday: String { return self._s[1270]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1271]! } + public var ChatList_ArchiveAction: String { return self._s[1272]! } + public var AutoNightTheme_Scheduled: String { return self._s[1273]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1275]!, self._r[1275]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1276]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1275]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1276]!, self._r[1276]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1278]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1279]! } + public var CreatePoll_Create: String { return self._s[1277]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1278]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1281]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1282]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1284]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1280]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1281]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1283]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1]) + return formatWithArgumentRanges(self._s[1284]!, self._r[1284]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1286]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1287]! } + public var Preview_OpenInInstagram: String { return self._s[1285]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1286]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1288]!, self._r[1288]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1289]!, self._r[1289]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1288]!, self._r[1288]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1290]! } - public var ArchivedChats_IntroText3: String { return self._s[1291]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1292]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1293]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1294]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1289]! } + public var ArchivedChats_IntroText3: String { return self._s[1290]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1291]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1292]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1293]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1295]!, self._r[1295]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1294]!, self._r[1294]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1297]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1298]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1299]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1300]! } - public var Gif_NoGifsFound: String { return self._s[1301]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1302]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1303]! } - public var GroupInfo_ActionPromote: String { return self._s[1304]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1305]! } - public var GroupInfo_Permissions_Title: String { return self._s[1306]! } - public var Permissions_ContactsText_v0: String { return self._s[1307]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1308]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1309]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1312]! } - public var Passport_FieldEmailHelp: String { return self._s[1313]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1296]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1297]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1298]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1299]! } + public var Gif_NoGifsFound: String { return self._s[1300]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1301]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1302]! } + public var GroupInfo_ActionPromote: String { return self._s[1303]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1304]! } + public var GroupInfo_Permissions_Title: String { return self._s[1305]! } + public var Permissions_ContactsText_v0: String { return self._s[1306]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1307]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1308]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1311]! } + public var Passport_FieldEmailHelp: String { return self._s[1312]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_0]) + return formatWithArgumentRanges(self._s[1313]!, self._r[1313]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1315]! } - public var Weekday_ShortSaturday: String { return self._s[1316]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1317]! } - public var Watch_Conversation_UserInfo: String { return self._s[1318]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1319]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1320]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1321]! } - public var PhotoEditor_VignetteTool: String { return self._s[1322]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1323]! } - public var Passport_Language_et: String { return self._s[1324]! } - public var AppUpgrade_Running: String { return self._s[1325]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1327]! } - public var Passport_Language_bg: String { return self._s[1328]! } - public var Stickers_NoStickersFound: String { return self._s[1330]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1314]! } + public var Weekday_ShortSaturday: String { return self._s[1315]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1316]! } + public var Watch_Conversation_UserInfo: String { return self._s[1317]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1318]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1319]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1320]! } + public var PhotoEditor_VignetteTool: String { return self._s[1321]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1322]! } + public var Passport_Language_et: String { return self._s[1323]! } + public var AppUpgrade_Running: String { return self._s[1324]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1326]! } + public var Passport_Language_bg: String { return self._s[1327]! } + public var Stickers_NoStickersFound: String { return self._s[1329]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_0]) + return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_0]) } - public var Settings_About: String { return self._s[1334]! } + public var Settings_About: String { return self._s[1333]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1335]!, self._r[1335]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1337]! } - public var Group_ErrorAddBlocked: String { return self._s[1338]! } + public var KeyCommand_NewMessage: String { return self._s[1336]! } + public var Group_ErrorAddBlocked: String { return self._s[1337]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1339]!, self._r[1339]!, [_0]) + return formatWithArgumentRanges(self._s[1338]!, self._r[1338]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1340]! } - public var ReportGroupLocation_Title: String { return self._s[1341]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1342]! } - public var Cache_ClearProgress: String { return self._s[1343]! } + public var Map_LocationTitle: String { return self._s[1339]! } + public var ReportGroupLocation_Title: String { return self._s[1340]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1341]! } + public var Cache_ClearProgress: String { return self._s[1342]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_0]) + return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1345]! } - public var Passport_UpdateRequiredError: String { return self._s[1346]! } + public var GroupRemoved_AddToGroup: String { return self._s[1344]! } + public var Passport_UpdateRequiredError: String { return self._s[1345]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_1]) + return formatWithArgumentRanges(self._s[1346]!, self._r[1346]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1349]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1350]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1351]! } - public var Passport_Language_ka: String { return self._s[1352]! } - public var Call_Decline: String { return self._s[1353]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1354]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1348]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1349]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1350]! } + public var Passport_Language_ka: String { return self._s[1351]! } + public var Call_Decline: String { return self._s[1352]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1353]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_0]) + return formatWithArgumentRanges(self._s[1356]!, self._r[1356]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1358]! } + public var CallFeedback_Send: String { return self._s[1357]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1358]!, self._r[1358]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1360]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1362]! } - public var Passport_DeletePassport: String { return self._s[1363]! } - public var Appearance_AppIconFilled: String { return self._s[1364]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1365]! } - public var Month_ShortDecember: String { return self._s[1366]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1368]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1359]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1361]! } + public var Passport_DeletePassport: String { return self._s[1362]! } + public var Appearance_AppIconFilled: String { return self._s[1363]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1364]! } + public var Month_ShortDecember: String { return self._s[1365]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1367]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_0]) + return formatWithArgumentRanges(self._s[1368]!, self._r[1368]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1370]! } - public var Conversation_EncryptedDescription1: String { return self._s[1371]! } - public var Conversation_EncryptedDescription2: String { return self._s[1372]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1373]! } - public var Conversation_EncryptedDescription3: String { return self._s[1374]! } - public var PhotoEditor_SharpenTool: String { return self._s[1375]! } + public var Channel_Stickers_Searching: String { return self._s[1369]! } + public var Conversation_EncryptedDescription1: String { return self._s[1370]! } + public var Conversation_EncryptedDescription2: String { return self._s[1371]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1372]! } + public var Conversation_EncryptedDescription3: String { return self._s[1373]! } + public var PhotoEditor_SharpenTool: String { return self._s[1374]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_0]) + return formatWithArgumentRanges(self._s[1375]!, self._r[1375]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1378]! } - public var Channel_Members_AddMembers: String { return self._s[1379]! } - public var Wallpaper_Search: String { return self._s[1380]! } - public var Weekday_Friday: String { return self._s[1381]! } - public var Privacy_ContactsSync: String { return self._s[1382]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1383]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1384]! } + public var Conversation_EncryptedDescription4: String { return self._s[1377]! } + public var Channel_Members_AddMembers: String { return self._s[1378]! } + public var Wallpaper_Search: String { return self._s[1379]! } + public var Weekday_Friday: String { return self._s[1380]! } + public var Privacy_ContactsSync: String { return self._s[1381]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1382]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1383]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_0]) + return formatWithArgumentRanges(self._s[1384]!, self._r[1384]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1386]! } - public var Passport_Identity_GenderMale: String { return self._s[1387]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1385]! } + public var Passport_Identity_GenderMale: String { return self._s[1386]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1388]!, self._r[1388]!, [_0]) + return formatWithArgumentRanges(self._s[1387]!, self._r[1387]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1389]! } - public var Conversation_JumpToDate: String { return self._s[1390]! } - public var Contacts_GlobalSearch: String { return self._s[1391]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1392]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1393]! } - public var Profile_MessageLifetime1d: String { return self._s[1394]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1388]! } + public var Conversation_JumpToDate: String { return self._s[1389]! } + public var Contacts_GlobalSearch: String { return self._s[1390]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1391]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1392]! } + public var Profile_MessageLifetime1d: String { return self._s[1393]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1395]!, self._r[1395]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1398]! } + public var StickerPack_BuiltinPackName: String { return self._s[1397]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1400]! } - public var Passport_InfoTitle: String { return self._s[1402]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1403]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1399]! } + public var Passport_InfoTitle: String { return self._s[1401]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1402]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_0]) + return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1409]! } - public var Profile_BotInfo: String { return self._s[1410]! } - public var Watch_Compose_CreateMessage: String { return self._s[1411]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1412]! } - public var Month_ShortNovember: String { return self._s[1413]! } - public var Conversation_ScamWarning: String { return self._s[1414]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1415]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1416]! } - public var NotificationsSound_Chime: String { return self._s[1417]! } - public var Passport_Language_ko: String { return self._s[1419]! } - public var InviteText_URL: String { return self._s[1420]! } - public var TextFormat_Monospace: String { return self._s[1421]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1408]! } + public var Profile_BotInfo: String { return self._s[1409]! } + public var Watch_Compose_CreateMessage: String { return self._s[1410]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1411]! } + public var Month_ShortNovember: String { return self._s[1412]! } + public var Conversation_ScamWarning: String { return self._s[1413]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1414]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1415]! } + public var NotificationsSound_Chime: String { return self._s[1416]! } + public var Passport_Language_ko: String { return self._s[1418]! } + public var InviteText_URL: String { return self._s[1419]! } + public var TextFormat_Monospace: String { return self._s[1420]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0]) + return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1426]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1427]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1428]! } - public var Your_card_has_expired: String { return self._s[1429]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1430]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1431]! } - public var Conversation_Report: String { return self._s[1435]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1436]! } - public var Notification_MessageLifetime1m: String { return self._s[1437]! } - public var Privacy_ContactsTitle: String { return self._s[1438]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1439]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1440]! } - public var Channel_Members_Title: String { return self._s[1441]! } - public var Map_OpenInWaze: String { return self._s[1442]! } - public var Login_PhoneBannedError: String { return self._s[1443]! } + public var Passport_InfoLearnMore: String { return self._s[1425]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1426]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1427]! } + public var Your_card_has_expired: String { return self._s[1428]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1429]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1430]! } + public var Conversation_Report: String { return self._s[1434]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1435]! } + public var Notification_MessageLifetime1m: String { return self._s[1436]! } + public var Privacy_ContactsTitle: String { return self._s[1437]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1438]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1439]! } + public var Channel_Members_Title: String { return self._s[1440]! } + public var Map_OpenInWaze: String { return self._s[1441]! } + public var Login_PhoneBannedError: String { return self._s[1442]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1444]!, self._r[1444]!, [_0]) + return formatWithArgumentRanges(self._s[1443]!, self._r[1443]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1445]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1446]! } - public var Common_OK: String { return self._s[1447]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1448]! } - public var Cache_Music: String { return self._s[1449]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1450]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1451]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1452]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1444]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1445]! } + public var Common_OK: String { return self._s[1446]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1447]! } + public var Cache_Music: String { return self._s[1448]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1449]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1450]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1451]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1]) + return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1454]!, self._r[1454]!, [_0]) + return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_0]) } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1455]!, self._r[1455]!, [_0]) + return formatWithArgumentRanges(self._s[1454]!, self._r[1454]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1457]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1458]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1460]! } - public var State_ConnectingToProxyInfo: String { return self._s[1461]! } - public var Message_VideoMessage: String { return self._s[1463]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1464]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1465]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1466]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1467]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1468]! } - public var Activity_RecordingAudio: String { return self._s[1469]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1470]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1471]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1456]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1457]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1459]! } + public var State_ConnectingToProxyInfo: String { return self._s[1460]! } + public var Message_VideoMessage: String { return self._s[1462]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1463]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1464]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1465]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1466]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1467]! } + public var Activity_RecordingAudio: String { return self._s[1468]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1469]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1470]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1477]!, self._r[1477]!, [_0]) + return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1478]! } - public var UserInfo_AddPhone: String { return self._s[1479]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1480]! } + public var Conversation_ApplyLocalization: String { return self._s[1477]! } + public var UserInfo_AddPhone: String { return self._s[1478]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1479]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1481]!, self._r[1481]!, [_0]) + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0]) } - public var Passport_Scans: String { return self._s[1483]! } - public var BlockedUsers_Unblock: String { return self._s[1484]! } + public var Passport_Scans: String { return self._s[1482]! } + public var BlockedUsers_Unblock: String { return self._s[1483]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1485]!, self._r[1485]!, [_1]) + return formatWithArgumentRanges(self._s[1484]!, self._r[1484]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1486]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1487]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1488]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1489]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1490]! } + public var Channel_Management_LabelCreator: String { return self._s[1485]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1486]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1487]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1488]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1489]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1491]!, self._r[1491]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1490]!, self._r[1490]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1492]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1493]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1494]! } - public var ChannelIntro_CreateChannel: String { return self._s[1495]! } - public var Conversation_UnreadMessages: String { return self._s[1496]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1497]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1498]! } - public var Notification_GroupActivated: String { return self._s[1499]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1500]! } + public var Login_PhoneNumberHelp: String { return self._s[1491]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1492]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1493]! } + public var ChannelIntro_CreateChannel: String { return self._s[1494]! } + public var Conversation_UnreadMessages: String { return self._s[1495]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1496]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1497]! } + public var Notification_GroupActivated: String { return self._s[1498]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1499]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0]) + return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1504]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1503]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0]) + return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1506]! } - public var CallFeedback_AddComment: String { return self._s[1507]! } + public var Undo_DeletedChannel: String { return self._s[1505]! } + public var CallFeedback_AddComment: String { return self._s[1506]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) + return formatWithArgumentRanges(self._s[1507]!, self._r[1507]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1509]! } + public var Document_TargetConfirmationFormat: String { return self._s[1508]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1510]!, self._r[1510]!, [_0]) + return formatWithArgumentRanges(self._s[1509]!, self._r[1509]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1511]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1510]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1512]!, self._r[1512]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1513]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1514]! } + public var Contacts_SortByName: String { return self._s[1512]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1513]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1517]! } - public var ScheduledMessages_EditTime: String { return self._s[1518]! } - public var Conversation_ClearSelfHistory: String { return self._s[1519]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1520]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1521]! } - public var Stickers_SuggestNone: String { return self._s[1522]! } - public var ChatSettings_Cache: String { return self._s[1523]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1524]! } - public var Media_ShareThisPhoto: String { return self._s[1525]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1526]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1527]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1528]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1529]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1530]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1531]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1532]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1534]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1535]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1536]! } - public var Map_OpenIn: String { return self._s[1537]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1516]! } + public var ScheduledMessages_EditTime: String { return self._s[1517]! } + public var Conversation_ClearSelfHistory: String { return self._s[1518]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1519]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1520]! } + public var Stickers_SuggestNone: String { return self._s[1521]! } + public var ChatSettings_Cache: String { return self._s[1522]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1523]! } + public var Media_ShareThisPhoto: String { return self._s[1524]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1525]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1526]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1527]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1528]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1529]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1530]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1531]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1533]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1534]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1535]! } + public var Map_OpenIn: String { return self._s[1536]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_1]) + return formatWithArgumentRanges(self._s[1539]!, self._r[1539]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1541]!, self._r[1541]!, [_0]) + return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1542]! } - public var MessagePoll_LabelClosed: String { return self._s[1543]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1545]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1546]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1547]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1548]! } - public var Login_SelectCountry_Title: String { return self._s[1549]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1550]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1541]! } + public var MessagePoll_LabelClosed: String { return self._s[1542]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1544]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1545]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1546]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1547]! } + public var Login_SelectCountry_Title: String { return self._s[1548]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1549]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1550]!, self._r[1550]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1552]! } - public var Watch_Suggestion_BRB: String { return self._s[1553]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1554]! } - public var Contacts_PermissionsTitle: String { return self._s[1555]! } - public var Conversation_RestrictedInline: String { return self._s[1556]! } - public var StickerPack_ViewPack: String { return self._s[1558]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1551]! } + public var Watch_Suggestion_BRB: String { return self._s[1552]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1553]! } + public var Contacts_PermissionsTitle: String { return self._s[1554]! } + public var Conversation_RestrictedInline: String { return self._s[1555]! } + public var StickerPack_ViewPack: String { return self._s[1557]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_0]) + return formatWithArgumentRanges(self._s[1558]!, self._r[1558]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1561]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1564]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1566]! } - public var Channel_Info_Stickers: String { return self._s[1567]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1568]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1569]! } - public var Passport_DeletePersonalDetails: String { return self._s[1570]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1571]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1572]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1573]! } - public var Conversation_SearchNoResults: String { return self._s[1575]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1576]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1577]! } - public var Login_Code: String { return self._s[1578]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1579]! } - public var Weekday_ShortThursday: String { return self._s[1580]! } - public var Resolve_ErrorNotFound: String { return self._s[1582]! } - public var LastSeen_Offline: String { return self._s[1583]! } - public var PeopleNearby_NoMembers: String { return self._s[1584]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1585]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1586]! } - public var GroupInfo_Title: String { return self._s[1588]! } - public var NotificationsSound_Note: String { return self._s[1589]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1590]! } - public var Watch_Message_Poll: String { return self._s[1591]! } - public var Privacy_Calls: String { return self._s[1592]! } + public var Compose_NewChannel: String { return self._s[1560]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1563]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1565]! } + public var Channel_Info_Stickers: String { return self._s[1566]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1567]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1568]! } + public var Passport_DeletePersonalDetails: String { return self._s[1569]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1570]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1571]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1572]! } + public var Conversation_SearchNoResults: String { return self._s[1574]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1575]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1576]! } + public var Login_Code: String { return self._s[1577]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1578]! } + public var Weekday_ShortThursday: String { return self._s[1579]! } + public var Resolve_ErrorNotFound: String { return self._s[1581]! } + public var LastSeen_Offline: String { return self._s[1582]! } + public var PeopleNearby_NoMembers: String { return self._s[1583]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1584]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1585]! } + public var GroupInfo_Title: String { return self._s[1587]! } + public var NotificationsSound_Note: String { return self._s[1588]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1589]! } + public var Watch_Message_Poll: String { return self._s[1590]! } + public var Privacy_Calls: String { return self._s[1591]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1593]!, self._r[1593]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1592]!, self._r[1592]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1594]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1595]! } - public var Notifications_Reset: String { return self._s[1596]! } - public var Conversation_Pin: String { return self._s[1597]! } - public var Passport_Language_lv: String { return self._s[1598]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1599]! } - public var BlockedUsers_Info: String { return self._s[1600]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1602]! } - public var Watch_Conversation_Unblock: String { return self._s[1604]! } + public var Month_ShortAugust: String { return self._s[1593]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1594]! } + public var Notifications_Reset: String { return self._s[1595]! } + public var Conversation_Pin: String { return self._s[1596]! } + public var Passport_Language_lv: String { return self._s[1597]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1598]! } + public var BlockedUsers_Info: String { return self._s[1599]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1601]! } + public var Watch_Conversation_Unblock: String { return self._s[1603]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_0]) + return formatWithArgumentRanges(self._s[1604]!, self._r[1604]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1606]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1607]! } + public var CloudStorage_Title: String { return self._s[1605]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1606]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_0]) + return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1609]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1610]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1611]! } - public var Passport_Address_EditBankStatement: String { return self._s[1612]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1608]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1609]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1610]! } + public var Passport_Address_EditBankStatement: String { return self._s[1611]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1614]! } - public var ShareMenu_Comment: String { return self._s[1615]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1616]! } - public var Notifications_PermissionsTitle: String { return self._s[1617]! } - public var GroupPermission_NoSendLinks: String { return self._s[1618]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1619]! } - public var Settings_Support: String { return self._s[1620]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1621]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1622]! } - public var Privacy_Forwards_Preview: String { return self._s[1623]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1624]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1625]! } - public var Common_Select: String { return self._s[1627]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1628]! } - public var WallpaperSearch_ColorGray: String { return self._s[1630]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1631]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1632]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1633]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1634]! } - public var Widget_AuthRequired: String { return self._s[1635]! } - public var Camera_FlashOn: String { return self._s[1636]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1637]! } - public var Watch_Suggestion_OK: String { return self._s[1638]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1613]! } + public var ShareMenu_Comment: String { return self._s[1614]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1615]! } + public var Notifications_PermissionsTitle: String { return self._s[1616]! } + public var GroupPermission_NoSendLinks: String { return self._s[1617]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1618]! } + public var Settings_Support: String { return self._s[1619]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1620]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1621]! } + public var Privacy_Forwards_Preview: String { return self._s[1622]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1623]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1624]! } + public var Common_Select: String { return self._s[1626]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1627]! } + public var WallpaperSearch_ColorGray: String { return self._s[1629]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1630]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1631]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1632]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1633]! } + public var Widget_AuthRequired: String { return self._s[1634]! } + public var Camera_FlashOn: String { return self._s[1635]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1636]! } + public var Watch_Suggestion_OK: String { return self._s[1637]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_0]) + return formatWithArgumentRanges(self._s[1639]!, self._r[1639]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1642]!, self._r[1642]!, [_0]) + return formatWithArgumentRanges(self._s[1641]!, self._r[1641]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1643]! } - public var DialogList_AdLabel: String { return self._s[1644]! } - public var WatchRemote_NotificationText: String { return self._s[1645]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1646]! } - public var Conversation_ReportSpam: String { return self._s[1647]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1648]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1650]! } - public var PhoneLabel_Title: String { return self._s[1651]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1652]! } - public var Settings_ChangePhoneNumber: String { return self._s[1653]! } - public var Notifications_ExceptionsTitle: String { return self._s[1654]! } - public var Notifications_AlertTones: String { return self._s[1655]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1656]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1657]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1658]! } - public var VoiceOver_Chat_Photo: String { return self._s[1660]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1661]! } - public var ReportPeer_ReasonOther: String { return self._s[1662]! } - public var KeyCommand_ScrollDown: String { return self._s[1664]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1665]! } + public var TextFormat_Strikethrough: String { return self._s[1642]! } + public var DialogList_AdLabel: String { return self._s[1643]! } + public var WatchRemote_NotificationText: String { return self._s[1644]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1645]! } + public var Conversation_ReportSpam: String { return self._s[1646]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1647]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1649]! } + public var PhoneLabel_Title: String { return self._s[1650]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1651]! } + public var Settings_ChangePhoneNumber: String { return self._s[1652]! } + public var Notifications_ExceptionsTitle: String { return self._s[1653]! } + public var Notifications_AlertTones: String { return self._s[1654]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1655]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1656]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1657]! } + public var VoiceOver_Chat_Photo: String { return self._s[1659]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1660]! } + public var ReportPeer_ReasonOther: String { return self._s[1661]! } + public var KeyCommand_ScrollDown: String { return self._s[1663]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1664]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_0]) + return formatWithArgumentRanges(self._s[1665]!, self._r[1665]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1667]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1668]! } - public var AuthSessions_LogOut: String { return self._s[1669]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1670]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1671]! } - public var Passport_Phone_Title: String { return self._s[1672]! } - public var Settings_PhoneNumber: String { return self._s[1673]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1666]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1667]! } + public var AuthSessions_LogOut: String { return self._s[1668]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1669]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1670]! } + public var Passport_Phone_Title: String { return self._s[1671]! } + public var Settings_PhoneNumber: String { return self._s[1672]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0]) + return formatWithArgumentRanges(self._s[1673]!, self._r[1673]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1675]! } - public var WebSearch_SearchNoResults: String { return self._s[1676]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1678]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1679]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1680]! } - public var PhotoEditor_CurvesTool: String { return self._s[1681]! } - public var Checkout_PaymentMethod: String { return self._s[1683]! } + public var NotificationsSound_Alert: String { return self._s[1674]! } + public var WebSearch_SearchNoResults: String { return self._s[1675]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1677]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1678]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1679]! } + public var PhotoEditor_CurvesTool: String { return self._s[1680]! } + public var Checkout_PaymentMethod: String { return self._s[1682]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1683]!, self._r[1683]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1685]! } - public var Camera_PhotoMode: String { return self._s[1688]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1690]! } - public var CallSettings_OnMobile: String { return self._s[1691]! } - public var Tour_Text2: String { return self._s[1692]! } + public var Contacts_AccessDeniedError: String { return self._s[1684]! } + public var Camera_PhotoMode: String { return self._s[1687]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1689]! } + public var CallSettings_OnMobile: String { return self._s[1690]! } + public var Tour_Text2: String { return self._s[1691]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1692]!, self._r[1692]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1695]! } - public var Permissions_Skip: String { return self._s[1696]! } - public var SecretImage_Title: String { return self._s[1697]! } - public var Watch_MessageView_Title: String { return self._s[1698]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1699]! } - public var AttachmentMenu_Poll: String { return self._s[1700]! } + public var DialogList_EncryptionProcessing: String { return self._s[1694]! } + public var Permissions_Skip: String { return self._s[1695]! } + public var SecretImage_Title: String { return self._s[1696]! } + public var Watch_MessageView_Title: String { return self._s[1697]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1698]! } + public var AttachmentMenu_Poll: String { return self._s[1699]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_0]) + return formatWithArgumentRanges(self._s[1700]!, self._r[1700]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1702]!, self._r[1702]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1703]! } - public var WallpaperPreview_Title: String { return self._s[1704]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1705]! } - public var Settings_ProxyConnecting: String { return self._s[1706]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1708]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1709]! } - public var Profile_MessageLifetime5s: String { return self._s[1710]! } - public var Username_InvalidCharacters: String { return self._s[1711]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1712]! } - public var ScheduledMessages_ClearAll: String { return self._s[1713]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1714]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1715]! } - public var Settings_AddAccount: String { return self._s[1716]! } - public var Notification_CreatedChannel: String { return self._s[1719]! } + public var Notification_CallCanceled: String { return self._s[1702]! } + public var WallpaperPreview_Title: String { return self._s[1703]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1704]! } + public var Settings_ProxyConnecting: String { return self._s[1705]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1707]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1708]! } + public var Profile_MessageLifetime5s: String { return self._s[1709]! } + public var Username_InvalidCharacters: String { return self._s[1710]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1711]! } + public var ScheduledMessages_ClearAll: String { return self._s[1712]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1713]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1714]! } + public var Settings_AddAccount: String { return self._s[1715]! } + public var Notification_CreatedChannel: String { return self._s[1718]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1722]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1723]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1724]! } - public var Contacts_TopSection: String { return self._s[1725]! } + public var Passcode_AppLockedAlert: String { return self._s[1721]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1722]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1723]! } + public var Contacts_TopSection: String { return self._s[1724]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1726]!, self._r[1726]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1725]!, self._r[1725]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1727]!, self._r[1727]!, [_0]) + return formatWithArgumentRanges(self._s[1726]!, self._r[1726]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1728]! } - public var UserInfo_TapToCall: String { return self._s[1729]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1731]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1732]! } - public var Common_Search: String { return self._s[1733]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1734]! } + public var ReportPeer_ReasonSpam: String { return self._s[1727]! } + public var UserInfo_TapToCall: String { return self._s[1728]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1730]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1731]! } + public var Common_Search: String { return self._s[1732]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1733]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) + return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1736]! } - public var Message_InvoiceLabel: String { return self._s[1737]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1738]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1739]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1735]! } + public var Message_InvoiceLabel: String { return self._s[1736]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1737]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1738]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1740]!, self._r[1740]!, [_0]) + return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0]) } - public var Conversation_Info: String { return self._s[1741]! } - public var Login_InfoDeletePhoto: String { return self._s[1742]! } - public var Passport_Language_vi: String { return self._s[1744]! } - public var UserInfo_ScamUserWarning: String { return self._s[1745]! } - public var Conversation_Search: String { return self._s[1746]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1747]! } - public var ReportPeer_ReasonPornography: String { return self._s[1748]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1749]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1750]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1751]! } - public var Channel_Setup_TypeHeader: String { return self._s[1752]! } - public var AuthSessions_LoggedIn: String { return self._s[1753]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1754]! } - public var Login_SmsRequestState3: String { return self._s[1755]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1756]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1757]! } - public var Join_ChannelsTooMuch: String { return self._s[1758]! } - public var Channel_Edit_LinkItem: String { return self._s[1759]! } - public var Privacy_Calls_P2PNever: String { return self._s[1760]! } - public var Conversation_AddToReadingList: String { return self._s[1762]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1763]! } - public var Message_Animation: String { return self._s[1764]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1765]! } - public var Map_Unknown: String { return self._s[1766]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1767]! } + public var Conversation_Info: String { return self._s[1740]! } + public var Login_InfoDeletePhoto: String { return self._s[1741]! } + public var Passport_Language_vi: String { return self._s[1743]! } + public var UserInfo_ScamUserWarning: String { return self._s[1744]! } + public var Conversation_Search: String { return self._s[1745]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1746]! } + public var ReportPeer_ReasonPornography: String { return self._s[1747]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1748]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1749]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1750]! } + public var Channel_Setup_TypeHeader: String { return self._s[1751]! } + public var AuthSessions_LoggedIn: String { return self._s[1752]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1753]! } + public var Login_SmsRequestState3: String { return self._s[1754]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1755]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1756]! } + public var Join_ChannelsTooMuch: String { return self._s[1757]! } + public var Channel_Edit_LinkItem: String { return self._s[1758]! } + public var Privacy_Calls_P2PNever: String { return self._s[1759]! } + public var Conversation_AddToReadingList: String { return self._s[1761]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1762]! } + public var Message_Animation: String { return self._s[1763]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1764]! } + public var Map_Unknown: String { return self._s[1765]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1766]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1767]!, self._r[1767]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1770]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1771]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1772]! } + public var Call_StatusRequesting: String { return self._s[1769]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1770]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1771]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_0]) + return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_0]) } - public var Update_Skip: String { return self._s[1775]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1776]! } - public var Message_PinnedPollMessage: String { return self._s[1777]! } - public var BlockedUsers_Title: String { return self._s[1778]! } + public var Update_Skip: String { return self._s[1774]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1775]! } + public var Message_PinnedPollMessage: String { return self._s[1776]! } + public var BlockedUsers_Title: String { return self._s[1777]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1779]!, self._r[1779]!, [_1]) + return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1780]! } - public var NotificationsSound_Bell: String { return self._s[1781]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1782]! } - public var Weekday_Monday: String { return self._s[1783]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1784]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1785]! } - public var ChatSettings_Groups: String { return self._s[1786]! } + public var Username_CheckingUsername: String { return self._s[1779]! } + public var NotificationsSound_Bell: String { return self._s[1780]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1781]! } + public var Weekday_Monday: String { return self._s[1782]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1783]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1784]! } + public var ChatSettings_Groups: String { return self._s[1785]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1787]!, self._r[1787]!, [_0]) + return formatWithArgumentRanges(self._s[1786]!, self._r[1786]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1788]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1790]! } - public var ChatList_Unmute: String { return self._s[1791]! } - public var PhotoEditor_CurvesAll: String { return self._s[1792]! } - public var Weekday_ShortTuesday: String { return self._s[1793]! } - public var DialogList_Read: String { return self._s[1794]! } - public var Appearance_AppIconClassic: String { return self._s[1795]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1796]! } - public var Passport_Identity_Gender: String { return self._s[1797]! } + public var Your_card_was_declined: String { return self._s[1787]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1789]! } + public var ChatList_Unmute: String { return self._s[1790]! } + public var PhotoEditor_CurvesAll: String { return self._s[1791]! } + public var Weekday_ShortTuesday: String { return self._s[1792]! } + public var DialogList_Read: String { return self._s[1793]! } + public var Appearance_AppIconClassic: String { return self._s[1794]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1795]! } + public var Passport_Identity_Gender: String { return self._s[1796]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0]) + return formatWithArgumentRanges(self._s[1797]!, self._r[1797]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1799]! } + public var Target_SelectGroup: String { return self._s[1798]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1801]!, self._r[1801]!, [_0]) + return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_0]) } - public var Passport_Language_en: String { return self._s[1802]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1803]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1804]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1805]! } - public var ScheduledMessages_SendNow: String { return self._s[1806]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1808]! } - public var Login_InfoHelp: String { return self._s[1809]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1810]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1811]! } + public var Passport_Language_en: String { return self._s[1801]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1802]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1803]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1804]! } + public var ScheduledMessages_SendNow: String { return self._s[1805]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1807]! } + public var Login_InfoHelp: String { return self._s[1808]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1809]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1810]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1812]!, self._r[1812]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1811]!, self._r[1811]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1815]! } - public var CreatePoll_Title: String { return self._s[1816]! } - public var Conversation_ViewTheme: String { return self._s[1817]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1818]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1819]! } - public var UserInfo_GroupsInCommon: String { return self._s[1820]! } - public var Call_AudioRouteHide: String { return self._s[1821]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1823]! } + public var SocksProxySetup_AddProxy: String { return self._s[1814]! } + public var CreatePoll_Title: String { return self._s[1815]! } + public var Conversation_ViewTheme: String { return self._s[1816]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1817]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1818]! } + public var UserInfo_GroupsInCommon: String { return self._s[1819]! } + public var Call_AudioRouteHide: String { return self._s[1820]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1822]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_0]) + return formatWithArgumentRanges(self._s[1823]!, self._r[1823]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1825]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1826]! } - public var Notifications_Title: String { return self._s[1827]! } - public var Group_Username_InvalidTooShort: String { return self._s[1828]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1829]! } + public var TextFormat_Bold: String { return self._s[1824]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1825]! } + public var Notifications_Title: String { return self._s[1826]! } + public var Group_Username_InvalidTooShort: String { return self._s[1827]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1828]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1830]!, self._r[1830]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1829]!, self._r[1829]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1832]! } - public var Stickers_SuggestAdded: String { return self._s[1833]! } - public var Login_CountryCode: String { return self._s[1834]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1835]! } - public var Map_GetDirections: String { return self._s[1836]! } - public var Login_PhoneFloodError: String { return self._s[1837]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1831]! } + public var Stickers_SuggestAdded: String { return self._s[1832]! } + public var Login_CountryCode: String { return self._s[1833]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1834]! } + public var Map_GetDirections: String { return self._s[1835]! } + public var Login_PhoneFloodError: String { return self._s[1836]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_0]) + return formatWithArgumentRanges(self._s[1837]!, self._r[1837]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1840]! } - public var Group_Location_ChangeLocation: String { return self._s[1841]! } - public var Notification_GroupInviterSelf: String { return self._s[1842]! } - public var InstantPage_TapToOpenLink: String { return self._s[1843]! } + public var Settings_SetUsername: String { return self._s[1839]! } + public var Group_Location_ChangeLocation: String { return self._s[1840]! } + public var Notification_GroupInviterSelf: String { return self._s[1841]! } + public var InstantPage_TapToOpenLink: String { return self._s[1842]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1844]!, self._r[1844]!, [_0]) + return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1845]! } - public var SecretChat_Title: String { return self._s[1846]! } - public var Group_UpgradeNoticeText1: String { return self._s[1847]! } - public var AuthSessions_Title: String { return self._s[1848]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1844]! } + public var SecretChat_Title: String { return self._s[1845]! } + public var Group_UpgradeNoticeText1: String { return self._s[1846]! } + public var AuthSessions_Title: String { return self._s[1847]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1849]!, self._r[1849]!, [_0]) + return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1850]! } - public var Channel_About_Title: String { return self._s[1851]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1852]! } + public var PhotoEditor_CropAuto: String { return self._s[1849]! } + public var Channel_About_Title: String { return self._s[1850]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1851]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1854]!, self._r[1854]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1855]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1857]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1858]! } + public var VoiceOver_MessageContextReport: String { return self._s[1854]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1856]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1857]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_1]) + return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_0]) + return formatWithArgumentRanges(self._s[1860]!, self._r[1860]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, [_0]) + return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1863]! } - public var Presence_online: String { return self._s[1865]! } - public var PasscodeSettings_Title: String { return self._s[1866]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1867]! } - public var Web_OpenExternal: String { return self._s[1868]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1870]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1871]! } - public var LocalGroup_Title: String { return self._s[1872]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1862]! } + public var Presence_online: String { return self._s[1864]! } + public var PasscodeSettings_Title: String { return self._s[1865]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1866]! } + public var Web_OpenExternal: String { return self._s[1867]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1869]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1870]! } + public var LocalGroup_Title: String { return self._s[1871]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1873]!, self._r[1873]!, [_0]) + return formatWithArgumentRanges(self._s[1872]!, self._r[1872]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1874]! } - public var Map_YouAreHere: String { return self._s[1875]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1873]! } + public var Map_YouAreHere: String { return self._s[1874]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) + return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0]) } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) + return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1878]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1879]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1877]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1878]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1880]!, self._r[1880]!, [_0]) + return formatWithArgumentRanges(self._s[1879]!, self._r[1879]!, [_0]) } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) + return formatWithArgumentRanges(self._s[1880]!, self._r[1880]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1882]! } - public var Bot_Start: String { return self._s[1883]! } + public var SocksProxySetup_Username: String { return self._s[1881]! } + public var Bot_Start: String { return self._s[1882]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0]) + return formatWithArgumentRanges(self._s[1883]!, self._r[1883]!, [_0]) } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) + return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1886]! } - public var AccentColor_Title: String { return self._s[1888]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1889]! } + public var Contacts_SortByPresence: String { return self._s[1885]! } + public var AccentColor_Title: String { return self._s[1887]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1888]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1891]!, self._r[1891]!, [_0]) + return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1892]!, self._r[1892]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1891]!, self._r[1891]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1893]! } - public var Login_InfoAvatarPhoto: String { return self._s[1894]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1895]! } - public var Tour_Title4: String { return self._s[1896]! } - public var Passport_Identity_Translation: String { return self._s[1897]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1898]! } - public var Login_TermsOfServiceLabel: String { return self._s[1900]! } - public var Passport_Language_it: String { return self._s[1901]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1902]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1903]! } - public var Conversation_ClearAll: String { return self._s[1905]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1907]! } - public var TwoStepAuth_FloodError: String { return self._s[1908]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1892]! } + public var Login_InfoAvatarPhoto: String { return self._s[1893]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1894]! } + public var Tour_Title4: String { return self._s[1895]! } + public var Passport_Identity_Translation: String { return self._s[1896]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1897]! } + public var Login_TermsOfServiceLabel: String { return self._s[1899]! } + public var Passport_Language_it: String { return self._s[1900]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1901]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1902]! } + public var Conversation_ClearAll: String { return self._s[1904]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1906]! } + public var TwoStepAuth_FloodError: String { return self._s[1907]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1909]!, self._r[1909]!, [_1]) + return formatWithArgumentRanges(self._s[1908]!, self._r[1908]!, [_1]) } - public var Paint_Delete: String { return self._s[1910]! } - public var Privacy_AddNewPeer: String { return self._s[1911]! } + public var Paint_Delete: String { return self._s[1909]! } + public var Privacy_AddNewPeer: String { return self._s[1910]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1]) + return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1913]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1912]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1915]! } + public var Message_PinnedAudioMessage: String { return self._s[1914]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_0]) + return formatWithArgumentRanges(self._s[1915]!, self._r[1915]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1917]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1918]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1919]! } - public var Conversation_MessageEditedLabel: String { return self._s[1920]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1921]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1922]! } + public var Notification_Mute1hMin: String { return self._s[1916]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1917]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1918]! } + public var Conversation_MessageEditedLabel: String { return self._s[1919]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1920]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1921]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1923]!, self._r[1923]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1924]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1923]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1925]!, self._r[1925]!, [_1]) + return formatWithArgumentRanges(self._s[1924]!, self._r[1924]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1926]! } - public var Month_GenOctober: String { return self._s[1927]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1928]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1929]! } - public var MediaPicker_TimerTooltip: String { return self._s[1931]! } - public var SharedMedia_TitleAll: String { return self._s[1932]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1935]! } - public var Conversation_RestrictedMedia: String { return self._s[1936]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1937]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1939]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1940]! } + public var AccessDenied_LocationTracking: String { return self._s[1925]! } + public var Month_GenOctober: String { return self._s[1926]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1927]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1928]! } + public var MediaPicker_TimerTooltip: String { return self._s[1930]! } + public var SharedMedia_TitleAll: String { return self._s[1931]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1934]! } + public var Conversation_RestrictedMedia: String { return self._s[1935]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1936]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1938]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1939]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1941]!, self._r[1941]!, [_0]) + return formatWithArgumentRanges(self._s[1940]!, self._r[1940]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1944]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1946]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1947]! } + public var Conversation_SavedMessages: String { return self._s[1943]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1945]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1946]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_0]) + return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1950]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1949]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_0]) + return formatWithArgumentRanges(self._s[1950]!, self._r[1950]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1952]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1953]! } + public var ReportPeer_AlertSuccess: String { return self._s[1951]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1952]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1954]!, self._r[1954]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1955]! } - public var PhotoEditor_FadeTool: String { return self._s[1956]! } - public var Privacy_ContactsReset: String { return self._s[1957]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1954]! } + public var PhotoEditor_FadeTool: String { return self._s[1955]! } + public var Privacy_ContactsReset: String { return self._s[1956]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0]) + return formatWithArgumentRanges(self._s[1958]!, self._r[1958]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1960]! } - public var ChatList_Mute: String { return self._s[1961]! } - public var Permissions_CellularDataText_v0: String { return self._s[1962]! } - public var ShareMenu_SelectChats: String { return self._s[1964]! } - public var MusicPlayer_VoiceNote: String { return self._s[1965]! } - public var Conversation_RestrictedText: String { return self._s[1966]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1967]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1968]! } - public var Cache_Videos: String { return self._s[1969]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1970]! } - public var FeatureDisabled_Oops: String { return self._s[1972]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1973]! } + public var Message_PinnedVideoMessage: String { return self._s[1959]! } + public var ChatList_Mute: String { return self._s[1960]! } + public var Permissions_CellularDataText_v0: String { return self._s[1961]! } + public var ShareMenu_SelectChats: String { return self._s[1963]! } + public var MusicPlayer_VoiceNote: String { return self._s[1964]! } + public var Conversation_RestrictedText: String { return self._s[1965]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1966]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1967]! } + public var Cache_Videos: String { return self._s[1968]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1969]! } + public var FeatureDisabled_Oops: String { return self._s[1971]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1972]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1974]!, self._r[1974]!, [_0]) + return formatWithArgumentRanges(self._s[1973]!, self._r[1973]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1975]! } - public var GroupPermission_NoSendPolls: String { return self._s[1976]! } - public var Message_VideoExpired: String { return self._s[1978]! } - public var Notifications_Badge: String { return self._s[1979]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1980]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1981]! } - public var Username_InvalidTooShort: String { return self._s[1982]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1983]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1984]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1985]! } + public var Stickers_GroupStickersHelp: String { return self._s[1974]! } + public var GroupPermission_NoSendPolls: String { return self._s[1975]! } + public var Message_VideoExpired: String { return self._s[1977]! } + public var Notifications_Badge: String { return self._s[1978]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1979]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1980]! } + public var Username_InvalidTooShort: String { return self._s[1981]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1982]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1983]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1984]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1]) + return formatWithArgumentRanges(self._s[1985]!, self._r[1985]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1987]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1988]! } - public var SharedMedia_CategoryDocs: String { return self._s[1991]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1986]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1987]! } + public var SharedMedia_CategoryDocs: String { return self._s[1990]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_1]) + return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[1994]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1993]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_1]) + return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1996]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1995]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1997]!, self._r[1997]!, [_0]) + return formatWithArgumentRanges(self._s[1996]!, self._r[1996]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1998]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1999]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2000]! } - public var Channel_UpdatePhotoItem: String { return self._s[2001]! } - public var GroupInfo_LeftStatus: String { return self._s[2002]! } - public var Watch_MessageView_Forward: String { return self._s[2004]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2005]! } - public var Cache_ClearEmpty: String { return self._s[2007]! } - public var Localization_LanguageName: String { return self._s[2008]! } - public var WebSearch_GIFs: String { return self._s[2009]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2010]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2011]! } - public var Common_Back: String { return self._s[2012]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2013]! } + public var ChatSettings_PrivateChats: String { return self._s[1997]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1998]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1999]! } + public var Channel_UpdatePhotoItem: String { return self._s[2000]! } + public var GroupInfo_LeftStatus: String { return self._s[2001]! } + public var Watch_MessageView_Forward: String { return self._s[2003]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2004]! } + public var Cache_ClearEmpty: String { return self._s[2006]! } + public var Localization_LanguageName: String { return self._s[2007]! } + public var WebSearch_GIFs: String { return self._s[2008]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2009]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2010]! } + public var Common_Back: String { return self._s[2011]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2012]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2015]! } - public var Watch_Conversation_Reply: String { return self._s[2017]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2019]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2020]! } - public var Channel_BanUser_Unban: String { return self._s[2022]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2023]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2024]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2026]! } - public var Passport_Identity_Name: String { return self._s[2027]! } + public var Passport_Email_Help: String { return self._s[2014]! } + public var Watch_Conversation_Reply: String { return self._s[2016]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2018]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2019]! } + public var Channel_BanUser_Unban: String { return self._s[2021]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2022]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2023]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2025]! } + public var Passport_Identity_Name: String { return self._s[2026]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) + return formatWithArgumentRanges(self._s[2027]!, self._r[2027]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2029]! } - public var Conversation_BlockUser: String { return self._s[2030]! } - public var Month_GenJanuary: String { return self._s[2031]! } - public var ChatSettings_TextSize: String { return self._s[2032]! } - public var Notification_PassportValuePhone: String { return self._s[2033]! } - public var Passport_Language_ne: String { return self._s[2034]! } - public var Notification_CallBack: String { return self._s[2035]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2036]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2028]! } + public var Conversation_BlockUser: String { return self._s[2029]! } + public var Month_GenJanuary: String { return self._s[2030]! } + public var ChatSettings_TextSize: String { return self._s[2031]! } + public var Notification_PassportValuePhone: String { return self._s[2032]! } + public var Passport_Language_ne: String { return self._s[2033]! } + public var Notification_CallBack: String { return self._s[2034]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2035]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2037]!, self._r[2037]!, [_0]) + return formatWithArgumentRanges(self._s[2036]!, self._r[2036]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2038]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2039]! } - public var Stickers_FrequentlyUsed: String { return self._s[2040]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2041]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2043]! } + public var Channel_Info_Management: String { return self._s[2037]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2038]! } + public var Stickers_FrequentlyUsed: String { return self._s[2039]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2040]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2042]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2044]!, self._r[2044]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2043]!, self._r[2043]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2045]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2046]! } - public var CreatePoll_TextHeader: String { return self._s[2047]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2044]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2045]! } + public var CreatePoll_TextHeader: String { return self._s[2046]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_0]) + return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2049]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2050]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2052]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2053]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2054]! } + public var PhotoEditor_QualityMedium: String { return self._s[2048]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2049]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2051]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2052]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2053]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_0]) + return formatWithArgumentRanges(self._s[2054]!, self._r[2054]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_1]) + return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2058]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2059]! } - public var Settings_Username: String { return self._s[2061]! } - public var Conversation_Block: String { return self._s[2063]! } - public var Wallpaper_Wallpaper: String { return self._s[2064]! } - public var SocksProxySetup_UseProxy: String { return self._s[2066]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2067]! } - public var MessageTimer_Forever: String { return self._s[2068]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2069]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2070]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2071]! } - public var Passport_Language_da: String { return self._s[2072]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2073]! } + public var Conversation_LinkDialogOpen: String { return self._s[2057]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2058]! } + public var Settings_Username: String { return self._s[2060]! } + public var Conversation_Block: String { return self._s[2062]! } + public var Wallpaper_Wallpaper: String { return self._s[2063]! } + public var SocksProxySetup_UseProxy: String { return self._s[2065]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2066]! } + public var MessageTimer_Forever: String { return self._s[2067]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2068]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2069]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2070]! } + public var Passport_Language_da: String { return self._s[2071]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2072]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) + return formatWithArgumentRanges(self._s[2073]!, self._r[2073]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2075]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2074]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_0]) + return formatWithArgumentRanges(self._s[2076]!, self._r[2076]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2079]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2080]! } - public var Conversation_PinnedPoll: String { return self._s[2081]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2082]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2078]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2079]! } + public var Conversation_PinnedPoll: String { return self._s[2080]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2081]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_1]) + return formatWithArgumentRanges(self._s[2082]!, self._r[2082]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2084]! } - public var Cache_ByPeerHeader: String { return self._s[2085]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2083]! } + public var Cache_ByPeerHeader: String { return self._s[2084]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0]) + return formatWithArgumentRanges(self._s[2085]!, self._r[2085]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2087]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2090]! } - public var Notification_PinnedMessage: String { return self._s[2091]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2093]! } - public var Contacts_SortBy: String { return self._s[2094]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2086]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2089]! } + public var Notification_PinnedMessage: String { return self._s[2090]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2092]! } + public var Contacts_SortBy: String { return self._s[2093]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_1]) + return formatWithArgumentRanges(self._s[2094]!, self._r[2094]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2097]!, self._r[2097]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2096]!, self._r[2096]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2098]! } - public var Watch_UserInfo_Service: String { return self._s[2099]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2101]! } - public var Conversation_Unpin: String { return self._s[2103]! } - public var CancelResetAccount_Title: String { return self._s[2104]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2105]! } + public var Call_EncryptionKey_Title: String { return self._s[2097]! } + public var Watch_UserInfo_Service: String { return self._s[2098]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2100]! } + public var Conversation_Unpin: String { return self._s[2102]! } + public var CancelResetAccount_Title: String { return self._s[2103]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2104]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2107]!, self._r[2107]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2108]! } - public var CallSettings_Title: String { return self._s[2109]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2110]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2112]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2113]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2107]! } + public var CallSettings_Title: String { return self._s[2108]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2109]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2111]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2112]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2115]! } - public var LoginPassword_PasswordHelp: String { return self._s[2116]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2117]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2118]! } - public var Checkout_TotalPaidAmount: String { return self._s[2119]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2114]! } + public var LoginPassword_PasswordHelp: String { return self._s[2115]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2116]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2117]! } + public var Checkout_TotalPaidAmount: String { return self._s[2118]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_0]) + return formatWithArgumentRanges(self._s[2119]!, self._r[2119]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2121]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2123]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2124]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2120]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2122]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2123]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2125]!, self._r[2125]!, [_1]) + return formatWithArgumentRanges(self._s[2124]!, self._r[2124]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2126]! } - public var Contacts_InviteFriends: String { return self._s[2128]! } - public var Map_ChooseLocationTitle: String { return self._s[2129]! } - public var Conversation_StopPoll: String { return self._s[2131]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2125]! } + public var Contacts_InviteFriends: String { return self._s[2127]! } + public var Map_ChooseLocationTitle: String { return self._s[2128]! } + public var Conversation_StopPoll: String { return self._s[2130]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_0]) + return formatWithArgumentRanges(self._s[2131]!, self._r[2131]!, [_0]) } - public var Call_Camera: String { return self._s[2133]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2134]! } - public var Calls_RatingFeedback: String { return self._s[2135]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2136]! } - public var NotificationsSound_Pulse: String { return self._s[2137]! } - public var Watch_LastSeen_Lately: String { return self._s[2138]! } - public var ReportGroupLocation_Report: String { return self._s[2141]! } - public var Widget_NoUsers: String { return self._s[2142]! } - public var Conversation_UnvotePoll: String { return self._s[2143]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2145]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2146]! } - public var NotificationsSound_Circles: String { return self._s[2147]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2149]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2150]! } - public var Proxy_TooltipUnavailable: String { return self._s[2151]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2153]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2155]! } - public var Conversation_FileDropbox: String { return self._s[2156]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2157]! } - public var Tour_Text3: String { return self._s[2159]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2161]! } - public var GroupPermission_NoSendMessages: String { return self._s[2162]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2163]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2164]! } + public var Call_Camera: String { return self._s[2132]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2133]! } + public var Calls_RatingFeedback: String { return self._s[2134]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2135]! } + public var NotificationsSound_Pulse: String { return self._s[2136]! } + public var Watch_LastSeen_Lately: String { return self._s[2137]! } + public var ReportGroupLocation_Report: String { return self._s[2140]! } + public var Widget_NoUsers: String { return self._s[2141]! } + public var Conversation_UnvotePoll: String { return self._s[2142]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2144]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2145]! } + public var NotificationsSound_Circles: String { return self._s[2146]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2148]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2149]! } + public var Proxy_TooltipUnavailable: String { return self._s[2150]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2152]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2154]! } + public var Conversation_FileDropbox: String { return self._s[2155]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2156]! } + public var Tour_Text3: String { return self._s[2158]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2160]! } + public var GroupPermission_NoSendMessages: String { return self._s[2161]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2162]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2163]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2166]!, self._r[2166]!, [_0]) + return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2167]! } - public var Checkout_ShippingOption_Title: String { return self._s[2168]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2169]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2166]! } + public var Checkout_ShippingOption_Title: String { return self._s[2167]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2168]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) + return formatWithArgumentRanges(self._s[2169]!, self._r[2169]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2171]!, self._r[2171]!, [_0]) + return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2172]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2173]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2174]! } - public var AutoDownloadSettings_Photos: String { return self._s[2176]! } - public var Appearance_PreviewIncomingText: String { return self._s[2177]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2178]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2179]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2180]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2181]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2182]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2183]! } - public var Notification_SecretChatScreenshot: String { return self._s[2184]! } - public var AccessDenied_Wallpapers: String { return self._s[2185]! } - public var Passport_Address_City: String { return self._s[2187]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2188]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2189]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2190]! } - public var AccessDenied_LocationDisabled: String { return self._s[2191]! } - public var Group_Location_Title: String { return self._s[2192]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2194]! } - public var GroupInfo_Sound: String { return self._s[2195]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2196]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2197]! } - public var Contacts_Title: String { return self._s[2198]! } - public var Passport_Language_fr: String { return self._s[2199]! } - public var Notifications_ResetAllNotifications: String { return self._s[2200]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2203]! } - public var Checkout_NewCard_Title: String { return self._s[2204]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2205]! } - public var Conversation_ForwardChats: String { return self._s[2206]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2208]! } - public var Settings_FAQ: String { return self._s[2210]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2211]! } - public var Conversation_ContextMenuForward: String { return self._s[2212]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2215]! } - public var PrivacyPolicy_Title: String { return self._s[2218]! } - public var Notifications_TextTone: String { return self._s[2219]! } - public var Profile_CreateNewContact: String { return self._s[2220]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2221]! } - public var Call_Speaker: String { return self._s[2223]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2224]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2226]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2227]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2171]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2172]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2173]! } + public var AutoDownloadSettings_Photos: String { return self._s[2175]! } + public var Appearance_PreviewIncomingText: String { return self._s[2176]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2177]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2178]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2179]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2180]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2181]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2182]! } + public var Notification_SecretChatScreenshot: String { return self._s[2183]! } + public var AccessDenied_Wallpapers: String { return self._s[2184]! } + public var Passport_Address_City: String { return self._s[2186]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2187]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2188]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2189]! } + public var AccessDenied_LocationDisabled: String { return self._s[2190]! } + public var Group_Location_Title: String { return self._s[2191]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2193]! } + public var GroupInfo_Sound: String { return self._s[2194]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2195]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2196]! } + public var Contacts_Title: String { return self._s[2197]! } + public var Passport_Language_fr: String { return self._s[2198]! } + public var Notifications_ResetAllNotifications: String { return self._s[2199]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2202]! } + public var Checkout_NewCard_Title: String { return self._s[2203]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2204]! } + public var Conversation_ForwardChats: String { return self._s[2205]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2207]! } + public var Settings_FAQ: String { return self._s[2209]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2210]! } + public var Conversation_ContextMenuForward: String { return self._s[2211]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2214]! } + public var PrivacyPolicy_Title: String { return self._s[2217]! } + public var Notifications_TextTone: String { return self._s[2218]! } + public var Profile_CreateNewContact: String { return self._s[2219]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2220]! } + public var Call_Speaker: String { return self._s[2222]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2223]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2225]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2226]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2228]!, self._r[2228]!, [_0]) + return formatWithArgumentRanges(self._s[2227]!, self._r[2227]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2229]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2230]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2231]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2232]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2233]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2234]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2235]! } - public var Bot_Unblock: String { return self._s[2236]! } - public var TextFormat_Italic: String { return self._s[2237]! } - public var WallpaperSearch_ColorPink: String { return self._s[2238]! } - public var Settings_About_Help: String { return self._s[2239]! } - public var SearchImages_Title: String { return self._s[2240]! } - public var Weekday_Wednesday: String { return self._s[2241]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2242]! } - public var ExplicitContent_AlertTitle: String { return self._s[2243]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2228]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2229]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2230]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2231]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2232]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2233]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2234]! } + public var Bot_Unblock: String { return self._s[2235]! } + public var TextFormat_Italic: String { return self._s[2236]! } + public var WallpaperSearch_ColorPink: String { return self._s[2237]! } + public var Settings_About_Help: String { return self._s[2238]! } + public var SearchImages_Title: String { return self._s[2239]! } + public var Weekday_Wednesday: String { return self._s[2240]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2241]! } + public var ExplicitContent_AlertTitle: String { return self._s[2242]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2244]!, self._r[2244]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2243]!, self._r[2243]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2245]! } - public var Weekday_Thursday: String { return self._s[2246]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2247]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2248]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2244]! } + public var Weekday_Thursday: String { return self._s[2245]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2246]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2247]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2249]!, self._r[2249]!, [_0]) + return formatWithArgumentRanges(self._s[2248]!, self._r[2248]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2250]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2251]! } - public var Passport_RequestedInformation: String { return self._s[2252]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2253]! } - public var Conversation_EncryptionProcessing: String { return self._s[2255]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2256]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2258]! } - public var Channel_Setup_Title: String { return self._s[2259]! } - public var Conversation_SearchPlaceholder: String { return self._s[2260]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2261]! } - public var Checkout_ErrorGeneric: String { return self._s[2262]! } - public var Passport_Language_hu: String { return self._s[2263]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2249]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2250]! } + public var Passport_RequestedInformation: String { return self._s[2251]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2252]! } + public var Conversation_EncryptionProcessing: String { return self._s[2254]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2255]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2257]! } + public var Channel_Setup_Title: String { return self._s[2258]! } + public var Conversation_SearchPlaceholder: String { return self._s[2259]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2260]! } + public var Checkout_ErrorGeneric: String { return self._s[2261]! } + public var Passport_Language_hu: String { return self._s[2262]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_0]) + return formatWithArgumentRanges(self._s[2264]!, self._r[2264]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_1]) + return formatWithArgumentRanges(self._s[2267]!, self._r[2267]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) + return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_0]) } - public var Group_Location_Info: String { return self._s[2270]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2271]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2272]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2273]! } + public var Group_Location_Info: String { return self._s[2269]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2270]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2271]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2272]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2274]!, self._r[2274]!, [_0]) + return formatWithArgumentRanges(self._s[2273]!, self._r[2273]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2275]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2276]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2277]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2274]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2275]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2276]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_0]) + return formatWithArgumentRanges(self._s[2277]!, self._r[2277]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2279]! } - public var Message_PinnedAnimationMessage: String { return self._s[2281]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2283]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2284]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2286]! } - public var Embed_PlayingInPIP: String { return self._s[2287]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2288]! } + public var Passport_Language_cs: String { return self._s[2278]! } + public var Message_PinnedAnimationMessage: String { return self._s[2280]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2282]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2283]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2285]! } + public var Embed_PlayingInPIP: String { return self._s[2286]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2287]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_0]) + return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2290]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2289]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1]) + return formatWithArgumentRanges(self._s[2290]!, self._r[2290]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2292]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2293]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2294]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2295]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2296]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2297]! } + public var Notification_PaymentSent: String { return self._s[2291]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2292]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2293]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2294]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2295]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2296]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_1]) + return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2301]!, self._r[2301]!, [_1]) + return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1]) + return formatWithArgumentRanges(self._s[2301]!, self._r[2301]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2304]! } - public var PasscodeSettings_HelpTop: String { return self._s[2305]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2306]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2307]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2308]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2309]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2310]! } - public var Call_Accept: String { return self._s[2312]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2313]! } - public var Month_GenMarch: String { return self._s[2315]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2316]! } - public var LoginPassword_Title: String { return self._s[2317]! } - public var Call_End: String { return self._s[2318]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2319]! } - public var VoiceOver_Chat_Contact: String { return self._s[2320]! } - public var CallSettings_Always: String { return self._s[2321]! } - public var CallFeedback_Success: String { return self._s[2322]! } - public var TwoStepAuth_SetupHint: String { return self._s[2323]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2303]! } + public var PasscodeSettings_HelpTop: String { return self._s[2304]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2305]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2306]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2307]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2308]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2309]! } + public var Call_Accept: String { return self._s[2311]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2312]! } + public var Month_GenMarch: String { return self._s[2314]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2315]! } + public var LoginPassword_Title: String { return self._s[2316]! } + public var Call_End: String { return self._s[2317]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2318]! } + public var VoiceOver_Chat_Contact: String { return self._s[2319]! } + public var CallSettings_Always: String { return self._s[2320]! } + public var CallFeedback_Success: String { return self._s[2321]! } + public var TwoStepAuth_SetupHint: String { return self._s[2322]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2324]!, self._r[2324]!, [_1]) + return formatWithArgumentRanges(self._s[2323]!, self._r[2323]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2325]! } - public var Login_PhoneTitle: String { return self._s[2326]! } - public var Passport_FieldPhoneHelp: String { return self._s[2327]! } - public var Weekday_ShortSunday: String { return self._s[2328]! } - public var Passport_InfoFAQ_URL: String { return self._s[2329]! } - public var ContactInfo_Job: String { return self._s[2331]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2332]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2333]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2334]! } - public var Invite_ChannelsTooMuch: String { return self._s[2335]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2336]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2337]! } - public var CallFeedback_ReasonNoise: String { return self._s[2338]! } - public var Appearance_AppIconDefault: String { return self._s[2340]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2341]! } - public var MediaPicker_AddCaption: String { return self._s[2342]! } - public var CallSettings_TabIconDescription: String { return self._s[2343]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2324]! } + public var Login_PhoneTitle: String { return self._s[2325]! } + public var Passport_FieldPhoneHelp: String { return self._s[2326]! } + public var Weekday_ShortSunday: String { return self._s[2327]! } + public var Passport_InfoFAQ_URL: String { return self._s[2328]! } + public var ContactInfo_Job: String { return self._s[2330]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2331]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2332]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2333]! } + public var Invite_ChannelsTooMuch: String { return self._s[2334]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2335]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2336]! } + public var CallFeedback_ReasonNoise: String { return self._s[2337]! } + public var Appearance_AppIconDefault: String { return self._s[2339]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2340]! } + public var MediaPicker_AddCaption: String { return self._s[2341]! } + public var CallSettings_TabIconDescription: String { return self._s[2342]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2344]!, self._r[2344]!, [_0]) + return formatWithArgumentRanges(self._s[2343]!, self._r[2343]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2345]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2346]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2347]! } - public var DialogList_SearchSectionRecent: String { return self._s[2348]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2349]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2352]! } - public var LastSeen_WithinAWeek: String { return self._s[2353]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2354]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2356]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2357]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2344]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2345]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2346]! } + public var DialogList_SearchSectionRecent: String { return self._s[2347]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2348]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2351]! } + public var LastSeen_WithinAWeek: String { return self._s[2352]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2353]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2355]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2356]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2358]!, self._r[2358]!, [_0]) + return formatWithArgumentRanges(self._s[2357]!, self._r[2357]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2359]! } - public var Conversation_StatusLeftGroup: String { return self._s[2360]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2361]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2363]! } - public var GroupPermission_AddSuccess: String { return self._s[2364]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2366]! } - public var Conversation_ContextMenuCopy: String { return self._s[2367]! } - public var AccessDenied_CallMicrophone: String { return self._s[2368]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2358]! } + public var Conversation_StatusLeftGroup: String { return self._s[2359]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2360]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2362]! } + public var GroupPermission_AddSuccess: String { return self._s[2363]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2365]! } + public var Conversation_ContextMenuCopy: String { return self._s[2366]! } + public var AccessDenied_CallMicrophone: String { return self._s[2367]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2369]!, self._r[2369]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2368]!, self._r[2368]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2370]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2371]! } - public var Checkout_PaymentMethod_New: String { return self._s[2372]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2373]! } - public var PhotoEditor_QualityTool: String { return self._s[2374]! } - public var Login_SendCodeViaSms: String { return self._s[2375]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2376]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2377]! } - public var Login_EmailNotConfiguredError: String { return self._s[2378]! } - public var SocksProxySetup_Status: String { return self._s[2379]! } - public var PrivacyPolicy_Accept: String { return self._s[2380]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2381]! } - public var Appearance_AppIconClassicX: String { return self._s[2382]! } + public var Login_InvalidFirstNameError: String { return self._s[2369]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2370]! } + public var Checkout_PaymentMethod_New: String { return self._s[2371]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2372]! } + public var PhotoEditor_QualityTool: String { return self._s[2373]! } + public var Login_SendCodeViaSms: String { return self._s[2374]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2375]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2376]! } + public var Login_EmailNotConfiguredError: String { return self._s[2377]! } + public var SocksProxySetup_Status: String { return self._s[2378]! } + public var PrivacyPolicy_Accept: String { return self._s[2379]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2380]! } + public var Appearance_AppIconClassicX: String { return self._s[2381]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2383]!, self._r[2383]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2382]!, self._r[2382]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2384]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2385]! } - public var AutoNightTheme_Automatic: String { return self._s[2386]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2387]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2388]! } - public var Cache_Help: String { return self._s[2389]! } - public var Group_ErrorAccessDenied: String { return self._s[2390]! } - public var Passport_Language_fa: String { return self._s[2391]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2392]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2393]! } - public var PrivacySettings_LastSeen: String { return self._s[2394]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2383]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2384]! } + public var AutoNightTheme_Automatic: String { return self._s[2385]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2386]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2387]! } + public var Cache_Help: String { return self._s[2388]! } + public var Group_ErrorAccessDenied: String { return self._s[2389]! } + public var Passport_Language_fa: String { return self._s[2390]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2391]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2392]! } + public var PrivacySettings_LastSeen: String { return self._s[2393]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2395]!, self._r[2395]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2394]!, self._r[2394]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2399]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2400]! } - public var Profile_About: String { return self._s[2401]! } - public var Channel_About_Placeholder: String { return self._s[2402]! } - public var Login_InfoTitle: String { return self._s[2403]! } + public var Preview_SaveGif: String { return self._s[2398]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2399]! } + public var Profile_About: String { return self._s[2400]! } + public var Channel_About_Placeholder: String { return self._s[2401]! } + public var Login_InfoTitle: String { return self._s[2402]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2404]!, self._r[2404]!, [_0]) + return formatWithArgumentRanges(self._s[2403]!, self._r[2403]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2406]! } - public var ContactInfo_Title: String { return self._s[2407]! } - public var Media_ShareThisVideo: String { return self._s[2408]! } - public var Weekday_ShortFriday: String { return self._s[2409]! } - public var AccessDenied_Contacts: String { return self._s[2411]! } - public var Notification_CallIncomingShort: String { return self._s[2412]! } - public var Group_Setup_TypePublic: String { return self._s[2413]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2414]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2415]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2418]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2419]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2420]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2421]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2422]! } - public var DialogList_Typing: String { return self._s[2423]! } - public var CallFeedback_IncludeLogs: String { return self._s[2425]! } - public var Checkout_Phone: String { return self._s[2427]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2430]! } - public var Privacy_Calls_Integration: String { return self._s[2431]! } - public var Notifications_PermissionsAllow: String { return self._s[2432]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2436]! } - public var Settings_ChatSettings: String { return self._s[2437]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2405]! } + public var ContactInfo_Title: String { return self._s[2406]! } + public var Media_ShareThisVideo: String { return self._s[2407]! } + public var Weekday_ShortFriday: String { return self._s[2408]! } + public var AccessDenied_Contacts: String { return self._s[2410]! } + public var Notification_CallIncomingShort: String { return self._s[2411]! } + public var Group_Setup_TypePublic: String { return self._s[2412]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2413]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2414]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2417]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2418]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2419]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2420]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2421]! } + public var DialogList_Typing: String { return self._s[2422]! } + public var CallFeedback_IncludeLogs: String { return self._s[2424]! } + public var Checkout_Phone: String { return self._s[2426]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2429]! } + public var Privacy_Calls_Integration: String { return self._s[2430]! } + public var Notifications_PermissionsAllow: String { return self._s[2431]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2435]! } + public var Settings_ChatSettings: String { return self._s[2436]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2438]!, self._r[2438]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2437]!, self._r[2437]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2440]! } + public var GroupRemoved_DeleteUser: String { return self._s[2439]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2441]!, self._r[2441]!, [_0]) + return formatWithArgumentRanges(self._s[2440]!, self._r[2440]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2442]!, self._r[2442]!, [_1]) + return formatWithArgumentRanges(self._s[2441]!, self._r[2441]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2443]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2444]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2446]! } - public var Conversation_Unblock: String { return self._s[2447]! } - public var PrivacySettings_DataSettings: String { return self._s[2448]! } - public var Group_PublicLink_Info: String { return self._s[2449]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2450]! } + public var Login_ContinueWithLocalization: String { return self._s[2442]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2443]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2445]! } + public var Conversation_Unblock: String { return self._s[2446]! } + public var PrivacySettings_DataSettings: String { return self._s[2447]! } + public var Group_PublicLink_Info: String { return self._s[2448]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2449]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2454]! } - public var Call_Mute: String { return self._s[2455]! } - public var Passport_Language_dz: String { return self._s[2456]! } - public var Passport_Language_tk: String { return self._s[2457]! } + public var PrivacySettings_Passcode: String { return self._s[2453]! } + public var Call_Mute: String { return self._s[2454]! } + public var Passport_Language_dz: String { return self._s[2455]! } + public var Passport_Language_tk: String { return self._s[2456]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2458]!, self._r[2458]!, [_0]) + return formatWithArgumentRanges(self._s[2457]!, self._r[2457]!, [_0]) } - public var Settings_Search: String { return self._s[2459]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2460]! } - public var Conversation_ContextMenuReply: String { return self._s[2461]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2462]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2463]! } - public var Tour_Title1: String { return self._s[2464]! } - public var Conversation_ClearGroupHistory: String { return self._s[2466]! } - public var WallpaperPreview_Motion: String { return self._s[2467]! } + public var Settings_Search: String { return self._s[2458]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2459]! } + public var Conversation_ContextMenuReply: String { return self._s[2460]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2461]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2462]! } + public var Tour_Title1: String { return self._s[2463]! } + public var Conversation_ClearGroupHistory: String { return self._s[2465]! } + public var WallpaperPreview_Motion: String { return self._s[2466]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) + return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_0]) } - public var Call_RateCall: String { return self._s[2469]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2470]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2471]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2472]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2474]! } + public var Call_RateCall: String { return self._s[2468]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2469]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2470]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2471]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2473]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2476]!, self._r[2476]!, [_0]) + return formatWithArgumentRanges(self._s[2475]!, self._r[2475]!, [_0]) } - public var Compose_Create: String { return self._s[2477]! } - public var Contacts_InviteToTelegram: String { return self._s[2478]! } - public var GroupInfo_Notifications: String { return self._s[2479]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2481]! } - public var Month_GenApril: String { return self._s[2482]! } - public var Appearance_AutoNightTheme: String { return self._s[2483]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2485]! } - public var Login_CodeSentSms: String { return self._s[2487]! } + public var Compose_Create: String { return self._s[2476]! } + public var Contacts_InviteToTelegram: String { return self._s[2477]! } + public var GroupInfo_Notifications: String { return self._s[2478]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2480]! } + public var Month_GenApril: String { return self._s[2481]! } + public var Appearance_AutoNightTheme: String { return self._s[2482]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2484]! } + public var Login_CodeSentSms: String { return self._s[2486]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) + return formatWithArgumentRanges(self._s[2487]!, self._r[2487]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2489]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2490]! } - public var Passport_Language_hr: String { return self._s[2491]! } - public var Common_ActionNotAllowedError: String { return self._s[2492]! } + public var EmptyGroupInfo_Line3: String { return self._s[2488]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2489]! } + public var Passport_Language_hr: String { return self._s[2490]! } + public var Common_ActionNotAllowedError: String { return self._s[2491]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2493]!, self._r[2493]!, [_0]) + return formatWithArgumentRanges(self._s[2492]!, self._r[2492]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2494]! } - public var Appearance_ThemePreview_ChatList_8_Text: String { return self._s[2495]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2496]! } - public var Privacy_SecretChatsTitle: String { return self._s[2497]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2499]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2500]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2501]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2502]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2503]! } - public var Preview_DeleteGif: String { return self._s[2504]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2505]! } - public var Group_ErrorNotMutualContact: String { return self._s[2506]! } - public var Notification_MessageLifetime5s: String { return self._s[2507]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2493]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2494]! } + public var Privacy_SecretChatsTitle: String { return self._s[2495]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2497]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2498]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2499]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2500]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2501]! } + public var Preview_DeleteGif: String { return self._s[2502]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2503]! } + public var Group_ErrorNotMutualContact: String { return self._s[2504]! } + public var Notification_MessageLifetime5s: String { return self._s[2505]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2508]!, self._r[2508]!, [_0]) + return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2509]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2511]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2512]! } - public var Passport_Address_AddBankStatement: String { return self._s[2513]! } - public var Notification_CallIncoming: String { return self._s[2514]! } - public var Compose_NewGroupTitle: String { return self._s[2515]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2517]! } - public var Passport_Address_Postcode: String { return self._s[2519]! } + public var VoiceOver_Chat_Video: String { return self._s[2507]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2509]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2510]! } + public var Passport_Address_AddBankStatement: String { return self._s[2511]! } + public var Notification_CallIncoming: String { return self._s[2512]! } + public var Compose_NewGroupTitle: String { return self._s[2513]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2515]! } + public var Passport_Address_Postcode: String { return self._s[2517]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2520]!, self._r[2520]!, [_0]) + return formatWithArgumentRanges(self._s[2518]!, self._r[2518]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2521]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2522]! } - public var WallpaperColors_Title: String { return self._s[2523]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2524]! } - public var VoiceOver_MessageContextForward: String { return self._s[2525]! } - public var GroupPermission_Duration: String { return self._s[2526]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2519]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2520]! } + public var WallpaperColors_Title: String { return self._s[2521]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2522]! } + public var VoiceOver_MessageContextForward: String { return self._s[2523]! } + public var GroupPermission_Duration: String { return self._s[2524]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2527]!, self._r[2527]!, [_0]) + return formatWithArgumentRanges(self._s[2525]!, self._r[2525]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2528]! } - public var Username_Placeholder: String { return self._s[2529]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2530]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2531]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2532]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2526]! } + public var Username_Placeholder: String { return self._s[2527]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2528]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2529]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2530]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2534]!, self._r[2534]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2532]!, self._r[2532]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2535]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2536]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2537]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2538]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2539]! } - public var Conversation_ContextMenuMore: String { return self._s[2540]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2541]! } - public var CallSettings_TabIcon: String { return self._s[2542]! } - public var KeyCommand_Find: String { return self._s[2543]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2544]! } - public var Message_PinnedGame: String { return self._s[2545]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2546]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2548]! } - public var Login_CallRequestState2: String { return self._s[2550]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2552]! } + public var Passport_PasswordDescription: String { return self._s[2533]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2534]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2535]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2536]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2537]! } + public var Conversation_ContextMenuMore: String { return self._s[2538]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2539]! } + public var CallSettings_TabIcon: String { return self._s[2540]! } + public var KeyCommand_Find: String { return self._s[2541]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2542]! } + public var Message_PinnedGame: String { return self._s[2543]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2544]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2546]! } + public var Login_CallRequestState2: String { return self._s[2548]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2550]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) + return formatWithArgumentRanges(self._s[2551]!, self._r[2551]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2555]!, self._r[2555]!, [_0]) + return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2556]! } - public var Conversation_InstantPagePreview: String { return self._s[2557]! } + public var WallpaperPreview_Blurred: String { return self._s[2554]! } + public var Conversation_InstantPagePreview: String { return self._s[2555]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2558]!, self._r[2558]!, [_0]) + return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2561]! } - public var WallpaperSearch_ColorRed: String { return self._s[2562]! } - public var GroupPermission_NoPinMessages: String { return self._s[2563]! } - public var Passport_Language_es: String { return self._s[2564]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2566]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2567]! } + public var SecretTimer_VideoDescription: String { return self._s[2559]! } + public var WallpaperSearch_ColorRed: String { return self._s[2560]! } + public var GroupPermission_NoPinMessages: String { return self._s[2561]! } + public var Passport_Language_es: String { return self._s[2562]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2564]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2565]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2568]!, self._r[2568]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2569]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2570]! } - public var Watch_UserInfo_Unmute: String { return self._s[2571]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2572]! } - public var AccessDenied_CameraRestricted: String { return self._s[2574]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2567]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2568]! } + public var Watch_UserInfo_Unmute: String { return self._s[2569]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2570]! } + public var AccessDenied_CameraRestricted: String { return self._s[2572]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2575]!, self._r[2575]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2573]!, self._r[2573]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2577]! } - public var Settings_CopyUsername: String { return self._s[2578]! } - public var Contacts_SearchLabel: String { return self._s[2579]! } - public var Map_OpenInYandexNavigator: String { return self._s[2581]! } - public var PasscodeSettings_EncryptData: String { return self._s[2582]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2583]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2584]! } - public var DialogList_AdNoticeAlert: String { return self._s[2585]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2587]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2588]! } - public var Localization_LanguageCustom: String { return self._s[2589]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2590]! } - public var CallFeedback_Title: String { return self._s[2591]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2594]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2595]! } - public var Conversation_InfoGroup: String { return self._s[2596]! } - public var Compose_NewMessage: String { return self._s[2597]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2598]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2599]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2600]! } + public var ChatList_ReadAll: String { return self._s[2575]! } + public var Settings_CopyUsername: String { return self._s[2576]! } + public var Contacts_SearchLabel: String { return self._s[2577]! } + public var Map_OpenInYandexNavigator: String { return self._s[2579]! } + public var PasscodeSettings_EncryptData: String { return self._s[2580]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2581]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2582]! } + public var DialogList_AdNoticeAlert: String { return self._s[2583]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2585]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2586]! } + public var Localization_LanguageCustom: String { return self._s[2587]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2588]! } + public var CallFeedback_Title: String { return self._s[2589]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2592]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2593]! } + public var Conversation_InfoGroup: String { return self._s[2594]! } + public var Compose_NewMessage: String { return self._s[2595]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2596]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2597]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2598]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2601]!, self._r[2601]!, [_0]) + return formatWithArgumentRanges(self._s[2599]!, self._r[2599]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2602]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2603]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2604]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2605]! } - public var Channel_BlackList_Title: String { return self._s[2606]! } - public var UserInfo_PhoneCall: String { return self._s[2607]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2609]! } - public var State_connecting: String { return self._s[2610]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2611]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2600]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2601]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2602]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2603]! } + public var Channel_BlackList_Title: String { return self._s[2604]! } + public var UserInfo_PhoneCall: String { return self._s[2605]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2607]! } + public var State_connecting: String { return self._s[2608]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2609]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2612]!, self._r[2612]!, [_0]) + return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2613]! } - public var Passport_Identity_EditPassport: String { return self._s[2614]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2616]! } - public var Localization_EnglishLanguageName: String { return self._s[2617]! } - public var Share_AuthDescription: String { return self._s[2618]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2619]! } - public var Passport_Identity_Surname: String { return self._s[2620]! } - public var Compose_TokenListPlaceholder: String { return self._s[2621]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2622]! } - public var Settings_AboutEmpty: String { return self._s[2623]! } - public var Conversation_Unmute: String { return self._s[2624]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2626]! } + public var Notifications_GroupNotifications: String { return self._s[2611]! } + public var Passport_Identity_EditPassport: String { return self._s[2612]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2614]! } + public var Localization_EnglishLanguageName: String { return self._s[2615]! } + public var Share_AuthDescription: String { return self._s[2616]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2617]! } + public var Passport_Identity_Surname: String { return self._s[2618]! } + public var Compose_TokenListPlaceholder: String { return self._s[2619]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2620]! } + public var Settings_AboutEmpty: String { return self._s[2621]! } + public var Conversation_Unmute: String { return self._s[2622]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2624]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2627]!, self._r[2627]!, [_1]) + return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2628]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2630]! } - public var ChatSettings_Appearance: String { return self._s[2631]! } - public var Appearance_PickAccentColor: String { return self._s[2632]! } + public var Login_CodeSentCall: String { return self._s[2626]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2628]! } + public var ChatSettings_Appearance: String { return self._s[2629]! } + public var Appearance_PickAccentColor: String { return self._s[2630]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2633]!, self._r[2633]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2634]!, self._r[2634]!, [_1]) + return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2635]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2636]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2637]! } - public var ChatAdmins_AdminLabel: String { return self._s[2639]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2640]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2642]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2643]! } - public var Month_GenJune: String { return self._s[2644]! } - public var Watch_Location_Current: String { return self._s[2645]! } - public var Conversation_TitleMute: String { return self._s[2646]! } + public var Notification_CallMissed: String { return self._s[2633]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2634]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2635]! } + public var ChatAdmins_AdminLabel: String { return self._s[2637]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2638]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2640]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2641]! } + public var Month_GenJune: String { return self._s[2642]! } + public var Watch_Location_Current: String { return self._s[2643]! } + public var Conversation_TitleMute: String { return self._s[2644]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_1]) + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2648]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2646]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_0]) + return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2650]! } - public var Chat_SlowmodeSendError: String { return self._s[2651]! } - public var MaskStickerSettings_Info: String { return self._s[2652]! } + public var Call_ReportPlaceholder: String { return self._s[2648]! } + public var Chat_SlowmodeSendError: String { return self._s[2649]! } + public var MaskStickerSettings_Info: String { return self._s[2650]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2653]!, self._r[2653]!, [_0]) + return formatWithArgumentRanges(self._s[2651]!, self._r[2651]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2654]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2656]! } - public var Contacts_ShareTelegram: String { return self._s[2657]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2658]! } - public var Channel_ErrorAccessDenied: String { return self._s[2659]! } - public var UserInfo_ScamBotWarning: String { return self._s[2661]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2662]! } - public var Call_ConnectionErrorTitle: String { return self._s[2663]! } - public var UserInfo_NotificationsEnable: String { return self._s[2664]! } - public var ArchivedChats_IntroText1: String { return self._s[2665]! } - public var Tour_Text4: String { return self._s[2668]! } - public var WallpaperSearch_Recent: String { return self._s[2669]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2670]! } - public var Profile_MessageLifetime2s: String { return self._s[2672]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2673]! } - public var Notification_MessageLifetime2s: String { return self._s[2674]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2652]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2654]! } + public var Contacts_ShareTelegram: String { return self._s[2655]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2656]! } + public var Channel_ErrorAccessDenied: String { return self._s[2657]! } + public var UserInfo_ScamBotWarning: String { return self._s[2659]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2660]! } + public var Call_ConnectionErrorTitle: String { return self._s[2661]! } + public var UserInfo_NotificationsEnable: String { return self._s[2662]! } + public var ArchivedChats_IntroText1: String { return self._s[2663]! } + public var Tour_Text4: String { return self._s[2666]! } + public var WallpaperSearch_Recent: String { return self._s[2667]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2668]! } + public var Profile_MessageLifetime2s: String { return self._s[2670]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2671]! } + public var Notification_MessageLifetime2s: String { return self._s[2672]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2675]!, self._r[2675]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2673]!, self._r[2673]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2676]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2677]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2678]! } + public var Cache_ClearCache: String { return self._s[2674]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2675]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2676]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2682]!, self._r[2682]!, [_0]) + return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2684]!, self._r[2684]!, [_0]) + return formatWithArgumentRanges(self._s[2682]!, self._r[2682]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2685]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2686]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2687]! } - public var ChatList_UnarchiveAction: String { return self._s[2688]! } - public var AutoNightTheme_Title: String { return self._s[2689]! } - public var InstantPage_FeedbackButton: String { return self._s[2690]! } - public var Passport_FieldAddress: String { return self._s[2691]! } + public var LocalGroup_Text: String { return self._s[2683]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2684]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2685]! } + public var ChatList_UnarchiveAction: String { return self._s[2686]! } + public var AutoNightTheme_Title: String { return self._s[2687]! } + public var InstantPage_FeedbackButton: String { return self._s[2688]! } + public var Passport_FieldAddress: String { return self._s[2689]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_1, _2]) + } + public var Month_ShortMarch: String { return self._s[2691]! } + public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2692]!, self._r[2692]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2693]! } - public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2694]!, self._r[2694]!, [_1, _2]) - } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2695]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2696]! } - public var Passport_FloodError: String { return self._s[2697]! } - public var SecretGif_Title: String { return self._s[2698]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2699]! } - public var Passport_Language_th: String { return self._s[2701]! } - public var Passport_Address_Address: String { return self._s[2702]! } - public var Login_InvalidLastNameError: String { return self._s[2703]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2704]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2705]! } - public var SettingsSearch_FAQ: String { return self._s[2706]! } - public var ShareMenu_Send: String { return self._s[2707]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2709]! } - public var Month_GenNovember: String { return self._s[2711]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2713]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2693]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2694]! } + public var Passport_FloodError: String { return self._s[2695]! } + public var SecretGif_Title: String { return self._s[2696]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2697]! } + public var Passport_Language_th: String { return self._s[2699]! } + public var Passport_Address_Address: String { return self._s[2700]! } + public var Login_InvalidLastNameError: String { return self._s[2701]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2702]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2703]! } + public var SettingsSearch_FAQ: String { return self._s[2704]! } + public var ShareMenu_Send: String { return self._s[2705]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2707]! } + public var Month_GenNovember: String { return self._s[2709]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2711]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2714]!, self._r[2714]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2712]!, self._r[2712]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2715]! } - public var NotificationsSound_Tritone: String { return self._s[2716]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2718]! } + public var Checkout_Email: String { return self._s[2713]! } + public var NotificationsSound_Tritone: String { return self._s[2714]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2716]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_1]) + return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2722]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2720]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2723]!, self._r[2723]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2724]! } - public var Notification_Exceptions_Add: String { return self._s[2725]! } - public var DialogList_You: String { return self._s[2726]! } - public var MediaPicker_Send: String { return self._s[2729]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2730]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2731]! } - public var Call_AudioRouteSpeaker: String { return self._s[2732]! } - public var Appearance_CreateThemeInfo: String { return self._s[2733]! } - public var Watch_UserInfo_Title: String { return self._s[2734]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2735]! } - public var Appearance_AccentColor: String { return self._s[2736]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2722]! } + public var Notification_Exceptions_Add: String { return self._s[2723]! } + public var DialogList_You: String { return self._s[2724]! } + public var MediaPicker_Send: String { return self._s[2727]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2728]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2729]! } + public var Call_AudioRouteSpeaker: String { return self._s[2730]! } + public var Appearance_CreateThemeInfo: String { return self._s[2731]! } + public var Watch_UserInfo_Title: String { return self._s[2732]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2733]! } + public var Appearance_AccentColor: String { return self._s[2734]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2737]!, self._r[2737]!, [_0]) + return formatWithArgumentRanges(self._s[2735]!, self._r[2735]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2738]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2736]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2739]!, self._r[2739]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2737]!, self._r[2737]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2740]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2741]! } - public var Notification_CallOutgoing: String { return self._s[2742]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2743]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2744]! } - public var Call_RecordingDisabledMessage: String { return self._s[2745]! } - public var Message_Game: String { return self._s[2746]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2747]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2748]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2749]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2750]! } - public var Date_DialogDateFormat: String { return self._s[2751]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2752]! } - public var Notifications_InAppNotifications: String { return self._s[2753]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2738]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2739]! } + public var Notification_CallOutgoing: String { return self._s[2740]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2741]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2742]! } + public var Call_RecordingDisabledMessage: String { return self._s[2743]! } + public var Message_Game: String { return self._s[2744]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2745]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2746]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2747]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2748]! } + public var Date_DialogDateFormat: String { return self._s[2749]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2750]! } + public var Notifications_InAppNotifications: String { return self._s[2751]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_0]) + return formatWithArgumentRanges(self._s[2752]!, self._r[2752]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2755]!, self._r[2755]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2756]! } + public var NewContact_Title: String { return self._s[2754]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2757]!, self._r[2757]!, [_0]) + return formatWithArgumentRanges(self._s[2755]!, self._r[2755]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2758]! } + public var Conversation_ViewContactDetails: String { return self._s[2756]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2760]!, self._r[2760]!, [_1]) + return formatWithArgumentRanges(self._s[2758]!, self._r[2758]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2761]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2762]! } - public var PrivacySettings_Title: String { return self._s[2763]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2766]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2767]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2768]! } - public var Contacts_PhoneNumber: String { return self._s[2769]! } - public var Map_ShowPlaces: String { return self._s[2771]! } - public var ChatAdmins_Title: String { return self._s[2772]! } - public var InstantPage_Reference: String { return self._s[2774]! } - public var ReportGroupLocation_Text: String { return self._s[2775]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2759]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2760]! } + public var PrivacySettings_Title: String { return self._s[2761]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2764]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2765]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2766]! } + public var Contacts_PhoneNumber: String { return self._s[2767]! } + public var Map_ShowPlaces: String { return self._s[2769]! } + public var ChatAdmins_Title: String { return self._s[2770]! } + public var InstantPage_Reference: String { return self._s[2772]! } + public var ReportGroupLocation_Text: String { return self._s[2773]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2776]!, self._r[2776]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2774]!, self._r[2774]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2777]! } - public var Watch_UserInfo_Block: String { return self._s[2778]! } - public var ChatSettings_Stickers: String { return self._s[2779]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2780]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2781]! } + public var Camera_FlashOff: String { return self._s[2775]! } + public var Watch_UserInfo_Block: String { return self._s[2776]! } + public var ChatSettings_Stickers: String { return self._s[2777]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2778]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2779]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2782]!, self._r[2782]!, [_0]) + return formatWithArgumentRanges(self._s[2780]!, self._r[2780]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2783]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2784]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2785]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2786]! } - public var VoiceOver_MessageContextShare: String { return self._s[2787]! } - public var CreateTheme_Title: String { return self._s[2789]! } + public var Settings_ViewPhoto: String { return self._s[2781]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2782]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2783]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2784]! } + public var VoiceOver_MessageContextShare: String { return self._s[2785]! } + public var CreateTheme_Title: String { return self._s[2787]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_0]) + return formatWithArgumentRanges(self._s[2788]!, self._r[2788]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2791]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2792]! } + public var Privacy_DeleteDrafts: String { return self._s[2789]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2790]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_0]) + return formatWithArgumentRanges(self._s[2791]!, self._r[2791]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2794]! } - public var DialogList_SavedMessages: String { return self._s[2795]! } - public var GroupInfo_UpgradeButton: String { return self._s[2796]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2798]! } - public var DialogList_Pin: String { return self._s[2799]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2792]! } + public var DialogList_SavedMessages: String { return self._s[2793]! } + public var GroupInfo_UpgradeButton: String { return self._s[2794]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2796]! } + public var DialogList_Pin: String { return self._s[2797]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2798]!, self._r[2798]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2801]!, self._r[2801]!, [_0]) + return formatWithArgumentRanges(self._s[2799]!, self._r[2799]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2802]! } - public var UserInfo_NotificationsDisable: String { return self._s[2803]! } - public var Paint_Outlined: String { return self._s[2804]! } - public var Activity_PlayingGame: String { return self._s[2805]! } - public var SearchImages_NoImagesFound: String { return self._s[2806]! } - public var SocksProxySetup_ProxyType: String { return self._s[2807]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2809]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2810]! } - public var Settings_AppLanguage: String { return self._s[2811]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2812]! } - public var Common_ChoosePhoto: String { return self._s[2813]! } - public var CallFeedback_ReasonEcho: String { return self._s[2814]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2800]! } + public var UserInfo_NotificationsDisable: String { return self._s[2801]! } + public var Paint_Outlined: String { return self._s[2802]! } + public var Activity_PlayingGame: String { return self._s[2803]! } + public var SearchImages_NoImagesFound: String { return self._s[2804]! } + public var SocksProxySetup_ProxyType: String { return self._s[2805]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2807]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2808]! } + public var Settings_AppLanguage: String { return self._s[2809]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2810]! } + public var Common_ChoosePhoto: String { return self._s[2811]! } + public var CallFeedback_ReasonEcho: String { return self._s[2812]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2815]!, self._r[2815]!, [_1]) + return formatWithArgumentRanges(self._s[2813]!, self._r[2813]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2816]! } - public var Activity_UploadingVideo: String { return self._s[2817]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2818]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2819]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2820]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2821]! } - public var Checkout_PayWithTouchId: String { return self._s[2822]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2823]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2814]! } + public var Activity_UploadingVideo: String { return self._s[2815]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2816]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2817]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2818]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2819]! } + public var Checkout_PayWithTouchId: String { return self._s[2820]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2821]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2825]!, self._r[2825]!, [_1]) + return formatWithArgumentRanges(self._s[2823]!, self._r[2823]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2826]! } + public var Notifications_ExceptionsNone: String { return self._s[2824]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_0]) + return formatWithArgumentRanges(self._s[2825]!, self._r[2825]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2828]!, self._r[2828]!, [_1]) + return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2830]! } - public var Passport_Address_Region: String { return self._s[2833]! } - public var ChatList_DeleteChat: String { return self._s[2834]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2835]! } - public var PhotoEditor_TiltShift: String { return self._s[2836]! } - public var Settings_FAQ_URL: String { return self._s[2837]! } - public var Passport_Language_sl: String { return self._s[2838]! } - public var Settings_PrivacySettings: String { return self._s[2840]! } - public var SharedMedia_TitleLink: String { return self._s[2841]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2842]! } - public var Settings_SetProfilePhoto: String { return self._s[2843]! } - public var Channel_About_Help: String { return self._s[2844]! } - public var Contacts_PermissionsEnable: String { return self._s[2845]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2846]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2847]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2849]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2850]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2851]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2852]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2853]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2855]! } - public var Map_OpenInYandexMaps: String { return self._s[2857]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2858]! } - public var VoiceOver_MessageContextReply: String { return self._s[2859]! } - public var PhotoEditor_SaturationTool: String { return self._s[2860]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2828]! } + public var Passport_Address_Region: String { return self._s[2831]! } + public var ChatList_DeleteChat: String { return self._s[2832]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2833]! } + public var PhotoEditor_TiltShift: String { return self._s[2834]! } + public var Settings_FAQ_URL: String { return self._s[2835]! } + public var Passport_Language_sl: String { return self._s[2836]! } + public var Settings_PrivacySettings: String { return self._s[2838]! } + public var SharedMedia_TitleLink: String { return self._s[2839]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2840]! } + public var Settings_SetProfilePhoto: String { return self._s[2841]! } + public var Channel_About_Help: String { return self._s[2842]! } + public var Contacts_PermissionsEnable: String { return self._s[2843]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2844]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2845]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2847]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2848]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2849]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2850]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2851]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2853]! } + public var Map_OpenInYandexMaps: String { return self._s[2855]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2856]! } + public var VoiceOver_MessageContextReply: String { return self._s[2857]! } + public var PhotoEditor_SaturationTool: String { return self._s[2858]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2861]!, self._r[2861]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2862]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2863]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2864]! } - public var Appearance_TextSize: String { return self._s[2865]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2860]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2861]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2862]! } + public var Appearance_TextSize: String { return self._s[2863]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2866]!, self._r[2866]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2864]!, self._r[2864]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2867]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2869]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2865]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2867]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2870]!, self._r[2870]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2868]!, self._r[2868]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2871]!, self._r[2871]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2872]! } - public var Passport_PassportInformation: String { return self._s[2875]! } - public var WatchRemote_AlertTitle: String { return self._s[2876]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2877]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2879]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2870]! } + public var Passport_PassportInformation: String { return self._s[2873]! } + public var WatchRemote_AlertTitle: String { return self._s[2874]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2875]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2877]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_0]) + return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_1]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2882]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2884]! } - public var AccessDenied_CameraDisabled: String { return self._s[2885]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2880]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2882]! } + public var AccessDenied_CameraDisabled: String { return self._s[2883]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2886]!, self._r[2886]!, [_0]) + return formatWithArgumentRanges(self._s[2884]!, self._r[2884]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2889]! } + public var PhotoEditor_ContrastTool: String { return self._s[2887]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2890]!, self._r[2890]!, [_1]) + return formatWithArgumentRanges(self._s[2888]!, self._r[2888]!, [_1]) } - public var DialogList_Draft: String { return self._s[2891]! } - public var Privacy_TopPeersDelete: String { return self._s[2893]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2894]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2895]! } - public var WebSearch_RecentSectionClear: String { return self._s[2896]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2898]! } - public var Common_Done: String { return self._s[2900]! } - public var AuthSessions_EmptyText: String { return self._s[2901]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2902]! } - public var Tour_Title5: String { return self._s[2903]! } + public var DialogList_Draft: String { return self._s[2889]! } + public var Privacy_TopPeersDelete: String { return self._s[2891]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2892]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2893]! } + public var WebSearch_RecentSectionClear: String { return self._s[2894]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2896]! } + public var Common_Done: String { return self._s[2898]! } + public var AuthSessions_EmptyText: String { return self._s[2899]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2900]! } + public var Tour_Title5: String { return self._s[2901]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2904]!, self._r[2904]!, [_0]) + return formatWithArgumentRanges(self._s[2902]!, self._r[2902]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2905]! } - public var Conversation_LinkDialogSave: String { return self._s[2906]! } - public var GroupInfo_ActionRestrict: String { return self._s[2907]! } - public var Checkout_Title: String { return self._s[2908]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2910]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2912]! } - public var Notification_RenamedGroup: String { return self._s[2913]! } - public var PeopleNearby_Groups: String { return self._s[2914]! } - public var Checkout_PayWithFaceId: String { return self._s[2915]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2916]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2918]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2919]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2920]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2903]! } + public var Conversation_LinkDialogSave: String { return self._s[2904]! } + public var GroupInfo_ActionRestrict: String { return self._s[2905]! } + public var Checkout_Title: String { return self._s[2906]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2908]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2910]! } + public var Notification_RenamedGroup: String { return self._s[2911]! } + public var PeopleNearby_Groups: String { return self._s[2912]! } + public var Checkout_PayWithFaceId: String { return self._s[2913]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2914]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2916]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2917]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2918]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_0]) + return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2923]! } + public var Profile_AddToExisting: String { return self._s[2921]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2926]! } - public var Permissions_PrivacyPolicy: String { return self._s[2927]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2928]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2929]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2931]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2933]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2934]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2935]! } - public var VoiceOver_AttachMedia: String { return self._s[2937]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2938]! } + public var Cache_Files: String { return self._s[2924]! } + public var Permissions_PrivacyPolicy: String { return self._s[2925]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2926]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2927]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2929]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2931]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2932]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2933]! } + public var VoiceOver_AttachMedia: String { return self._s[2935]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2936]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2939]!, self._r[2939]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2937]!, self._r[2937]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2940]! } - public var Conversation_SetReminder_Title: String { return self._s[2941]! } - public var Passport_FieldAddressHelp: String { return self._s[2942]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2943]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2938]! } + public var Conversation_SetReminder_Title: String { return self._s[2939]! } + public var Passport_FieldAddressHelp: String { return self._s[2940]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2941]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2944]!, self._r[2944]!, [_0]) + return formatWithArgumentRanges(self._s[2942]!, self._r[2942]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2945]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2947]! } - public var Login_UnknownError: String { return self._s[2948]! } - public var Group_UpgradeNoticeText2: String { return self._s[2950]! } - public var Watch_Compose_AddContact: String { return self._s[2951]! } - public var Web_Error: String { return self._s[2952]! } - public var Gif_Search: String { return self._s[2953]! } - public var Profile_MessageLifetime1h: String { return self._s[2954]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2955]! } - public var Channel_Username_CheckingUsername: String { return self._s[2956]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2957]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2958]! } - public var Channel_AboutItem: String { return self._s[2959]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2961]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2962]! } - public var GroupInfo_SharedMedia: String { return self._s[2963]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2943]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2945]! } + public var Login_UnknownError: String { return self._s[2946]! } + public var Group_UpgradeNoticeText2: String { return self._s[2948]! } + public var Watch_Compose_AddContact: String { return self._s[2949]! } + public var Web_Error: String { return self._s[2950]! } + public var Gif_Search: String { return self._s[2951]! } + public var Profile_MessageLifetime1h: String { return self._s[2952]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2953]! } + public var Channel_Username_CheckingUsername: String { return self._s[2954]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2955]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2956]! } + public var Channel_AboutItem: String { return self._s[2957]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2959]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2960]! } + public var GroupInfo_SharedMedia: String { return self._s[2961]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2962]!, self._r[2962]!, [_1]) + } + public var Call_PhoneCallInProgressMessage: String { return self._s[2963]! } + public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2964]!, self._r[2964]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2965]! } - public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_1]) - } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2967]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2968]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2969]! } - public var CreatePoll_AddOption: String { return self._s[2970]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2971]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2972]! } - public var Channel_Management_AddModerator: String { return self._s[2973]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2974]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2975]! } - public var NotificationsSound_Hello: String { return self._s[2976]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2977]! } - public var Channel_Stickers_Placeholder: String { return self._s[2979]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2965]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2966]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2967]! } + public var CreatePoll_AddOption: String { return self._s[2968]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2969]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2970]! } + public var Channel_Management_AddModerator: String { return self._s[2971]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2972]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2973]! } + public var NotificationsSound_Hello: String { return self._s[2974]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2975]! } + public var Channel_Stickers_Placeholder: String { return self._s[2977]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2980]!, self._r[2980]!, [_0]) + return formatWithArgumentRanges(self._s[2978]!, self._r[2978]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2981]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2982]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2983]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2984]! } - public var AutoDownloadSettings_Channels: String { return self._s[2985]! } - public var Passport_Language_mn: String { return self._s[2986]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2989]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2990]! } - public var Passport_Language_ja: String { return self._s[2992]! } - public var Settings_About_Title: String { return self._s[2993]! } - public var Settings_NotificationsAndSounds: String { return self._s[2994]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2995]! } - public var Settings_BlockedUsers: String { return self._s[2996]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2979]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2980]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2981]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2982]! } + public var AutoDownloadSettings_Channels: String { return self._s[2983]! } + public var Passport_Language_mn: String { return self._s[2984]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2987]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2988]! } + public var Passport_Language_ja: String { return self._s[2990]! } + public var Settings_About_Title: String { return self._s[2991]! } + public var Settings_NotificationsAndSounds: String { return self._s[2992]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2993]! } + public var Settings_BlockedUsers: String { return self._s[2994]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2997]!, self._r[2997]!, [_0]) + return formatWithArgumentRanges(self._s[2995]!, self._r[2995]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2998]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2999]! } - public var Channel_Username_Title: String { return self._s[3000]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2996]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2997]! } + public var Channel_Username_Title: String { return self._s[2998]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3001]!, self._r[3001]!, [_0]) + return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3003]! } - public var AppleWatch_Title: String { return self._s[3004]! } - public var Activity_RecordingVideoMessage: String { return self._s[3005]! } + public var AttachmentMenu_File: String { return self._s[3001]! } + public var AppleWatch_Title: String { return self._s[3002]! } + public var Activity_RecordingVideoMessage: String { return self._s[3003]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3006]!, self._r[3006]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3004]!, self._r[3004]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3007]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3008]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3009]! } - public var Common_Next: String { return self._s[3011]! } - public var Channel_Stickers_YourStickers: String { return self._s[3013]! } - public var Call_AudioRouteHeadphones: String { return self._s[3014]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3016]! } - public var Watch_Contacts_NoResults: String { return self._s[3018]! } - public var PhotoEditor_TintTool: String { return self._s[3021]! } - public var LoginPassword_ResetAccount: String { return self._s[3023]! } - public var Settings_SavedMessages: String { return self._s[3024]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3025]! } - public var Bot_GenericSupportStatus: String { return self._s[3026]! } - public var StickerPack_Add: String { return self._s[3027]! } - public var Checkout_TotalAmount: String { return self._s[3028]! } - public var Your_cards_number_is_invalid: String { return self._s[3029]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3030]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3031]! } + public var Weekday_Saturday: String { return self._s[3005]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3006]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3007]! } + public var Common_Next: String { return self._s[3009]! } + public var Channel_Stickers_YourStickers: String { return self._s[3011]! } + public var Call_AudioRouteHeadphones: String { return self._s[3012]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3014]! } + public var Watch_Contacts_NoResults: String { return self._s[3016]! } + public var PhotoEditor_TintTool: String { return self._s[3019]! } + public var LoginPassword_ResetAccount: String { return self._s[3021]! } + public var Settings_SavedMessages: String { return self._s[3022]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3023]! } + public var Bot_GenericSupportStatus: String { return self._s[3024]! } + public var StickerPack_Add: String { return self._s[3025]! } + public var Checkout_TotalAmount: String { return self._s[3026]! } + public var Your_cards_number_is_invalid: String { return self._s[3027]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3028]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3029]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3032]!, self._r[3032]!, [_0]) + return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3033]!, self._r[3033]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3034]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3032]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3036]!, self._r[3036]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3037]!, self._r[3037]!, [_0]) + return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3038]! } - public var StickerPack_Share: String { return self._s[3039]! } - public var Passport_DeleteAddress: String { return self._s[3040]! } - public var Settings_Passport: String { return self._s[3041]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3042]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3043]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3044]! } - public var Contacts_PermissionsText: String { return self._s[3045]! } - public var Group_Setup_HistoryVisible: String { return self._s[3046]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3048]! } - public var SocksProxySetup_Title: String { return self._s[3049]! } - public var Notification_Mute1h: String { return self._s[3050]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3036]! } + public var StickerPack_Share: String { return self._s[3037]! } + public var Passport_DeleteAddress: String { return self._s[3038]! } + public var Settings_Passport: String { return self._s[3039]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3040]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3041]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3042]! } + public var Contacts_PermissionsText: String { return self._s[3043]! } + public var Group_Setup_HistoryVisible: String { return self._s[3044]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3046]! } + public var SocksProxySetup_Title: String { return self._s[3047]! } + public var Notification_Mute1h: String { return self._s[3048]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3051]!, self._r[3051]!, [_0]) + return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3052]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3050]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3053]!, self._r[3053]!, [_1]) + return formatWithArgumentRanges(self._s[3051]!, self._r[3051]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3054]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3057]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3059]! } - public var DialogList_NoMessagesText: String { return self._s[3060]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3061]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3062]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3064]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3065]! } - public var Common_TakePhotoOrVideo: String { return self._s[3066]! } - public var Call_StatusBusy: String { return self._s[3067]! } - public var Conversation_PinnedMessage: String { return self._s[3068]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3069]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3070]! } - public var Undo_ChatCleared: String { return self._s[3071]! } - public var AppleWatch_ReplyPresets: String { return self._s[3072]! } - public var Passport_DiscardMessageDescription: String { return self._s[3074]! } - public var Login_NetworkError: String { return self._s[3075]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3052]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3055]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3057]! } + public var DialogList_NoMessagesText: String { return self._s[3058]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3059]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3060]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3062]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3063]! } + public var Common_TakePhotoOrVideo: String { return self._s[3064]! } + public var Call_StatusBusy: String { return self._s[3065]! } + public var Conversation_PinnedMessage: String { return self._s[3066]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3067]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3068]! } + public var Undo_ChatCleared: String { return self._s[3069]! } + public var AppleWatch_ReplyPresets: String { return self._s[3070]! } + public var Passport_DiscardMessageDescription: String { return self._s[3072]! } + public var Login_NetworkError: String { return self._s[3073]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3076]!, self._r[3076]!, [_0]) + return formatWithArgumentRanges(self._s[3074]!, self._r[3074]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3077]!, self._r[3077]!, [_0]) + return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3078]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3080]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3076]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3078]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3082]!, self._r[3082]!, [_0]) + return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3083]! } - public var VoiceOver_Chat_Music: String { return self._s[3084]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3085]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3087]! } - public var ConversationMedia_Title: String { return self._s[3088]! } - public var EncryptionKey_Title: String { return self._s[3090]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3091]! } - public var Notification_Exceptions_AddException: String { return self._s[3092]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3093]! } - public var Profile_MessageLifetime1m: String { return self._s[3094]! } + public var Call_ConnectionErrorMessage: String { return self._s[3081]! } + public var VoiceOver_Chat_Music: String { return self._s[3082]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3083]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3085]! } + public var ConversationMedia_Title: String { return self._s[3086]! } + public var EncryptionKey_Title: String { return self._s[3088]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3089]! } + public var Notification_Exceptions_AddException: String { return self._s[3090]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3091]! } + public var Profile_MessageLifetime1m: String { return self._s[3092]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_1]) + return formatWithArgumentRanges(self._s[3093]!, self._r[3093]!, [_1]) } - public var Month_GenMay: String { return self._s[3096]! } + public var Month_GenMay: String { return self._s[3094]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3097]!, self._r[3097]!, [_0]) + return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3098]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3099]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3100]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3102]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3103]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3104]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3105]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3106]! } - public var Channel_JoinChannel: String { return self._s[3108]! } - public var Appearance_Animations: String { return self._s[3111]! } + public var PeopleNearby_Users: String { return self._s[3096]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3097]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3098]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3100]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3101]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3102]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3103]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3104]! } + public var Channel_JoinChannel: String { return self._s[3106]! } + public var Appearance_Animations: String { return self._s[3109]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3112]!, self._r[3112]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3110]!, self._r[3110]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3114]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3116]! } - public var Passport_Address_Street: String { return self._s[3117]! } - public var Conversation_AddContact: String { return self._s[3118]! } - public var Login_PhonePlaceholder: String { return self._s[3119]! } - public var Channel_Members_InviteLink: String { return self._s[3121]! } - public var Bot_Stop: String { return self._s[3122]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3124]! } - public var Notification_PassportValueAddress: String { return self._s[3125]! } - public var Month_ShortJuly: String { return self._s[3126]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3127]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3128]! } - public var Passport_Identity_ReverseSide: String { return self._s[3129]! } - public var Watch_Stickers_Recents: String { return self._s[3132]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3134]! } - public var Map_SendThisLocation: String { return self._s[3135]! } + public var Stickers_GroupStickers: String { return self._s[3112]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3114]! } + public var Passport_Address_Street: String { return self._s[3115]! } + public var Conversation_AddContact: String { return self._s[3116]! } + public var Login_PhonePlaceholder: String { return self._s[3117]! } + public var Channel_Members_InviteLink: String { return self._s[3119]! } + public var Bot_Stop: String { return self._s[3120]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3122]! } + public var Notification_PassportValueAddress: String { return self._s[3123]! } + public var Month_ShortJuly: String { return self._s[3124]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3125]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3126]! } + public var Passport_Identity_ReverseSide: String { return self._s[3127]! } + public var Watch_Stickers_Recents: String { return self._s[3130]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3132]! } + public var Map_SendThisLocation: String { return self._s[3133]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0]) + return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3136]! } + public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3137]!, self._r[3137]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3138]! } - public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_0]) - } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3140]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3138]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3141]!, self._r[3141]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3143]! } - public var Wallpaper_SearchShort: String { return self._s[3144]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3146]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3147]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3148]! } + public var Login_CallRequestState3: String { return self._s[3141]! } + public var Wallpaper_SearchShort: String { return self._s[3142]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3144]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3145]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3146]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3147]!, self._r[3147]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3150]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3154]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3148]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3152]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_0]) + return formatWithArgumentRanges(self._s[3153]!, self._r[3153]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3156]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3157]! } + public var Passport_CorrectErrors: String { return self._s[3154]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3155]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3158]!, self._r[3158]!, [_0]) + return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3159]! } - public var Channel_DiscussionGroup: String { return self._s[3160]! } + public var Map_SendMyCurrentLocation: String { return self._s[3157]! } + public var Channel_DiscussionGroup: String { return self._s[3158]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3162]! } - public var Permissions_NotificationsText_v0: String { return self._s[3163]! } - public var Appearance_AppIcon: String { return self._s[3164]! } - public var LoginPassword_FloodError: String { return self._s[3165]! } - public var Appearance_Publish: String { return self._s[3167]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3168]! } + public var SharedMedia_SearchNoResults: String { return self._s[3160]! } + public var Permissions_NotificationsText_v0: String { return self._s[3161]! } + public var Appearance_AppIcon: String { return self._s[3162]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3163]! } + public var LoginPassword_FloodError: String { return self._s[3164]! } + public var Appearance_Publish: String { return self._s[3166]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3167]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_0]) + return formatWithArgumentRanges(self._s[3168]!, self._r[3168]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3170]! } + public var Passport_Language_bn: String { return self._s[3169]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_0]) + return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_0]) } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_0]) + return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_0]) } - public var CreateTheme_ShortLinkInfo: String { return self._s[3173]! } + public var CreateTheme_ShortLinkInfo: String { return self._s[3172]! } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3174]!, self._r[3174]!, [_0]) + return formatWithArgumentRanges(self._s[3173]!, self._r[3173]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3177]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3179]! } - public var Contacts_PermissionsAllow: String { return self._s[3180]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3181]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3182]! } - public var WallpaperPreview_Pattern: String { return self._s[3183]! } - public var Paint_Duplicate: String { return self._s[3184]! } - public var Passport_Address_Country: String { return self._s[3185]! } - public var Notification_RenamedChannel: String { return self._s[3187]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3188]! } - public var Group_MessagePhotoUpdated: String { return self._s[3189]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3190]! } - public var Conversation_ContextMenuBan: String { return self._s[3191]! } - public var TwoStepAuth_EmailSent: String { return self._s[3192]! } - public var MessagePoll_NoVotes: String { return self._s[3193]! } - public var Passport_Language_is: String { return self._s[3194]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3196]! } - public var Tour_Text5: String { return self._s[3197]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3176]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3178]! } + public var Contacts_PermissionsAllow: String { return self._s[3179]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3180]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3181]! } + public var WallpaperPreview_Pattern: String { return self._s[3182]! } + public var Paint_Duplicate: String { return self._s[3183]! } + public var Passport_Address_Country: String { return self._s[3184]! } + public var Notification_RenamedChannel: String { return self._s[3186]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3187]! } + public var Group_MessagePhotoUpdated: String { return self._s[3188]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3189]! } + public var Conversation_ContextMenuBan: String { return self._s[3190]! } + public var TwoStepAuth_EmailSent: String { return self._s[3191]! } + public var MessagePoll_NoVotes: String { return self._s[3192]! } + public var Passport_Language_is: String { return self._s[3193]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3195]! } + public var Tour_Text5: String { return self._s[3196]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3200]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3201]! } + public var Undo_SecretChatDeleted: String { return self._s[3199]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3200]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3202]!, self._r[3202]!, [_0]) + return formatWithArgumentRanges(self._s[3201]!, self._r[3201]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3203]! } - public var Paint_Edit: String { return self._s[3205]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3202]! } + public var Paint_Edit: String { return self._s[3204]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3206]! } public var Undo_DeletedGroup: String { return self._s[3208]! } public var LoginPassword_ForgotPassword: String { return self._s[3209]! } public var GroupInfo_GroupNamePlaceholder: String { return self._s[3210]! } @@ -4146,330 +4146,333 @@ public final class PresentationStrings { public var Channel_Setup_TypePublicHelp: String { return self._s[3645]! } public var Passport_Identity_EditInternalPassport: String { return self._s[3646]! } public var PhotoEditor_Skip: String { return self._s[3647]! } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func StickerPack_StickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { + public func MessageTimer_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPhotos(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { + public func ForwardedPolls(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Minutes(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Seconds(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedStickers(_ value: Int32) -> String { + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, _1, _2) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _0, _1) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) } public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _1, _2) } public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { + public func SharedMedia_Photo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Link(_ value: Int32) -> String { + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + public func ForwardedContacts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareItem(_ value: Int32) -> String { + public func MessageTimer_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _1, _2) + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { + public func SharedMedia_Link(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) @@ -4479,218 +4482,215 @@ public final class PresentationStrings { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_Exceptions(_ value: Int32) -> String { + public func ForwardedStickers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func SharedMedia_Generic(_ value: Int32) -> String { + public func Watch_UserInfo_Mute(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAMinutes(_ value: Int32) -> String { + public func Media_SharePhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortSeconds(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Video(_ value: Int32) -> String { + public func UserCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAudios(_ value: Int32) -> String { + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _1, _2) + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func Call_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + public func SharedMedia_Generic(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedMessages(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func ForwardedLocations(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, _1, _2) + public func SharedMedia_File(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_SharePhoto(_ value: Int32) -> String { + public func SharedMedia_Video(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, _0, _1) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) } - public func Invitation_Members(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Hours(_ value: Int32) -> String { + public func MessageTimer_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) + public func Media_ShareVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func ChatList_SelectedChats(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, _1, _2) } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, _1, _2) } public func Conversation_SelectedMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + public func MuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) } - public func UserCount(_ value: Int32) -> String { + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { + public func ForwardedFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Hours(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 7932f0714c..9fa8299821 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -75,7 +75,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } - let backgroundNode: WallpaperbackgroundNode + let backgroundNode: WallpaperBackgroundNode let historyNode: ChatHistoryListNode let reactionContainerNode: ReactionSelectionParentNode let historyNodeContainer: ASDisplayNode @@ -201,7 +201,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.navigationBar = navigationBar self.controller = controller - self.backgroundNode = WallpaperbackgroundNode() + self.backgroundNode = WallpaperBackgroundNode() self.backgroundNode.displaysAsynchronously = false self.titleAccessoryPanelContainer = ChatControllerTitlePanelNodeContainer() diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift index 48885d29c0..bc45a9c560 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift @@ -14,7 +14,7 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat return nil } var selectedContext: ChatTitlePanelContext? - if !chatPresentationInterfaceState.titlePanelContexts.isEmpty { + if !chatPresentationInterfaceState.titlePanelContexts.isEmpty && !chatPresentationInterfaceState.isScheduledMessages { loop: for context in chatPresentationInterfaceState.titlePanelContexts.reversed() { switch context { case .pinnedMessage: diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift index 9ff1088523..57c713f651 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift @@ -310,7 +310,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { if case let .Audio(voice, duration, title, performer, waveform) = attribute { isAudio = true - if let forcedResourceStatus = forcedResourceStatus { + if let forcedResourceStatus = forcedResourceStatus, statusUpdated { updatedStatusSignal = .single((forcedResourceStatus, nil)) } else if let currentUpdatedStatusSignal = updatedStatusSignal { updatedStatusSignal = currentUpdatedStatusSignal @@ -819,7 +819,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { if state == .none { self.statusNode = nil } - statusNode.transitionToState(state, animated: animated, completion: { [weak statusNode] in + statusNode.transitionToState(state, animated: animated, synchronous: presentationData.theme.preview, completion: { [weak statusNode] in if state == .none { statusNode?.removeFromSupernode() } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift index 0baa0eac9b..3bafe6327b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift @@ -115,7 +115,11 @@ final class ChatMessageNotificationItemNode: NotificationItemNode { title = peer.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) } else if let author = firstMessage.author { if author.id != peer.id { - title = author.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) + "@" + peer.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) + if author.id == item.context.account.peerId { + title = presentationData.strings.DialogList_You + "@" + peer.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) + } else { + title = author.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) + "@" + peer.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) + } } else { title = peer.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) for attribute in firstMessage.attributes { @@ -130,6 +134,14 @@ final class ChatMessageNotificationItemNode: NotificationItemNode { } else { title = peer.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) } + + if let text = title, firstMessage.flags.contains(.WasScheduled) { + if let author = firstMessage.author, author.id == peer.id, author.id == item.context.account.peerId { + title = presentationData.strings.ScheduledMessages_ReminderNotification + } else { + title = "📅 \(text)" + } + } } var titleIcon: UIImage? diff --git a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift index d8a5455a8b..4cc3af7dc4 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyCamera.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyCamera.swift @@ -61,7 +61,7 @@ func presentedLegacyCamera(context: AccountContext, peer: Peer, cameraView: TGAt controller.recipientName = peer.displayTitle if peer.id != context.account.peerId { if peer is TelegramUser { - controller.hasTimer = !hasSchedule + controller.hasTimer = hasSchedule } controller.hasSilentPosting = !isSecretChat } diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index d9042d7f572409865472896f74c9ee49cac210b3..8e0df3f42114b99afa2fde1c3632667ef97ebd9f 100644 GIT binary patch delta 28607 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

wbnqIdDl}A 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 delta 28570 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 a&guJZ14~g*AQS-Afr==QJ3s*gb^`#el86!j From 627af6dd0ebe22fb9a1846cea550c641cce8dc22 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 15:54:56 +0400 Subject: [PATCH 48/86] Update sticker context icon --- Telegram-iOS/en.lproj/Localizable.strings | 2 +- .../Context Menu/Sticker.imageset/Contents.json | 12 ++++++++++++ .../Sticker.imageset/ic_lt_sticker.pdf | Bin 0 -> 4448 bytes .../ChatInterfaceStateContextMenus.swift | 8 ++++---- 4 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Sticker.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Sticker.imageset/ic_lt_sticker.pdf diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 401ae54f93..f99245fc14 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4579,7 +4579,7 @@ Any member of this group will be able to see messages in the channel."; "VoiceOver.Chat.Title" = "Title: %@"; "VoiceOver.Chat.Caption" = "Caption: %@"; "VoiceOver.Chat.Duration" = "Duration: %@"; -"VoiceOver.Chat.Size" = "Size %@"; +"VoiceOver.Chat.Size" = "Size: %@"; "VoiceOver.Chat.MusicTitle" = "%1$@, by %2$@"; "VoiceOver.Chat.PlayHint" = "Double tap to play"; "VoiceOver.Chat.OpenHint" = "Double tap to open"; diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Sticker.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Sticker.imageset/Contents.json new file mode 100644 index 0000000000..0de19e0d16 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Sticker.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_lt_sticker.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Sticker.imageset/ic_lt_sticker.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Sticker.imageset/ic_lt_sticker.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd505c6689e1bce866e2d91783f380592770cca0 GIT binary patch literal 4448 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift index 1ea930f970..d1e7c1b6cd 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift @@ -363,9 +363,9 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: |> map { data -> [ContextMenuItem] in var actions: [ContextMenuItem] = [] - if let starStatus = data.starStatus, let image = starStatus ? starIconFilled : starIconEmpty { - actions.append(.action(ContextMenuActionItem(text: starStatus ? "Star" : "Unstar", icon: { theme in - return generateTintedImage(image: image, color: theme.actionSheet.primaryTextColor) + if let starStatus = data.starStatus { + actions.append(.action(ContextMenuActionItem(text: starStatus ? chatPresentationInterfaceState.strings.Stickers_RemoveFromFavorites : chatPresentationInterfaceState.strings.Stickers_AddToFavorites, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Rate"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in interfaceInteraction.toggleMessageStickerStarred(messages[0].id) f(.default) @@ -600,7 +600,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: if data.messageActions.options.contains(.viewStickerPack) { actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.StickerPack_ViewPack, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Info"), color: theme.actionSheet.primaryTextColor) + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Sticker"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in let _ = controllerInteraction.openMessage(message, .default) f(.dismissWithoutContent) From aaed7169246b43d6af4de09d97ab91cd24252a00 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 14:57:36 +0300 Subject: [PATCH 49/86] Fixed localization --- .../Themes/CreateThemeController.swift | 22 ++++++-- .../ThemeAccentColorControllerNode.swift | 3 +- .../Themes/ThemePreviewControllerNode.swift | 54 ++++++++++++++++--- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift index a6ed034380..5973d2bde5 100644 --- a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift @@ -30,12 +30,13 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder) case title(PresentationTheme, PresentationStrings, String, String) case slug(PresentationTheme, PresentationStrings, String, String, Bool) + case slugInfo(PresentationTheme, String) var section: ItemListSectionId { switch self { case .chatPreviewHeader, .chatPreview: return CreateThemeControllerSection.chatPreview.rawValue - case .title, .slug: + case .title, .slug, .slugInfo: return CreateThemeControllerSection.info.rawValue } } @@ -50,6 +51,8 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { return 2 case .slug: return 3 + case .slugInfo: + return 4 } } @@ -79,6 +82,12 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { } else { return false } + case let .slugInfo(lhsTheme, lhsText): + if case let .slug(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } } } @@ -101,13 +110,15 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { } }, action: {}) case let .slug(theme, strings, title, text, enabled): - return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: "t.me/addtheme/", textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "Short Name", type: .username, enabled: enabled, sectionId: self.section, textUpdated: { value in + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: "t.me/addtheme/", textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: title, type: .username, enabled: enabled, sectionId: self.section, textUpdated: { value in arguments.updateState { current in var state = current state.slug = value return state } }, action: {}) + case let .slugInfo(theme, text): + return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) } } } @@ -133,11 +144,12 @@ private struct CreateThemeControllerState: Equatable { private func createThemeControllerEntries(presentationData: PresentationData, theme: PresentationTheme, state: CreateThemeControllerState) -> [CreateThemeControllerEntry] { var entries: [CreateThemeControllerEntry] = [] - entries.append(.chatPreviewHeader(presentationData.theme, "Preview".uppercased())) + entries.append(.chatPreviewHeader(presentationData.theme, presentationData.strings.CreateTheme_Preview.uppercased())) entries.append(.chatPreview(presentationData.theme, theme, theme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) - entries.append(.title(presentationData.theme, presentationData.strings, "Title", state.title)) - entries.append(.slug(presentationData.theme, presentationData.strings, "Slug", state.slug, true)) + entries.append(.title(presentationData.theme, presentationData.strings, presentationData.strings.CreateTheme_Title, state.title)) + entries.append(.slug(presentationData.theme, presentationData.strings, presentationData.strings.CreateTheme_ShortLink, state.slug, true)) + entries.append(.slugInfo(presentationData.theme, presentationData.strings.CreateTheme_ShortLinkInfo)) return entries } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index 869541f53f..5696ebf78f 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -39,12 +39,11 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate private let chatListBackgroundNode: ASDisplayNode private var chatNodes: [ListViewItemNode]? + private let maskNode: ASImageNode private let chatBackgroundNode: WallpaperBackgroundNode private var messageNodes: [ListViewItemNode]? - private let maskNode: ASImageNode - private var colorPanelNode: WallpaperColorPanelNode private let toolbarNode: WallpaperGalleryToolbarNode diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 8b4d5bdb38..23ee43dfd1 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -10,18 +10,36 @@ import TelegramUIPreferences import AccountContext import ChatListUI +private func generateMaskImage(color: UIColor) -> UIImage? { + return generateImage(CGSize(width: 1.0, height: 60.0), opaque: false, rotatedContext: { size, context in + let bounds = CGRect(origin: CGPoint(), size: size) + context.clear(bounds) + + let gradientColors = [color.withAlphaComponent(0.0).cgColor, color.cgColor, color.cgColor] as CFArray + + var locations: [CGFloat] = [0.0, 0.75, 1.0] + let colorSpace = CGColorSpaceCreateDeviceRGB() + let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors, locations: &locations)! + + context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: 0.0, y: 60.0), options: CGGradientDrawingOptions()) + }) +} + final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { private let context: AccountContext private let previewTheme: PresentationTheme private var presentationData: PresentationData + private let referenceTimestamp: Int32 + private let scrollNode: ASScrollNode private let pageControlBackgroundNode: ASDisplayNode private let pageControlNode: PageControlNode private let chatListBackgroundNode: ASDisplayNode private var chatNodes: [ListViewItemNode]? - + private let maskNode: ASImageNode + private let chatBackgroundNode: ASDisplayNode private var messageNodes: [ListViewItemNode]? @@ -37,6 +55,13 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + let calendar = Calendar(identifier: .gregorian) + var components = calendar.dateComponents(Set([.era, .year, .month, .day, .hour, .minute, .second]), from: Date()) + components.hour = 13 + components.minute = 0 + components.second = 0 + self.referenceTimestamp = Int32(calendar.date(from: components)?.timeIntervalSince1970 ?? 0.0) + self.scrollNode = ASScrollNode() self.pageControlBackgroundNode = ASDisplayNode() self.pageControlBackgroundNode.backgroundColor = UIColor(rgb: 0x000000, alpha: 0.3) @@ -49,6 +74,11 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.previewTheme, strings: self.presentationData.strings) + self.maskNode = ASImageNode() + self.maskNode.displaysAsynchronously = false + self.maskNode.displayWithoutProcessing = true + self.maskNode.contentMode = .scaleToFill + super.init() self.setViewBlock({ @@ -58,6 +88,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.backgroundColor = self.previewTheme.list.plainBackgroundColor self.chatListBackgroundNode.backgroundColor = self.previewTheme.chatList.backgroundColor + self.maskNode.image = generateMaskImage(color: self.previewTheme.chatList.backgroundColor) if case let .color(value) = self.previewTheme.chat.defaultWallpaper { self.chatBackgroundNode.backgroundColor = UIColor(rgb: UInt32(bitPattern: value)) @@ -67,6 +98,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.pageControlNode.pagesCount = 2 self.addSubnode(self.scrollNode) + self.chatListBackgroundNode.addSubnode(self.maskNode) self.addSubnode(self.pageControlBackgroundNode) self.addSubnode(self.pageControlNode) self.addSubnode(self.toolbarNode) @@ -131,6 +163,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let peers = SimpleDictionary() let messages = SimpleDictionary() + let selfPeer = TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) @@ -144,19 +177,25 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let peer6 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 5), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let peer7 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 6), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let timestamp = Int32(Date(timeInterval: -600, since: Date()).timeIntervalSince1970) + let timestamp = self.referenceTimestamp - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer1.id, namespace: 0, id: 0), timestamp: timestamp)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer1.id, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer1, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let timestamp1 = timestamp + 120 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: 0, messageIndex: MessageIndex(id: MessageId(peerId: peer1.id, namespace: 0, id: 0), timestamp: timestamp1)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer1.id, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp1, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: selfPeer, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer1), combinedReadState: CombinedPeerReadState(states: [(Namespaces.Message.Cloud, PeerReadState.idBased(maxIncomingReadId: 0, maxOutgoingReadId: 0, maxKnownId: 0, count: 0, markedUnread: false))]), notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer2.id, namespace: 0, id: 0), timestamp: timestamp - 60)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer2.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 60, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer2, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let timestamp2 = timestamp + 3660 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer2.id, namespace: 0, id: 0), timestamp: timestamp2)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer2.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp2, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer2, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer2), combinedReadState: CombinedPeerReadState(states: [(Namespaces.Message.Cloud, PeerReadState.idBased(maxIncomingReadId: 0, maxOutgoingReadId: 0, maxKnownId: 0, count: 1, markedUnread: false))]), notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer3.id, namespace: 0, id: 0), timestamp: timestamp - 180)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer3.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 180, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer3Author, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer3), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let timestamp3 = timestamp + 3200 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer3.id, namespace: 0, id: 0), timestamp: timestamp3)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer3.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp3, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer3Author, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer3), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer4.id, namespace: 0, id: 0), timestamp: timestamp - 240)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer4.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 240, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer4, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer4), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let timestamp4 = timestamp + 3000 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer4.id, namespace: 0, id: 0), timestamp: timestamp4)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer4.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp4, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer4, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer4), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) - items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer5.id, namespace: 0, id: 0), timestamp: timestamp - 300)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer4.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 300, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer5, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer5), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + let timestamp5 = timestamp + 1000 + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer5.id, namespace: 0, id: 0), timestamp: timestamp5)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer4.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp5, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer5, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer5), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer6.id, namespace: 0, id: 0), timestamp: timestamp - 360)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer6.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 360, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer6, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer6), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) + items.append(ChatListItem(presentationData: chatListPresentationData, context: self.context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: MessageIndex(id: MessageId(peerId: peer7.id, namespace: 0, id: 0), timestamp: timestamp - 420)), content: .peer(message: Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer7.id, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: timestamp - 420, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer6, text: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), peer: RenderedPeer(peer: peer7), combinedReadState: nil, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(tagSummaryCount: nil, actionsSummaryCount: nil), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: false), editing: false, hasActiveRevealControls: false, selected: false, header: nil, enableContextActions: false, hiddenOffset: false, interaction: interaction)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) @@ -291,5 +330,6 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let pageControlFrame = CGRect(origin: CGPoint(x: floor((bounds.width - pageControlSize.width) / 2.0), y: layout.size.height - toolbarHeight - 42.0), size: pageControlSize) self.pageControlNode.frame = pageControlFrame self.pageControlBackgroundNode.frame = CGRect(x: pageControlFrame.minX - 11.0, y: pageControlFrame.minY - 12.0, width: pageControlFrame.width + 22.0, height: 30.0) + transition.updateFrame(node: self.maskNode, frame: CGRect(x: 0.0, y: layout.size.height - toolbarHeight - 60.0, width: bounds.width, height: 60.0)) } } From f1876439aa4e7e9998ed21c5f21b04b2761bd7ec Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 14:58:52 +0300 Subject: [PATCH 50/86] Fixed localization --- .../SettingsUI/Sources/Themes/CreateThemeController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift index 5973d2bde5..3db7f8bac8 100644 --- a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift @@ -181,7 +181,7 @@ public func createThemeController(context: AccountContext, theme: PresentationTh }) }) - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text("Publish Theme"), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.CreateTheme_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) let listState = ItemListNodeState(entries: createThemeControllerEntries(presentationData: presentationData, theme: theme, state: state), style: .blocks, emptyStateItem: nil, animateChanges: false) return (controllerState, (listState, arguments)) From cfb90f36143c11f0254fb6bab8369a594b83d9c0 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 16:01:19 +0400 Subject: [PATCH 51/86] Use propertyanimator if available --- .../ContextUI/Sources/ContextController.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 6e7a6cc673..6c2b964ccf 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -325,6 +325,17 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi self.dimNode.alpha = 1.0 self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor) + + if #available(iOS 10.0, *) { + if let propertyAnimator = self.propertyAnimator { + let propertyAnimator = propertyAnimator as? UIViewPropertyAnimator + propertyAnimator?.stopAnimation(true) + } + self.propertyAnimator = UIViewPropertyAnimator(duration: 0.2 * animationDurationFactor, curve: .easeInOut, animations: { [weak self] in + self?.effectView.effect = makeCustomZoomBlurEffect() + }) + } + if let _ = self.propertyAnimator { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.25 * animationDurationFactor, from: 0.0, to: 1.0, update: { [weak self] value in @@ -399,6 +410,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } if #available(iOS 10.0, *) { + if let propertyAnimator = self.propertyAnimator { + let propertyAnimator = propertyAnimator as? UIViewPropertyAnimator + propertyAnimator?.stopAnimation(true) + } self.propertyAnimator = UIViewPropertyAnimator(duration: 0.2, curve: .easeInOut, animations: { [weak self] in self?.effectView.effect = nil }) From ea77b104ec5eae279dde964e7206d56e5a20a611 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 15:06:16 +0300 Subject: [PATCH 52/86] UI fixes --- .../SettingsUI/Sources/Themes/CreateThemeController.swift | 2 +- .../TelegramUI/ChatSendMessageActionSheetControllerNode.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift index 3db7f8bac8..7b74f8abb8 100644 --- a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift @@ -83,7 +83,7 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { return false } case let .slugInfo(lhsTheme, lhsText): - if case let .slug(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + if case let .slugInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { return true } else { return false diff --git a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift index c3deda52ee..c56387dcf1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift @@ -9,7 +9,7 @@ import TelegramPresentationData import AccountContext private let leftInset: CGFloat = 16.0 -private let rightInset: CGFloat = 46.0 +private let rightInset: CGFloat = 16.0 private enum ChatSendMessageActionIcon { case sendWithoutSound From 69297c0466144b7613755cf6460da973f782a14d Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 15:14:23 +0300 Subject: [PATCH 53/86] Improved scheduled date localization --- Telegram-iOS/en.lproj/Localizable.strings | 1 + .../Sources/PresentationStrings.swift | 6187 +++++++++-------- .../TelegramUI/ChatMessageDateHeader.swift | 6 +- .../Resources/PresentationStrings.mapping | Bin 125022 -> 125066 bytes 4 files changed, 3100 insertions(+), 3094 deletions(-) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 0c89ba30f0..a7885c8fcd 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4610,6 +4610,7 @@ Any member of this group will be able to see messages in the channel."; "ScheduledMessages.Title" = "Scheduled Messages"; "ScheduledMessages.RemindersTitle" = "Reminders"; "ScheduledMessages.ScheduledDate" = "Scheduled for %@"; +"ScheduledMessages.ScheduledToday" = "Scheduled for today"; "ScheduledMessages.SendNow" = "Send Now"; "ScheduledMessages.EditTime" = "Reschedule"; "ScheduledMessages.ClearAll" = "Clear All"; diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 938ef5603a..1e4ffc844a 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -793,3907 +793,3908 @@ public final class PresentationStrings { return formatWithArgumentRanges(self._s[562]!, self._r[562]!, [_1]) } public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[564]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[565]! } public func PUSH_CHAT_TITLE_EDITED(_ _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 Conversation_LiveLocationYou: String { return self._s[566]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[567]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[568]! } - public var UserInfo_ShareBot: String { return self._s[571]! } + public var Conversation_LiveLocationYou: String { return self._s[567]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[568]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[569]! } + public var UserInfo_ShareBot: String { return self._s[572]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_1, _2]) + return formatWithArgumentRanges(self._s[573]!, self._r[573]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[573]! } - public var Message_Audio: String { return self._s[574]! } - public var Passport_Language_lt: String { return self._s[575]! } + public var PhotoEditor_ShadowsTint: String { return self._s[574]! } + public var Message_Audio: String { return self._s[575]! } + public var Passport_Language_lt: String { return self._s[576]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[576]!, self._r[576]!, [_0]) + return formatWithArgumentRanges(self._s[577]!, self._r[577]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[577]! } - public var Conversation_FileICloudDrive: String { return self._s[578]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[579]! } + public var Permissions_SiriText_v0: String { return self._s[578]! } + public var Conversation_FileICloudDrive: String { return self._s[579]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[580]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[580]!, self._r[580]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[581]!, self._r[581]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[581]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[582]! } public func Time_MonthOfYear_m5(_ _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 Channel_SignMessages: String { return self._s[583]! } + public var Channel_SignMessages: String { return self._s[584]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[584]!, self._r[584]!, [_1]) + return formatWithArgumentRanges(self._s[585]!, self._r[585]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[585]! } - public var Passport_ScanPassport: String { return self._s[586]! } - public var Watch_Suggestion_Thanks: String { return self._s[587]! } - public var BlockedUsers_AddNew: String { return self._s[588]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[586]! } + public var Passport_ScanPassport: String { return self._s[587]! } + public var Watch_Suggestion_Thanks: String { return self._s[588]! } + public var BlockedUsers_AddNew: String { return self._s[589]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[589]!, self._r[589]!, [_1, _2]) + return formatWithArgumentRanges(self._s[590]!, self._r[590]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[590]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[591]! } - public var Month_GenJuly: String { return self._s[592]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[593]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[595]! } - public var Notification_ChannelInviterSelf: String { return self._s[596]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[597]! } + public var Watch_Message_Invoice: String { return self._s[591]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[592]! } + public var Month_GenJuly: String { return self._s[593]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[594]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[596]! } + public var Notification_ChannelInviterSelf: String { return self._s[597]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[598]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[598]!, self._r[598]!, [_1, _2]) + return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[599]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[600]! } + public var CheckoutInfo_Title: String { return self._s[600]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[601]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[601]!, self._r[601]!, [_0]) + return formatWithArgumentRanges(self._s[602]!, self._r[602]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[602]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[603]! } - public var Passport_Language_de: String { return self._s[604]! } - public var Update_Title: String { return self._s[605]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[606]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[607]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[608]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[609]! } - public var NotificationsSound_Telegraph: String { return self._s[610]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[611]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[612]! } + public var Passport_Identity_MainPage: String { return self._s[603]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[604]! } + public var Passport_Language_de: String { return self._s[605]! } + public var Update_Title: String { return self._s[606]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[607]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[608]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[609]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[610]! } + public var NotificationsSound_Telegraph: String { return self._s[611]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[612]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[613]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_0]) + return formatWithArgumentRanges(self._s[614]!, self._r[614]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[614]! } - public var Conversation_ForwardTitle: String { return self._s[615]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[616]! } + public var Stickers_SuggestAll: String { return self._s[615]! } + public var Conversation_ForwardTitle: String { return self._s[616]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[617]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[617]!, self._r[617]!, [_0]) + return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_0]) } - public var Calls_NewCall: String { return self._s[618]! } - public var Call_StatusEnded: String { return self._s[619]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[620]! } - public var Settings_ProxyConnected: String { return self._s[621]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[622]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[623]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[624]! } - public var Passport_PasswordPlaceholder: String { return self._s[625]! } - public var Message_PinnedInvoice: String { return self._s[626]! } - public var Passport_Identity_IssueDate: String { return self._s[627]! } - public var Passport_Language_pl: String { return self._s[628]! } + public var Calls_NewCall: String { return self._s[619]! } + public var Call_StatusEnded: String { return self._s[620]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[621]! } + public var Settings_ProxyConnected: String { return self._s[622]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[623]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[624]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[625]! } + public var Passport_PasswordPlaceholder: String { return self._s[626]! } + public var Message_PinnedInvoice: String { return self._s[627]! } + public var Passport_Identity_IssueDate: String { return self._s[628]! } + public var Passport_Language_pl: String { return self._s[629]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[629]!, self._r[629]!, [_0]) + return formatWithArgumentRanges(self._s[630]!, self._r[630]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[630]! } - public var Call_StatusConnecting: String { return self._s[631]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[631]! } + public var Call_StatusConnecting: String { return self._s[632]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[632]!, self._r[632]!, [_0]) + return formatWithArgumentRanges(self._s[633]!, self._r[633]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[634]! } - public var Common_Edit: String { return self._s[635]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[636]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[635]! } + public var Common_Edit: String { return self._s[636]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[637]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_0]) + return formatWithArgumentRanges(self._s[638]!, self._r[638]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[638]! } - public var PrivateDataSettings_Title: String { return self._s[639]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[640]! } - public var ChatList_Read: String { return self._s[641]! } - public var Undo_ChatClearedForBothSides: String { return self._s[642]! } - public var GroupPermission_SectionTitle: String { return self._s[643]! } + public var GroupInfo_ChatAdmins: String { return self._s[639]! } + public var PrivateDataSettings_Title: String { return self._s[640]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[641]! } + public var ChatList_Read: String { return self._s[642]! } + public var Undo_ChatClearedForBothSides: String { return self._s[643]! } + public var GroupPermission_SectionTitle: String { return self._s[644]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_1, _2]) + return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[646]! } - public var Update_UpdateApp: String { return self._s[647]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[648]! } - public var Settings_Appearance: String { return self._s[649]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[652]! } - public var Watch_Location_Access: String { return self._s[653]! } - public var ShareMenu_CopyShareLink: String { return self._s[655]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[656]! } - public var Conversation_Theme: String { return self._s[658]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[647]! } + public var Update_UpdateApp: String { return self._s[648]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[649]! } + public var Settings_Appearance: String { return self._s[650]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[653]! } + public var Watch_Location_Access: String { return self._s[654]! } + public var ShareMenu_CopyShareLink: String { return self._s[656]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[657]! } + public var Conversation_Theme: String { return self._s[659]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[659]!, self._r[659]!, [_0]) + return formatWithArgumentRanges(self._s[660]!, self._r[660]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[660]! } - public var Weekday_ShortWednesday: String { return self._s[661]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[662]! } - public var Undo_LeftGroup: String { return self._s[665]! } - public var Conversation_LinkDialogCopy: String { return self._s[666]! } - public var KeyCommand_FocusOnInputField: String { return self._s[668]! } - public var Contacts_SelectAll: String { return self._s[669]! } - public var Preview_SaveToCameraRoll: String { return self._s[670]! } - public var PrivacySettings_PasscodeOff: String { return self._s[671]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[672]! } - public var Wallpaper_Title: String { return self._s[673]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[674]! } - public var AccessDenied_Camera: String { return self._s[675]! } - public var Watch_Compose_CurrentLocation: String { return self._s[676]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[678]! } + public var Notifications_ClassicTones: String { return self._s[661]! } + public var Weekday_ShortWednesday: String { return self._s[662]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[663]! } + public var Undo_LeftGroup: String { return self._s[666]! } + public var Conversation_LinkDialogCopy: String { return self._s[667]! } + public var KeyCommand_FocusOnInputField: String { return self._s[669]! } + public var Contacts_SelectAll: String { return self._s[670]! } + public var Preview_SaveToCameraRoll: String { return self._s[671]! } + public var PrivacySettings_PasscodeOff: String { return self._s[672]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[673]! } + public var Wallpaper_Title: String { return self._s[674]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[675]! } + public var AccessDenied_Camera: String { return self._s[676]! } + public var Watch_Compose_CurrentLocation: String { return self._s[677]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[679]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[679]!, self._r[679]!, [_0]) + return formatWithArgumentRanges(self._s[680]!, self._r[680]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[680]! } - public var Passport_Language_ro: String { return self._s[681]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[682]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[681]! } + public var Passport_Language_ro: String { return self._s[682]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[683]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[683]!, self._r[683]!, [_0]) + return formatWithArgumentRanges(self._s[684]!, self._r[684]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[684]! } - public var State_ConnectingToProxy: String { return self._s[685]! } - public var Calls_RatingTitle: String { return self._s[686]! } - public var Generic_ErrorMoreInfo: String { return self._s[687]! } - public var Appearance_PreviewReplyText: String { return self._s[688]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[689]! } - public var SharedMedia_CategoryLinks: String { return self._s[690]! } - public var Calls_Missed: String { return self._s[691]! } - public var Cache_Photos: String { return self._s[695]! } - public var GroupPermission_NoAddMembers: String { return self._s[696]! } - public var ScheduledMessages_Title: String { return self._s[697]! } + public var Login_CancelPhoneVerification: String { return self._s[685]! } + public var State_ConnectingToProxy: String { return self._s[686]! } + public var Calls_RatingTitle: String { return self._s[687]! } + public var Generic_ErrorMoreInfo: String { return self._s[688]! } + public var Appearance_PreviewReplyText: String { return self._s[689]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[690]! } + public var SharedMedia_CategoryLinks: String { return self._s[691]! } + public var Calls_Missed: String { return self._s[692]! } + public var Cache_Photos: String { return self._s[696]! } + public var GroupPermission_NoAddMembers: String { return self._s[697]! } + public var ScheduledMessages_Title: String { return self._s[698]! } public func Channel_AdminLog_MessageUnpinned(_ _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 Conversation_ShareBotLocationConfirmationTitle: String { return self._s[699]! } - public var Settings_ProxyDisabled: String { return self._s[700]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[700]! } + public var Settings_ProxyDisabled: String { return self._s[701]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[701]!, self._r[701]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_0]) + return formatWithArgumentRanges(self._s[703]!, self._r[703]!, [_0]) } - public var Appearance_Title: String { return self._s[704]! } + public var Appearance_Title: String { return self._s[705]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[706]!, self._r[706]!, [_0]) + return formatWithArgumentRanges(self._s[707]!, self._r[707]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[707]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[708]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[709]! } - public var Preview_DeletePhoto: String { return self._s[710]! } - public var Appearance_AppIconFilledX: String { return self._s[711]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[712]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[708]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[709]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[710]! } + public var Preview_DeletePhoto: String { return self._s[711]! } + public var Appearance_AppIconFilledX: String { return self._s[712]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[713]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[713]!, self._r[713]!, [_0]) + return formatWithArgumentRanges(self._s[714]!, self._r[714]!, [_0]) } - public var Coub_TapForSound: String { return self._s[715]! } - public var Map_LocatingError: String { return self._s[716]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[718]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[719]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[720]! } - public var Passport_ForgottenPassword: String { return self._s[721]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[722]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[723]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[725]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[726]! } - public var Message_Location: String { return self._s[727]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[728]! } - public var Channel_Management_Title: String { return self._s[729]! } - public var DialogList_SearchSectionDialogs: String { return self._s[731]! } - public var Compose_NewChannel_Members: String { return self._s[732]! } + public var Coub_TapForSound: String { return self._s[716]! } + public var Map_LocatingError: String { return self._s[717]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[719]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[720]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[721]! } + public var Passport_ForgottenPassword: String { return self._s[722]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[723]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[724]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[726]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[727]! } + public var Message_Location: String { return self._s[728]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[729]! } + public var Channel_Management_Title: String { return self._s[730]! } + public var DialogList_SearchSectionDialogs: String { return self._s[732]! } + public var Compose_NewChannel_Members: String { return self._s[733]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[733]!, self._r[733]!, [_0]) + return formatWithArgumentRanges(self._s[734]!, self._r[734]!, [_0]) } - public var GroupInfo_Location: String { return self._s[734]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[735]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[736]! } - public var PhotoEditor_WarmthTool: String { return self._s[737]! } - public var Passport_Language_tr: String { return self._s[738]! } + public var GroupInfo_Location: String { return self._s[735]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[736]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[737]! } + public var PhotoEditor_WarmthTool: String { return self._s[738]! } + public var Passport_Language_tr: String { return self._s[739]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[739]!, self._r[739]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[740]!, self._r[740]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[741]! } - public var Watch_PhotoView_Title: String { return self._s[742]! } - public var Passport_Phone_Delete: String { return self._s[743]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[744]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[745]! } - public var GroupInfo_Permissions: String { return self._s[746]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[747]! } - public var Profile_ShareContactButton: String { return self._s[748]! } - public var ChatSettings_Other: String { return self._s[749]! } - public var UserInfo_NotificationsDisabled: String { return self._s[750]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[751]! } - public var LastSeen_WithinAMonth: String { return self._s[752]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[753]! } - public var Conversation_ReportGroupLocation: String { return self._s[754]! } - public var Conversation_EncryptionCanceled: String { return self._s[755]! } - public var MediaPicker_GroupDescription: String { return self._s[756]! } - public var WebSearch_Images: String { return self._s[757]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[742]! } + public var Watch_PhotoView_Title: String { return self._s[743]! } + public var Passport_Phone_Delete: String { return self._s[744]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[745]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[746]! } + public var GroupInfo_Permissions: String { return self._s[747]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[748]! } + public var Profile_ShareContactButton: String { return self._s[749]! } + public var ChatSettings_Other: String { return self._s[750]! } + public var UserInfo_NotificationsDisabled: String { return self._s[751]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[752]! } + public var LastSeen_WithinAMonth: String { return self._s[753]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[754]! } + public var Conversation_ReportGroupLocation: String { return self._s[755]! } + public var Conversation_EncryptionCanceled: String { return self._s[756]! } + public var MediaPicker_GroupDescription: String { return self._s[757]! } + public var WebSearch_Images: String { return self._s[758]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[758]!, self._r[758]!, [_0]) + return formatWithArgumentRanges(self._s[759]!, self._r[759]!, [_0]) } - public var Message_Photo: String { return self._s[759]! } - public var PasscodeSettings_HelpBottom: String { return self._s[760]! } - public var CreateTheme_ShortLink: String { return self._s[761]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[762]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[763]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[764]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[765]! } - public var NotificationsSound_Calypso: String { return self._s[766]! } - public var Map_Map: String { return self._s[767]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[769]! } - public var ChatSettings_TextSizeUnits: String { return self._s[770]! } + public var Message_Photo: String { return self._s[760]! } + public var PasscodeSettings_HelpBottom: String { return self._s[761]! } + public var CreateTheme_ShortLink: String { return self._s[762]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[763]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[764]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[765]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[766]! } + public var NotificationsSound_Calypso: String { return self._s[767]! } + public var Map_Map: String { return self._s[768]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[770]! } + public var ChatSettings_TextSizeUnits: String { return self._s[771]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[771]!, self._r[771]!, [_0]) + return formatWithArgumentRanges(self._s[772]!, self._r[772]!, [_0]) } - public var Common_of: String { return self._s[772]! } - public var Conversation_ForwardContacts: String { return self._s[775]! } + public var Common_of: String { return self._s[773]! } + public var Conversation_ForwardContacts: String { return self._s[776]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[777]!, self._r[777]!, [_0]) + return formatWithArgumentRanges(self._s[778]!, self._r[778]!, [_0]) } - public var Passport_Language_hy: String { return self._s[778]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[779]! } - public var AutoDownloadSettings_Reset: String { return self._s[780]! } - public var Paint_ClearConfirm: String { return self._s[781]! } - public var Camera_VideoMode: String { return self._s[782]! } + public var Passport_Language_hy: String { return self._s[779]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[780]! } + public var AutoDownloadSettings_Reset: String { return self._s[781]! } + public var Paint_ClearConfirm: String { return self._s[782]! } + public var Camera_VideoMode: String { return self._s[783]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[783]!, self._r[783]!, [_0]) + return formatWithArgumentRanges(self._s[784]!, self._r[784]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[784]! } - public var Conversation_ViewBackground: String { return self._s[785]! } - public var Passport_Language_el: String { return self._s[786]! } - public var PhotoEditor_Original: String { return self._s[787]! } - public var Settings_FAQ_Button: String { return self._s[789]! } - public var Channel_Setup_PublicNoLink: String { return self._s[791]! } - public var Conversation_UnsupportedMedia: String { return self._s[792]! } - public var Conversation_SlideToCancel: String { return self._s[793]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[794]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[795]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[796]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[797]! } - public var AutoNightTheme_NotAvailable: String { return self._s[798]! } - public var Conversation_Owner: String { return self._s[799]! } - public var Common_Create: String { return self._s[800]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[801]! } - public var Localization_ChooseLanguage: String { return self._s[803]! } - public var Settings_Proxy: String { return self._s[806]! } - public var Privacy_TopPeersHelp: String { return self._s[807]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[808]! } - public var Chat_UnsendMyMessages: String { return self._s[809]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[785]! } + public var Conversation_ViewBackground: String { return self._s[786]! } + public var Passport_Language_el: String { return self._s[787]! } + public var PhotoEditor_Original: String { return self._s[788]! } + public var Settings_FAQ_Button: String { return self._s[790]! } + public var Channel_Setup_PublicNoLink: String { return self._s[792]! } + public var Conversation_UnsupportedMedia: String { return self._s[793]! } + public var Conversation_SlideToCancel: String { return self._s[794]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[795]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[796]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[797]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[798]! } + public var AutoNightTheme_NotAvailable: String { return self._s[799]! } + public var Conversation_Owner: String { return self._s[800]! } + public var Common_Create: String { return self._s[801]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[802]! } + public var Localization_ChooseLanguage: String { return self._s[804]! } + public var Settings_Proxy: String { return self._s[807]! } + public var Privacy_TopPeersHelp: String { return self._s[808]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[809]! } + public var Chat_UnsendMyMessages: String { return self._s[810]! } public func VoiceOver_Chat_Duration(_ _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 TwoStepAuth_ConfirmationAbort: String { return self._s[811]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[812]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_0]) + return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[814]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[815]! } - public var Cache_Title: String { return self._s[816]! } + public var Contacts_SortedByPresence: String { return self._s[815]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[816]! } + public var Cache_Title: String { return self._s[817]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[817]!, self._r[817]!, [_0]) + return formatWithArgumentRanges(self._s[818]!, self._r[818]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[818]! } - public var Channel_Moderator_Title: String { return self._s[819]! } - public var InstantPage_AutoNightTheme: String { return self._s[821]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[819]! } + public var Channel_Moderator_Title: String { return self._s[820]! } + public var InstantPage_AutoNightTheme: String { return self._s[822]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[824]!, self._r[824]!, [_1]) + return formatWithArgumentRanges(self._s[825]!, self._r[825]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[825]! } - public var Undo_Undo: String { return self._s[827]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[828]! } - public var TwoStepAuth_RemovePassword: String { return self._s[829]! } - public var Common_Delete: String { return self._s[830]! } - public var Contacts_AddPeopleNearby: String { return self._s[832]! } - public var Conversation_ContextMenuDelete: String { return self._s[833]! } - public var SocksProxySetup_Credentials: String { return self._s[834]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[836]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[839]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[840]! } - public var Passport_Language_id: String { return self._s[842]! } - public var WallpaperSearch_ColorTeal: String { return self._s[843]! } - public var ChannelIntro_Title: String { return self._s[844]! } + public var Passport_Scans_Upload: String { return self._s[826]! } + public var Undo_Undo: String { return self._s[828]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[829]! } + public var TwoStepAuth_RemovePassword: String { return self._s[830]! } + public var Common_Delete: String { return self._s[831]! } + public var Contacts_AddPeopleNearby: String { return self._s[833]! } + public var Conversation_ContextMenuDelete: String { return self._s[834]! } + public var SocksProxySetup_Credentials: String { return self._s[835]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[837]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[840]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[841]! } + public var Passport_Language_id: String { return self._s[843]! } + public var WallpaperSearch_ColorTeal: String { return self._s[844]! } + public var ChannelIntro_Title: String { return self._s[845]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[845]!, self._r[845]!, [_0]) + return formatWithArgumentRanges(self._s[846]!, self._r[846]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[847]! } - public var VoiceOver_Chat_Reply: String { return self._s[848]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[849]! } - public var Channel_Info_Description: String { return self._s[850]! } - public var Stickers_FavoriteStickers: String { return self._s[851]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[852]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[853]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[854]! } - public var Group_PublicLink_Placeholder: String { return self._s[855]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[856]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[848]! } + public var VoiceOver_Chat_Reply: String { return self._s[849]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[850]! } + public var Channel_Info_Description: String { return self._s[851]! } + public var Stickers_FavoriteStickers: String { return self._s[852]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[853]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[854]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[855]! } + public var Group_PublicLink_Placeholder: String { return self._s[856]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[857]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_1]) + return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_1]) } - public var TextFormat_Underline: String { return self._s[858]! } + public var TextFormat_Underline: String { return self._s[859]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[859]!, self._r[859]!, [_1, _2]) + return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_0]) + return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[861]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[862]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[862]!, self._r[862]!, [_1, _2]) + return formatWithArgumentRanges(self._s[863]!, self._r[863]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[863]! } - public var Passport_Language_uk: String { return self._s[864]! } - public var StickerPack_HideStickers: String { return self._s[866]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[867]! } + public var GroupPermission_Delete: String { return self._s[864]! } + public var Passport_Language_uk: String { return self._s[865]! } + public var StickerPack_HideStickers: String { return self._s[867]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[868]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_1, _2]) + return formatWithArgumentRanges(self._s[869]!, self._r[869]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[869]! } + public var Activity_UploadingVideoMessage: String { return self._s[870]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) + return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[871]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[872]! } - public var Settings_CallSettings: String { return self._s[873]! } - public var Camera_SquareMode: String { return self._s[874]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[875]! } - public var GroupInfo_SharedMediaNone: String { return self._s[876]! } + public var Channel_TitleInfo: String { return self._s[872]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[873]! } + public var Settings_CallSettings: String { return self._s[874]! } + public var Camera_SquareMode: String { return self._s[875]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[876]! } + public var GroupInfo_SharedMediaNone: String { return self._s[877]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[877]!, self._r[877]!, [_1]) + return formatWithArgumentRanges(self._s[878]!, self._r[878]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[878]! } - public var Application_Update: String { return self._s[880]! } - public var Month_ShortJanuary: String { return self._s[881]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[882]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[883]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[884]! } - public var Passport_Address_Street2Placeholder: String { return self._s[885]! } + public var Bot_GenericBotStatus: String { return self._s[879]! } + public var Application_Update: String { return self._s[881]! } + public var Month_ShortJanuary: String { return self._s[882]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[883]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[884]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[885]! } + public var Passport_Address_Street2Placeholder: String { return self._s[886]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_0]) + return formatWithArgumentRanges(self._s[887]!, self._r[887]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[887]! } - public var Appearance_PreviewOutgoingText: String { return self._s[888]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[889]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[891]! } - public var Map_Directions: String { return self._s[892]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[894]! } - public var Appearance_ThemeDay: String { return self._s[895]! } - public var LogoutOptions_LogOut: String { return self._s[896]! } - public var Group_PublicLink_Title: String { return self._s[898]! } - public var Channel_AddBotErrorNoRights: String { return self._s[899]! } - public var Passport_Identity_AddPassport: String { return self._s[900]! } - public var LocalGroup_ButtonTitle: String { return self._s[901]! } - public var Call_Message: String { return self._s[902]! } - public var PhotoEditor_ExposureTool: String { return self._s[903]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[905]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[907]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[908]! } - public var Appearance_Preview: String { return self._s[909]! } - public var Compose_ChannelMembers: String { return self._s[910]! } - public var Conversation_DeleteManyMessages: String { return self._s[911]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[912]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[913]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[914]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[917]! } - public var Conversation_UpdateTelegram: String { return self._s[918]! } + public var NetworkUsageSettings_Cellular: String { return self._s[888]! } + public var Appearance_PreviewOutgoingText: String { return self._s[889]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[890]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[892]! } + public var Map_Directions: String { return self._s[893]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[895]! } + public var Appearance_ThemeDay: String { return self._s[896]! } + public var LogoutOptions_LogOut: String { return self._s[897]! } + public var Group_PublicLink_Title: String { return self._s[899]! } + public var Channel_AddBotErrorNoRights: String { return self._s[900]! } + public var Passport_Identity_AddPassport: String { return self._s[901]! } + public var LocalGroup_ButtonTitle: String { return self._s[902]! } + public var Call_Message: String { return self._s[903]! } + public var PhotoEditor_ExposureTool: String { return self._s[904]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[906]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[908]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[909]! } + public var Appearance_Preview: String { return self._s[910]! } + public var Compose_ChannelMembers: String { return self._s[911]! } + public var Conversation_DeleteManyMessages: String { return self._s[912]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[913]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[914]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[915]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[918]! } + public var Conversation_UpdateTelegram: String { return self._s[919]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_0]) + return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_1]) + return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[921]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[922]! } + public var GroupInfo_Administrators_Title: String { return self._s[922]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[923]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_0]) + return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) } - public var Tour_Title3: String { return self._s[924]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[925]! } - public var Clipboard_SendPhoto: String { return self._s[929]! } - public var MediaPicker_Videos: String { return self._s[930]! } - public var Passport_Email_Title: String { return self._s[931]! } + public var Tour_Title3: String { return self._s[925]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[926]! } + public var Clipboard_SendPhoto: String { return self._s[930]! } + public var MediaPicker_Videos: String { return self._s[931]! } + public var Passport_Email_Title: String { return self._s[932]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[932]!, self._r[932]!, [_0]) + return formatWithArgumentRanges(self._s[933]!, self._r[933]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[933]! } - public var Conversation_MessageDialogDelete: String { return self._s[934]! } - public var Privacy_Calls_CustomHelp: String { return self._s[936]! } - public var Message_Wallpaper: String { return self._s[937]! } - public var MemberSearch_BotSection: String { return self._s[938]! } - public var GroupInfo_SetSound: String { return self._s[939]! } - public var Core_ServiceUserStatus: String { return self._s[940]! } - public var LiveLocationUpdated_JustNow: String { return self._s[941]! } - public var Call_StatusFailed: String { return self._s[942]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[943]! } - public var TwoStepAuth_SetPassword: String { return self._s[944]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[945]! } + public var StickerPacksSettings_Title: String { return self._s[934]! } + public var Conversation_MessageDialogDelete: String { return self._s[935]! } + public var Privacy_Calls_CustomHelp: String { return self._s[937]! } + public var Message_Wallpaper: String { return self._s[938]! } + public var MemberSearch_BotSection: String { return self._s[939]! } + public var GroupInfo_SetSound: String { return self._s[940]! } + public var Core_ServiceUserStatus: String { return self._s[941]! } + public var LiveLocationUpdated_JustNow: String { return self._s[942]! } + public var Call_StatusFailed: String { return self._s[943]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[944]! } + public var TwoStepAuth_SetPassword: String { return self._s[945]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[946]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[947]!, self._r[947]!, [_0]) + return formatWithArgumentRanges(self._s[948]!, self._r[948]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[948]! } - public var Profile_Username: String { return self._s[949]! } - public var Bot_DescriptionTitle: String { return self._s[950]! } - public var MaskStickerSettings_Title: String { return self._s[951]! } - public var SharedMedia_CategoryOther: String { return self._s[952]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[953]! } - public var Common_NotNow: String { return self._s[954]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[955]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[956]! } - public var Map_Location: String { return self._s[957]! } - public var Invitation_JoinGroup: String { return self._s[958]! } - public var AutoDownloadSettings_Title: String { return self._s[960]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[961]! } - public var Channel_ErrorAddBlocked: String { return self._s[962]! } - public var Conversation_UnblockUser: String { return self._s[963]! } - public var Watch_Bot_Restart: String { return self._s[964]! } - public var TwoStepAuth_Title: String { return self._s[965]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[966]! } - public var Checkout_ShippingMethod: String { return self._s[967]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[968]! } + public var Calls_SubmitRating: String { return self._s[949]! } + public var Profile_Username: String { return self._s[950]! } + public var Bot_DescriptionTitle: String { return self._s[951]! } + public var MaskStickerSettings_Title: String { return self._s[952]! } + public var SharedMedia_CategoryOther: String { return self._s[953]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[954]! } + public var Common_NotNow: String { return self._s[955]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[956]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[957]! } + public var Map_Location: String { return self._s[958]! } + public var Invitation_JoinGroup: String { return self._s[959]! } + public var AutoDownloadSettings_Title: String { return self._s[961]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[962]! } + public var Channel_ErrorAddBlocked: String { return self._s[963]! } + public var Conversation_UnblockUser: String { return self._s[964]! } + public var Watch_Bot_Restart: String { return self._s[965]! } + public var TwoStepAuth_Title: String { return self._s[966]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[967]! } + public var Checkout_ShippingMethod: String { return self._s[968]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[969]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[970]!, self._r[970]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[971]!, self._r[971]!, [_0]) - } - public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[973]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[974]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[975]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[976]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[977]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[978]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[979]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[980]! } - public var Checkout_PaymentMethod_Title: String { return self._s[981]! } - public var SocksProxySetup_Connection: String { return self._s[982]! } - public var Group_MessagePhotoRemoved: String { return self._s[983]! } - public var Channel_Stickers_NotFound: String { return self._s[985]! } - public var Group_About_Help: String { return self._s[986]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[987]! } - public var PeopleNearby_Title: String { return self._s[989]! } - public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[990]!, self._r[990]!, [_1]) + public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[973]!, self._r[973]!, [_0]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[992]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[993]! } - public var SocksProxySetup_Password: String { return self._s[994]! } - public var Notifications_PermissionsEnable: String { return self._s[995]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[997]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[974]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[975]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[976]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[977]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[978]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[979]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[980]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[981]! } + public var Checkout_PaymentMethod_Title: String { return self._s[982]! } + public var SocksProxySetup_Connection: String { return self._s[983]! } + public var Group_MessagePhotoRemoved: String { return self._s[984]! } + public var Channel_Stickers_NotFound: String { return self._s[986]! } + public var Group_About_Help: String { return self._s[987]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[988]! } + public var PeopleNearby_Title: String { return self._s[990]! } + public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[991]!, self._r[991]!, [_1]) + } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[993]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[994]! } + public var SocksProxySetup_Password: String { return self._s[995]! } + public var Notifications_PermissionsEnable: String { return self._s[996]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[998]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_1]) + return formatWithArgumentRanges(self._s[999]!, self._r[999]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1000]!, self._r[1000]!, [_0]) + return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1001]! } - public var ArchivedPacksAlert_Title: String { return self._s[1002]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1002]! } + public var ArchivedPacksAlert_Title: String { return self._s[1003]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1003]!, self._r[1003]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1004]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1006]! } - public var Conversation_StatusTyping: String { return self._s[1007]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1008]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1009]! } - public var UserInfo_CreateNewContact: String { return self._s[1010]! } - public var Passport_Identity_FrontSide: String { return self._s[1011]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1012]! } - public var Calls_CallTabTitle: String { return self._s[1013]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1014]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1005]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1007]! } + public var Conversation_StatusTyping: String { return self._s[1008]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1009]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1010]! } + public var UserInfo_CreateNewContact: String { return self._s[1011]! } + public var Passport_Identity_FrontSide: String { return self._s[1012]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1013]! } + public var Calls_CallTabTitle: String { return self._s[1014]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1015]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1016]!, self._r[1016]!, [_0]) + return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1017]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1018]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1019]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1020]! } - public var Paint_Stickers: String { return self._s[1021]! } - public var Privacy_GroupsAndChannels: String { return self._s[1022]! } - public var UserInfo_AddContact: String { return self._s[1024]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1018]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1019]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1020]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1021]! } + public var Paint_Stickers: String { return self._s[1022]! } + public var Privacy_GroupsAndChannels: String { return self._s[1023]! } + public var UserInfo_AddContact: String { return self._s[1025]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1025]!, self._r[1025]!, [_0]) + return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1027]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1028]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_0]) + return formatWithArgumentRanges(self._s[1030]!, self._r[1030]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1030]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1031]! } - public var BlockedUsers_BlockUser: String { return self._s[1032]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1033]! } - public var MediaPicker_UngroupDescription: String { return self._s[1034]! } - public var Watch_NoConnection: String { return self._s[1035]! } - public var Month_GenSeptember: String { return self._s[1036]! } - public var Conversation_ViewGroup: String { return self._s[1037]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1040]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1041]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1042]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1043]! } - public var MediaPicker_CameraRoll: String { return self._s[1045]! } - public var Month_GenAugust: String { return self._s[1046]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1047]! } - public var SharedMedia_EmptyText: String { return self._s[1048]! } - public var Map_ShareLiveLocation: String { return self._s[1049]! } - public var Calls_All: String { return self._s[1050]! } - public var Appearance_ThemeNight: String { return self._s[1053]! } - public var Conversation_HoldForAudio: String { return self._s[1054]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1057]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1058]! } - public var SocksProxySetup_Secret: String { return self._s[1059]! } + public var DialogList_NoMessagesTitle: String { return self._s[1031]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1032]! } + public var BlockedUsers_BlockUser: String { return self._s[1033]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1034]! } + public var MediaPicker_UngroupDescription: String { return self._s[1035]! } + public var Watch_NoConnection: String { return self._s[1036]! } + public var Month_GenSeptember: String { return self._s[1037]! } + public var Conversation_ViewGroup: String { return self._s[1038]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1041]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1042]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1043]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1044]! } + public var MediaPicker_CameraRoll: String { return self._s[1046]! } + public var Month_GenAugust: String { return self._s[1047]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1048]! } + public var SharedMedia_EmptyText: String { return self._s[1049]! } + public var Map_ShareLiveLocation: String { return self._s[1050]! } + public var Calls_All: String { return self._s[1051]! } + public var Appearance_ThemeNight: String { return self._s[1054]! } + public var Conversation_HoldForAudio: String { return self._s[1055]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1058]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1059]! } + public var SocksProxySetup_Secret: String { return self._s[1060]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1060]!, self._r[1060]!, [_0]) + return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1062]! } - public var Conversation_Location: String { return self._s[1063]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1063]! } + public var Conversation_Location: String { return self._s[1064]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1064]!, self._r[1064]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1065]!, self._r[1065]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1066]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1067]! } - public var Notifications_PermissionsText: String { return self._s[1068]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1069]! } - public var Call_Flip: String { return self._s[1070]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1072]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1073]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1075]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1077]! } - public var Channel_TooMuchBots: String { return self._s[1079]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1080]! } - public var Login_InvalidCodeError: String { return self._s[1081]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1082]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1067]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1068]! } + public var Notifications_PermissionsText: String { return self._s[1069]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1070]! } + public var Call_Flip: String { return self._s[1071]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1073]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1074]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1076]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1078]! } + public var Channel_TooMuchBots: String { return self._s[1080]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1081]! } + public var Login_InvalidCodeError: String { return self._s[1082]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1083]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1083]!, self._r[1083]!, [_0]) - } - public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1084]!, self._r[1084]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1085]! } - public var Call_CallInProgressTitle: String { return self._s[1086]! } - public var Month_ShortSeptember: String { return self._s[1087]! } - public var Watch_ChannelInfo_Title: String { return self._s[1088]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1091]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1092]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1093]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1094]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1095]! } - public var PhotoEditor_CropReset: String { return self._s[1096]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1098]! } - public var Channel_Management_LabelEditor: String { return self._s[1099]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1101]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1102]! } - public var UserInfo_Title: String { return self._s[1103]! } - public var ChatList_HideAction: String { return self._s[1104]! } - public var AccessDenied_Title: String { return self._s[1105]! } - public var DialogList_SearchLabel: String { return self._s[1106]! } - public var Group_Setup_HistoryHidden: String { return self._s[1107]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1108]! } - public var State_Updating: String { return self._s[1110]! } - public var Contacts_TabTitle: String { return self._s[1111]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1113]! } - public var GroupInfo_GroupHistory: String { return self._s[1114]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1115]! } - public var Wallpaper_SetColor: String { return self._s[1116]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1117]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1118]! } - public var Chat_AttachmentLimitReached: String { return self._s[1119]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1120]! } - public var Contacts_NotRegisteredSection: String { return self._s[1121]! } + public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0]) + } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1086]! } + public var Call_CallInProgressTitle: String { return self._s[1087]! } + public var Month_ShortSeptember: String { return self._s[1088]! } + public var Watch_ChannelInfo_Title: String { return self._s[1089]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1092]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1093]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1094]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1095]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1096]! } + public var PhotoEditor_CropReset: String { return self._s[1097]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1099]! } + public var Channel_Management_LabelEditor: String { return self._s[1100]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1102]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1103]! } + public var UserInfo_Title: String { return self._s[1104]! } + public var ChatList_HideAction: String { return self._s[1105]! } + public var AccessDenied_Title: String { return self._s[1106]! } + public var DialogList_SearchLabel: String { return self._s[1107]! } + public var Group_Setup_HistoryHidden: String { return self._s[1108]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1109]! } + public var State_Updating: String { return self._s[1111]! } + public var Contacts_TabTitle: String { return self._s[1112]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1114]! } + public var GroupInfo_GroupHistory: String { return self._s[1115]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1116]! } + public var Wallpaper_SetColor: String { return self._s[1117]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1118]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1119]! } + public var Chat_AttachmentLimitReached: String { return self._s[1120]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1121]! } + public var Contacts_NotRegisteredSection: String { return self._s[1122]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1122]!, self._r[1122]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1123]!, self._r[1123]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1123]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1124]! } - public var SocksProxySetup_Connecting: String { return self._s[1125]! } - public var ExplicitContent_AlertChannel: String { return self._s[1126]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1127]! } - public var Conversation_Contact: String { return self._s[1128]! } - public var Login_CodeExpired: String { return self._s[1129]! } - public var Passport_DiscardMessageAction: String { return self._s[1130]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1131]! } + public var Paint_Clear: String { return self._s[1124]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1125]! } + public var SocksProxySetup_Connecting: String { return self._s[1126]! } + public var ExplicitContent_AlertChannel: String { return self._s[1127]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1128]! } + public var Conversation_Contact: String { return self._s[1129]! } + public var Login_CodeExpired: String { return self._s[1130]! } + public var Passport_DiscardMessageAction: String { return self._s[1131]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1132]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_0]) + return formatWithArgumentRanges(self._s[1133]!, self._r[1133]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1133]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1134]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1134]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1135]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1135]!, self._r[1135]!, [_0]) + return formatWithArgumentRanges(self._s[1136]!, self._r[1136]!, [_0]) } - public var Month_ShortApril: String { return self._s[1136]! } - public var AuthSessions_CurrentSession: String { return self._s[1137]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1140]! } - public var WallpaperPreview_CropTopText: String { return self._s[1142]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1143]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1144]! } + public var Month_ShortApril: String { return self._s[1137]! } + public var AuthSessions_CurrentSession: String { return self._s[1138]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1141]! } + public var WallpaperPreview_CropTopText: String { return self._s[1143]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1144]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1145]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1145]!, self._r[1145]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1146]!, self._r[1146]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1146]! } - public var Channel_Setup_TypePrivate: String { return self._s[1148]! } - public var Forward_ChannelReadOnly: String { return self._s[1151]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1152]! } - public var AddContact_SharedContactException: String { return self._s[1153]! } - public var UserInfo_BotPrivacy: String { return self._s[1155]! } - public var Notification_PassportValueEmail: String { return self._s[1156]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1157]! } - public var GroupPermission_NewTitle: String { return self._s[1158]! } - public var CallFeedback_ReasonDropped: String { return self._s[1159]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1160]! } - public var Channel_SignMessages_Help: String { return self._s[1162]! } - public var Undo_ChatDeleted: String { return self._s[1164]! } - public var Conversation_ChatBackground: String { return self._s[1165]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1166]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1167]! } - public var Passport_Language_pt: String { return self._s[1168]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1169]! } - public var NotificationsSound_Popcorn: String { return self._s[1172]! } - public var AutoNightTheme_Disabled: String { return self._s[1173]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1174]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1175]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1176]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1177]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1147]! } + public var Channel_Setup_TypePrivate: String { return self._s[1149]! } + public var Forward_ChannelReadOnly: String { return self._s[1152]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1153]! } + public var AddContact_SharedContactException: String { return self._s[1154]! } + public var UserInfo_BotPrivacy: String { return self._s[1156]! } + public var Notification_PassportValueEmail: String { return self._s[1157]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1158]! } + public var GroupPermission_NewTitle: String { return self._s[1159]! } + public var CallFeedback_ReasonDropped: String { return self._s[1160]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1161]! } + public var Channel_SignMessages_Help: String { return self._s[1163]! } + public var Undo_ChatDeleted: String { return self._s[1165]! } + public var Conversation_ChatBackground: String { return self._s[1166]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1167]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1168]! } + public var Passport_Language_pt: String { return self._s[1169]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1170]! } + public var NotificationsSound_Popcorn: String { return self._s[1173]! } + public var AutoNightTheme_Disabled: String { return self._s[1174]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1175]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1176]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1177]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1178]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1178]!, self._r[1178]!, [_0]) + return formatWithArgumentRanges(self._s[1179]!, self._r[1179]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1179]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1180]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1182]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1180]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1181]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1183]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1183]!, self._r[1183]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1184]!, self._r[1184]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1186]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1187]! } - public var Compose_NewEncryptedChat: String { return self._s[1188]! } - public var Login_CodeFloodError: String { return self._s[1189]! } - public var Calls_TabTitle: String { return self._s[1190]! } - public var Privacy_ProfilePhoto: String { return self._s[1191]! } - public var Passport_Language_he: String { return self._s[1192]! } + public var SocksProxySetup_Hostname: String { return self._s[1187]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1188]! } + public var Compose_NewEncryptedChat: String { return self._s[1189]! } + public var Login_CodeFloodError: String { return self._s[1190]! } + public var Calls_TabTitle: String { return self._s[1191]! } + public var Privacy_ProfilePhoto: String { return self._s[1192]! } + public var Passport_Language_he: String { return self._s[1193]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, [_0]) + return formatWithArgumentRanges(self._s[1194]!, self._r[1194]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1194]! } + public var GroupPermission_Title: String { return self._s[1195]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1195]!, self._r[1195]!, [_0]) + return formatWithArgumentRanges(self._s[1196]!, self._r[1196]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1196]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1197]! } - public var Tour_Text1: String { return self._s[1198]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1199]! } - public var Month_ShortFebruary: String { return self._s[1200]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1201]! } - public var NotificationsSound_Glass: String { return self._s[1202]! } - public var Appearance_ThemeNightBlue: String { return self._s[1203]! } - public var CheckoutInfo_Pay: String { return self._s[1204]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1206]! } - public var Call_CallAgain: String { return self._s[1208]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1209]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1210]! } - public var Passport_InvalidPasswordError: String { return self._s[1211]! } - public var Watch_Message_Game: String { return self._s[1212]! } - public var Stickers_Install: String { return self._s[1213]! } - public var VoiceOver_Chat_Message: String { return self._s[1214]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1215]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1217]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1218]! } - public var AuthSessions_OtherSessions: String { return self._s[1219]! } - public var Channel_Username_Help: String { return self._s[1220]! } - public var Camera_Title: String { return self._s[1221]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1223]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1224]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1225]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1226]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1227]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1228]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1229]! } - public var Conversation_RestrictedStickers: String { return self._s[1230]! } - public var CreateTheme_Preview: String { return self._s[1231]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1233]! } - public var UserInfo_TelegramCall: String { return self._s[1235]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1236]! } - public var CreatePoll_OptionsHeader: String { return self._s[1237]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1238]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1239]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1240]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1241]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1197]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1198]! } + public var Tour_Text1: String { return self._s[1199]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1200]! } + public var Month_ShortFebruary: String { return self._s[1201]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1202]! } + public var NotificationsSound_Glass: String { return self._s[1203]! } + public var Appearance_ThemeNightBlue: String { return self._s[1204]! } + public var CheckoutInfo_Pay: String { return self._s[1205]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1207]! } + public var Call_CallAgain: String { return self._s[1209]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1210]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1211]! } + public var Passport_InvalidPasswordError: String { return self._s[1212]! } + public var Watch_Message_Game: String { return self._s[1213]! } + public var Stickers_Install: String { return self._s[1214]! } + public var VoiceOver_Chat_Message: String { return self._s[1215]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1216]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1218]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1219]! } + public var AuthSessions_OtherSessions: String { return self._s[1220]! } + public var Channel_Username_Help: String { return self._s[1221]! } + public var Camera_Title: String { return self._s[1222]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1224]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1225]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1226]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1227]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1228]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1229]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1230]! } + public var Conversation_RestrictedStickers: String { return self._s[1231]! } + public var CreateTheme_Preview: String { return self._s[1232]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1234]! } + public var UserInfo_TelegramCall: String { return self._s[1236]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1237]! } + public var CreatePoll_OptionsHeader: String { return self._s[1238]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1239]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1240]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1241]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1242]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1242]!, self._r[1242]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1243]!, self._r[1243]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1243]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1244]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1245]! } - public var Conversation_MessageDialogRetry: String { return self._s[1246]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1247]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1248]! } - public var Group_Setup_TypeHeader: String { return self._s[1249]! } - public var Paint_RecentStickers: String { return self._s[1250]! } - public var PhotoEditor_GrainTool: String { return self._s[1251]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1252]! } - public var EmptyGroupInfo_Line4: String { return self._s[1253]! } - public var Watch_AuthRequired: String { return self._s[1255]! } + public var Settings_SaveEditedPhotos: String { return self._s[1244]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1245]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1246]! } + public var Conversation_MessageDialogRetry: String { return self._s[1247]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1248]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1249]! } + public var Group_Setup_TypeHeader: String { return self._s[1250]! } + public var Paint_RecentStickers: String { return self._s[1251]! } + public var PhotoEditor_GrainTool: String { return self._s[1252]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1253]! } + public var EmptyGroupInfo_Line4: String { return self._s[1254]! } + public var Watch_AuthRequired: String { return self._s[1256]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1256]!, self._r[1256]!, [_0]) + return formatWithArgumentRanges(self._s[1257]!, self._r[1257]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1257]! } - public var ChannelIntro_Text: String { return self._s[1258]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1259]! } - public var GroupPermission_NoSendMedia: String { return self._s[1260]! } - public var Calls_AddTab: String { return self._s[1261]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1262]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1263]! } - public var Notification_MessageLifetime1d: String { return self._s[1264]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1265]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1266]! } - public var Passport_Identity_GenderFemale: String { return self._s[1267]! } - public var BlockedUsers_BlockTitle: String { return self._s[1268]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1258]! } + public var ChannelIntro_Text: String { return self._s[1259]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1260]! } + public var GroupPermission_NoSendMedia: String { return self._s[1261]! } + public var Calls_AddTab: String { return self._s[1262]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1263]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1264]! } + public var Notification_MessageLifetime1d: String { return self._s[1265]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1266]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1267]! } + public var Passport_Identity_GenderFemale: String { return self._s[1268]! } + public var BlockedUsers_BlockTitle: String { return self._s[1269]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1269]!, self._r[1269]!, [_1]) + return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1270]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1271]! } - public var ChatList_ArchiveAction: String { return self._s[1272]! } - public var AutoNightTheme_Scheduled: String { return self._s[1273]! } + public var Weekday_Yesterday: String { return self._s[1271]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1272]! } + public var ChatList_ArchiveAction: String { return self._s[1273]! } + public var AutoNightTheme_Scheduled: String { return self._s[1274]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1275]!, self._r[1275]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1275]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1276]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1276]!, self._r[1276]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1277]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1278]! } + public var CreatePoll_Create: String { return self._s[1278]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1279]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1280]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1281]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1283]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1281]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1282]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1284]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1284]!, self._r[1284]!, [_1]) + return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1285]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1286]! } + public var Preview_OpenInInstagram: String { return self._s[1286]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1287]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1288]!, self._r[1288]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1288]!, self._r[1288]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1289]!, self._r[1289]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1289]! } - public var ArchivedChats_IntroText3: String { return self._s[1290]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1291]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1292]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1293]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1290]! } + public var ArchivedChats_IntroText3: String { return self._s[1291]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1292]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1293]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1294]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1294]!, self._r[1294]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1295]!, self._r[1295]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1296]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1297]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1298]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1299]! } - public var Gif_NoGifsFound: String { return self._s[1300]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1301]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1302]! } - public var GroupInfo_ActionPromote: String { return self._s[1303]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1304]! } - public var GroupInfo_Permissions_Title: String { return self._s[1305]! } - public var Permissions_ContactsText_v0: String { return self._s[1306]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1307]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1308]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1311]! } - public var Passport_FieldEmailHelp: String { return self._s[1312]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1297]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1298]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1299]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1300]! } + public var Gif_NoGifsFound: String { return self._s[1301]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1302]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1303]! } + public var GroupInfo_ActionPromote: String { return self._s[1304]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1305]! } + public var GroupInfo_Permissions_Title: String { return self._s[1306]! } + public var Permissions_ContactsText_v0: String { return self._s[1307]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1308]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1309]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1312]! } + public var Passport_FieldEmailHelp: String { return self._s[1313]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1313]!, self._r[1313]!, [_0]) + return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1314]! } - public var Weekday_ShortSaturday: String { return self._s[1315]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1316]! } - public var Watch_Conversation_UserInfo: String { return self._s[1317]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1318]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1319]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1320]! } - public var PhotoEditor_VignetteTool: String { return self._s[1321]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1322]! } - public var Passport_Language_et: String { return self._s[1323]! } - public var AppUpgrade_Running: String { return self._s[1324]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1326]! } - public var Passport_Language_bg: String { return self._s[1327]! } - public var Stickers_NoStickersFound: String { return self._s[1329]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1315]! } + public var Weekday_ShortSaturday: String { return self._s[1316]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1317]! } + public var Watch_Conversation_UserInfo: String { return self._s[1318]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1319]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1320]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1321]! } + public var PhotoEditor_VignetteTool: String { return self._s[1322]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1323]! } + public var Passport_Language_et: String { return self._s[1324]! } + public var AppUpgrade_Running: String { return self._s[1325]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1327]! } + public var Passport_Language_bg: String { return self._s[1328]! } + public var Stickers_NoStickersFound: String { return self._s[1330]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_0]) + return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_0]) } - public var Settings_About: String { return self._s[1333]! } + public var Settings_About: String { return self._s[1334]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1335]!, self._r[1335]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1336]! } - public var Group_ErrorAddBlocked: String { return self._s[1337]! } + public var KeyCommand_NewMessage: String { return self._s[1337]! } + public var Group_ErrorAddBlocked: String { return self._s[1338]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1338]!, self._r[1338]!, [_0]) + return formatWithArgumentRanges(self._s[1339]!, self._r[1339]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1339]! } - public var ReportGroupLocation_Title: String { return self._s[1340]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1341]! } - public var Cache_ClearProgress: String { return self._s[1342]! } + public var Map_LocationTitle: String { return self._s[1340]! } + public var ReportGroupLocation_Title: String { return self._s[1341]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1342]! } + public var Cache_ClearProgress: String { return self._s[1343]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_0]) + return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1344]! } - public var Passport_UpdateRequiredError: String { return self._s[1345]! } + public var GroupRemoved_AddToGroup: String { return self._s[1345]! } + public var Passport_UpdateRequiredError: String { return self._s[1346]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1346]!, self._r[1346]!, [_1]) + return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1348]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1349]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1350]! } - public var Passport_Language_ka: String { return self._s[1351]! } - public var Call_Decline: String { return self._s[1352]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1353]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1349]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1350]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1351]! } + public var Passport_Language_ka: String { return self._s[1352]! } + public var Call_Decline: String { return self._s[1353]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1354]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1356]!, self._r[1356]!, [_0]) + return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1357]! } + public var CallFeedback_Send: String { return self._s[1358]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1358]!, self._r[1358]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1359]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1361]! } - public var Passport_DeletePassport: String { return self._s[1362]! } - public var Appearance_AppIconFilled: String { return self._s[1363]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1364]! } - public var Month_ShortDecember: String { return self._s[1365]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1367]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1360]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1362]! } + public var Passport_DeletePassport: String { return self._s[1363]! } + public var Appearance_AppIconFilled: String { return self._s[1364]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1365]! } + public var Month_ShortDecember: String { return self._s[1366]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1368]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1368]!, self._r[1368]!, [_0]) + return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1369]! } - public var Conversation_EncryptedDescription1: String { return self._s[1370]! } - public var Conversation_EncryptedDescription2: String { return self._s[1371]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1372]! } - public var Conversation_EncryptedDescription3: String { return self._s[1373]! } - public var PhotoEditor_SharpenTool: String { return self._s[1374]! } + public var Channel_Stickers_Searching: String { return self._s[1370]! } + public var Conversation_EncryptedDescription1: String { return self._s[1371]! } + public var Conversation_EncryptedDescription2: String { return self._s[1372]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1373]! } + public var Conversation_EncryptedDescription3: String { return self._s[1374]! } + public var PhotoEditor_SharpenTool: String { return self._s[1375]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1375]!, self._r[1375]!, [_0]) + return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1377]! } - public var Channel_Members_AddMembers: String { return self._s[1378]! } - public var Wallpaper_Search: String { return self._s[1379]! } - public var Weekday_Friday: String { return self._s[1380]! } - public var Privacy_ContactsSync: String { return self._s[1381]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1382]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1383]! } + public var Conversation_EncryptedDescription4: String { return self._s[1378]! } + public var Channel_Members_AddMembers: String { return self._s[1379]! } + public var Wallpaper_Search: String { return self._s[1380]! } + public var Weekday_Friday: String { return self._s[1381]! } + public var Privacy_ContactsSync: String { return self._s[1382]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1383]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1384]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1384]!, self._r[1384]!, [_0]) + return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1385]! } - public var Passport_Identity_GenderMale: String { return self._s[1386]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1386]! } + public var Passport_Identity_GenderMale: String { return self._s[1387]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1387]!, self._r[1387]!, [_0]) + return formatWithArgumentRanges(self._s[1388]!, self._r[1388]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1388]! } - public var Conversation_JumpToDate: String { return self._s[1389]! } - public var Contacts_GlobalSearch: String { return self._s[1390]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1391]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1392]! } - public var Profile_MessageLifetime1d: String { return self._s[1393]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1389]! } + public var Conversation_JumpToDate: String { return self._s[1390]! } + public var Contacts_GlobalSearch: String { return self._s[1391]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1392]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1393]! } + public var Profile_MessageLifetime1d: String { return self._s[1394]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1395]!, self._r[1395]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1397]! } + public var StickerPack_BuiltinPackName: String { return self._s[1398]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1399]! } - public var Passport_InfoTitle: String { return self._s[1401]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1402]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1400]! } + public var Passport_InfoTitle: String { return self._s[1402]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1403]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_0]) + return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1408]! } - public var Profile_BotInfo: String { return self._s[1409]! } - public var Watch_Compose_CreateMessage: String { return self._s[1410]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1411]! } - public var Month_ShortNovember: String { return self._s[1412]! } - public var Conversation_ScamWarning: String { return self._s[1413]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1414]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1415]! } - public var NotificationsSound_Chime: String { return self._s[1416]! } - public var Passport_Language_ko: String { return self._s[1418]! } - public var InviteText_URL: String { return self._s[1419]! } - public var TextFormat_Monospace: String { return self._s[1420]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1409]! } + public var Profile_BotInfo: String { return self._s[1410]! } + public var Watch_Compose_CreateMessage: String { return self._s[1411]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1412]! } + public var Month_ShortNovember: String { return self._s[1413]! } + public var Conversation_ScamWarning: String { return self._s[1414]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1415]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1416]! } + public var NotificationsSound_Chime: String { return self._s[1417]! } + public var Passport_Language_ko: String { return self._s[1419]! } + public var InviteText_URL: String { return self._s[1420]! } + public var TextFormat_Monospace: String { return self._s[1421]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_0]) + return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1425]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1426]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1427]! } - public var Your_card_has_expired: String { return self._s[1428]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1429]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1430]! } - public var Conversation_Report: String { return self._s[1434]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1435]! } - public var Notification_MessageLifetime1m: String { return self._s[1436]! } - public var Privacy_ContactsTitle: String { return self._s[1437]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1438]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1439]! } - public var Channel_Members_Title: String { return self._s[1440]! } - public var Map_OpenInWaze: String { return self._s[1441]! } - public var Login_PhoneBannedError: String { return self._s[1442]! } + public var Passport_InfoLearnMore: String { return self._s[1426]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1427]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1428]! } + public var Your_card_has_expired: String { return self._s[1429]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1430]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1431]! } + public var Conversation_Report: String { return self._s[1435]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1436]! } + public var Notification_MessageLifetime1m: String { return self._s[1437]! } + public var Privacy_ContactsTitle: String { return self._s[1438]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1439]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1440]! } + public var Channel_Members_Title: String { return self._s[1441]! } + public var Map_OpenInWaze: String { return self._s[1442]! } + public var Login_PhoneBannedError: String { return self._s[1443]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1443]!, self._r[1443]!, [_0]) + return formatWithArgumentRanges(self._s[1444]!, self._r[1444]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1444]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1445]! } - public var Common_OK: String { return self._s[1446]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1447]! } - public var Cache_Music: String { return self._s[1448]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1449]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1450]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1451]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1445]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1446]! } + public var Common_OK: String { return self._s[1447]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1448]! } + public var Cache_Music: String { return self._s[1449]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1450]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1451]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1452]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_1]) + return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_0]) - } - public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1454]!, self._r[1454]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1456]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1457]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1459]! } - public var State_ConnectingToProxyInfo: String { return self._s[1460]! } - public var Message_VideoMessage: String { return self._s[1462]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1463]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1464]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1465]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1466]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1467]! } - public var Activity_RecordingAudio: String { return self._s[1468]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1469]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1470]! } + public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1455]!, self._r[1455]!, [_0]) + } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1457]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1458]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1460]! } + public var State_ConnectingToProxyInfo: String { return self._s[1461]! } + public var Message_VideoMessage: String { return self._s[1463]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1464]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1465]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1466]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1467]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1468]! } + public var Activity_RecordingAudio: String { return self._s[1469]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1470]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1471]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0]) + return formatWithArgumentRanges(self._s[1477]!, self._r[1477]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1477]! } - public var UserInfo_AddPhone: String { return self._s[1478]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1479]! } + public var Conversation_ApplyLocalization: String { return self._s[1478]! } + public var UserInfo_AddPhone: String { return self._s[1479]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1480]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0]) + return formatWithArgumentRanges(self._s[1481]!, self._r[1481]!, [_0]) } - public var Passport_Scans: String { return self._s[1482]! } - public var BlockedUsers_Unblock: String { return self._s[1483]! } + public var Passport_Scans: String { return self._s[1483]! } + public var BlockedUsers_Unblock: String { return self._s[1484]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1484]!, self._r[1484]!, [_1]) + return formatWithArgumentRanges(self._s[1485]!, self._r[1485]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1485]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1486]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1487]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1488]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1489]! } + public var Channel_Management_LabelCreator: String { return self._s[1486]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1487]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1488]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1489]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1490]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1490]!, self._r[1490]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1491]!, self._r[1491]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1491]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1492]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1493]! } - public var ChannelIntro_CreateChannel: String { return self._s[1494]! } - public var Conversation_UnreadMessages: String { return self._s[1495]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1496]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1497]! } - public var Notification_GroupActivated: String { return self._s[1498]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1499]! } + public var Login_PhoneNumberHelp: String { return self._s[1492]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1493]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1494]! } + public var ChannelIntro_CreateChannel: String { return self._s[1495]! } + public var Conversation_UnreadMessages: String { return self._s[1496]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1497]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1498]! } + public var Notification_GroupActivated: String { return self._s[1499]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1500]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) + return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1503]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1504]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_0]) + return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1505]! } - public var CallFeedback_AddComment: String { return self._s[1506]! } + public var Undo_DeletedChannel: String { return self._s[1506]! } + public var CallFeedback_AddComment: String { return self._s[1507]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1507]!, self._r[1507]!, [_0]) + return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1508]! } + public var Document_TargetConfirmationFormat: String { return self._s[1509]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1509]!, self._r[1509]!, [_0]) + return formatWithArgumentRanges(self._s[1510]!, self._r[1510]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1510]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1511]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1512]!, self._r[1512]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1512]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1513]! } + public var Contacts_SortByName: String { return self._s[1513]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1514]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1516]! } - public var ScheduledMessages_EditTime: String { return self._s[1517]! } - public var Conversation_ClearSelfHistory: String { return self._s[1518]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1519]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1520]! } - public var Stickers_SuggestNone: String { return self._s[1521]! } - public var ChatSettings_Cache: String { return self._s[1522]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1523]! } - public var Media_ShareThisPhoto: String { return self._s[1524]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1525]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1526]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1527]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1528]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1529]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1530]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1531]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1533]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1534]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1535]! } - public var Map_OpenIn: String { return self._s[1536]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1517]! } + public var ScheduledMessages_EditTime: String { return self._s[1518]! } + public var Conversation_ClearSelfHistory: String { return self._s[1519]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1520]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1521]! } + public var Stickers_SuggestNone: String { return self._s[1522]! } + public var ChatSettings_Cache: String { return self._s[1523]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1524]! } + public var Media_ShareThisPhoto: String { return self._s[1525]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1526]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1527]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1528]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1529]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1530]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1531]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1532]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1534]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1535]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1536]! } + public var Map_OpenIn: String { return self._s[1537]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1539]!, self._r[1539]!, [_1]) + return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_0]) + return formatWithArgumentRanges(self._s[1541]!, self._r[1541]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1541]! } - public var MessagePoll_LabelClosed: String { return self._s[1542]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1544]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1545]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1546]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1547]! } - public var Login_SelectCountry_Title: String { return self._s[1548]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1549]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1542]! } + public var MessagePoll_LabelClosed: String { return self._s[1543]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1545]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1546]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1547]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1548]! } + public var Login_SelectCountry_Title: String { return self._s[1549]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1550]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1550]!, self._r[1550]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1551]! } - public var Watch_Suggestion_BRB: String { return self._s[1552]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1553]! } - public var Contacts_PermissionsTitle: String { return self._s[1554]! } - public var Conversation_RestrictedInline: String { return self._s[1555]! } - public var StickerPack_ViewPack: String { return self._s[1557]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1552]! } + public var Watch_Suggestion_BRB: String { return self._s[1553]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1554]! } + public var Contacts_PermissionsTitle: String { return self._s[1555]! } + public var Conversation_RestrictedInline: String { return self._s[1556]! } + public var StickerPack_ViewPack: String { return self._s[1558]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1558]!, self._r[1558]!, [_0]) + return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1560]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1563]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1565]! } - public var Channel_Info_Stickers: String { return self._s[1566]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1567]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1568]! } - public var Passport_DeletePersonalDetails: String { return self._s[1569]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1570]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1571]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1572]! } - public var Conversation_SearchNoResults: String { return self._s[1574]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1575]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1576]! } - public var Login_Code: String { return self._s[1577]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1578]! } - public var Weekday_ShortThursday: String { return self._s[1579]! } - public var Resolve_ErrorNotFound: String { return self._s[1581]! } - public var LastSeen_Offline: String { return self._s[1582]! } - public var PeopleNearby_NoMembers: String { return self._s[1583]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1584]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1585]! } - public var GroupInfo_Title: String { return self._s[1587]! } - public var NotificationsSound_Note: String { return self._s[1588]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1589]! } - public var Watch_Message_Poll: String { return self._s[1590]! } - public var Privacy_Calls: String { return self._s[1591]! } + public var Compose_NewChannel: String { return self._s[1561]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1564]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1566]! } + public var Channel_Info_Stickers: String { return self._s[1567]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1568]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1569]! } + public var Passport_DeletePersonalDetails: String { return self._s[1570]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1571]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1572]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1573]! } + public var Conversation_SearchNoResults: String { return self._s[1575]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1576]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1577]! } + public var Login_Code: String { return self._s[1578]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1579]! } + public var Weekday_ShortThursday: String { return self._s[1580]! } + public var Resolve_ErrorNotFound: String { return self._s[1582]! } + public var LastSeen_Offline: String { return self._s[1583]! } + public var PeopleNearby_NoMembers: String { return self._s[1584]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1585]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1586]! } + public var GroupInfo_Title: String { return self._s[1588]! } + public var NotificationsSound_Note: String { return self._s[1589]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1590]! } + public var Watch_Message_Poll: String { return self._s[1591]! } + public var Privacy_Calls: String { return self._s[1592]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1592]!, self._r[1592]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1593]!, self._r[1593]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1593]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1594]! } - public var Notifications_Reset: String { return self._s[1595]! } - public var Conversation_Pin: String { return self._s[1596]! } - public var Passport_Language_lv: String { return self._s[1597]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1598]! } - public var BlockedUsers_Info: String { return self._s[1599]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1601]! } - public var Watch_Conversation_Unblock: String { return self._s[1603]! } + public var Month_ShortAugust: String { return self._s[1594]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1595]! } + public var Notifications_Reset: String { return self._s[1596]! } + public var Conversation_Pin: String { return self._s[1597]! } + public var Passport_Language_lv: String { return self._s[1598]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1599]! } + public var BlockedUsers_Info: String { return self._s[1600]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1602]! } + public var Watch_Conversation_Unblock: String { return self._s[1604]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1604]!, self._r[1604]!, [_0]) + return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1605]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1606]! } + public var CloudStorage_Title: String { return self._s[1606]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1607]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_0]) + return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1608]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1609]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1610]! } - public var Passport_Address_EditBankStatement: String { return self._s[1611]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1609]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1610]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1611]! } + public var Passport_Address_EditBankStatement: String { return self._s[1612]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1613]! } - public var ShareMenu_Comment: String { return self._s[1614]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1615]! } - public var Notifications_PermissionsTitle: String { return self._s[1616]! } - public var GroupPermission_NoSendLinks: String { return self._s[1617]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1618]! } - public var Settings_Support: String { return self._s[1619]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1620]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1621]! } - public var Privacy_Forwards_Preview: String { return self._s[1622]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1623]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1624]! } - public var Common_Select: String { return self._s[1626]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1627]! } - public var WallpaperSearch_ColorGray: String { return self._s[1629]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1630]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1631]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1632]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1633]! } - public var Widget_AuthRequired: String { return self._s[1634]! } - public var Camera_FlashOn: String { return self._s[1635]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1636]! } - public var Watch_Suggestion_OK: String { return self._s[1637]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1614]! } + public var ShareMenu_Comment: String { return self._s[1615]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1616]! } + public var Notifications_PermissionsTitle: String { return self._s[1617]! } + public var GroupPermission_NoSendLinks: String { return self._s[1618]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1619]! } + public var Settings_Support: String { return self._s[1620]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1621]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1622]! } + public var Privacy_Forwards_Preview: String { return self._s[1623]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1624]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1625]! } + public var Common_Select: String { return self._s[1627]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1628]! } + public var WallpaperSearch_ColorGray: String { return self._s[1630]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1631]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1632]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1633]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1634]! } + public var Widget_AuthRequired: String { return self._s[1635]! } + public var Camera_FlashOn: String { return self._s[1636]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1637]! } + public var Watch_Suggestion_OK: String { return self._s[1638]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1639]!, self._r[1639]!, [_0]) + return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1641]!, self._r[1641]!, [_0]) + return formatWithArgumentRanges(self._s[1642]!, self._r[1642]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1642]! } - public var DialogList_AdLabel: String { return self._s[1643]! } - public var WatchRemote_NotificationText: String { return self._s[1644]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1645]! } - public var Conversation_ReportSpam: String { return self._s[1646]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1647]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1649]! } - public var PhoneLabel_Title: String { return self._s[1650]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1651]! } - public var Settings_ChangePhoneNumber: String { return self._s[1652]! } - public var Notifications_ExceptionsTitle: String { return self._s[1653]! } - public var Notifications_AlertTones: String { return self._s[1654]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1655]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1656]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1657]! } - public var VoiceOver_Chat_Photo: String { return self._s[1659]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1660]! } - public var ReportPeer_ReasonOther: String { return self._s[1661]! } - public var KeyCommand_ScrollDown: String { return self._s[1663]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1664]! } + public var TextFormat_Strikethrough: String { return self._s[1643]! } + public var DialogList_AdLabel: String { return self._s[1644]! } + public var WatchRemote_NotificationText: String { return self._s[1645]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1646]! } + public var Conversation_ReportSpam: String { return self._s[1647]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1648]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1650]! } + public var PhoneLabel_Title: String { return self._s[1651]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1652]! } + public var Settings_ChangePhoneNumber: String { return self._s[1653]! } + public var Notifications_ExceptionsTitle: String { return self._s[1654]! } + public var Notifications_AlertTones: String { return self._s[1655]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1656]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1657]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1658]! } + public var VoiceOver_Chat_Photo: String { return self._s[1660]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1661]! } + public var ReportPeer_ReasonOther: String { return self._s[1662]! } + public var KeyCommand_ScrollDown: String { return self._s[1664]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1665]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1665]!, self._r[1665]!, [_0]) + return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1666]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1667]! } - public var AuthSessions_LogOut: String { return self._s[1668]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1669]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1670]! } - public var Passport_Phone_Title: String { return self._s[1671]! } - public var Settings_PhoneNumber: String { return self._s[1672]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1667]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1668]! } + public var AuthSessions_LogOut: String { return self._s[1669]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1670]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1671]! } + public var Passport_Phone_Title: String { return self._s[1672]! } + public var Settings_PhoneNumber: String { return self._s[1673]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1673]!, self._r[1673]!, [_0]) + return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1674]! } - public var WebSearch_SearchNoResults: String { return self._s[1675]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1677]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1678]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1679]! } - public var PhotoEditor_CurvesTool: String { return self._s[1680]! } - public var Checkout_PaymentMethod: String { return self._s[1682]! } + public var NotificationsSound_Alert: String { return self._s[1675]! } + public var WebSearch_SearchNoResults: String { return self._s[1676]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1678]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1679]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1680]! } + public var PhotoEditor_CurvesTool: String { return self._s[1681]! } + public var Checkout_PaymentMethod: String { return self._s[1683]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1683]!, self._r[1683]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1684]! } - public var Camera_PhotoMode: String { return self._s[1687]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1689]! } - public var CallSettings_OnMobile: String { return self._s[1690]! } - public var Tour_Text2: String { return self._s[1691]! } + public var Contacts_AccessDeniedError: String { return self._s[1685]! } + public var Camera_PhotoMode: String { return self._s[1688]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1690]! } + public var CallSettings_OnMobile: String { return self._s[1691]! } + public var Tour_Text2: String { return self._s[1692]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1692]!, self._r[1692]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1694]! } - public var Permissions_Skip: String { return self._s[1695]! } - public var SecretImage_Title: String { return self._s[1696]! } - public var Watch_MessageView_Title: String { return self._s[1697]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1698]! } - public var AttachmentMenu_Poll: String { return self._s[1699]! } + public var DialogList_EncryptionProcessing: String { return self._s[1695]! } + public var Permissions_Skip: String { return self._s[1696]! } + public var SecretImage_Title: String { return self._s[1697]! } + public var Watch_MessageView_Title: String { return self._s[1698]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1699]! } + public var AttachmentMenu_Poll: String { return self._s[1700]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1700]!, self._r[1700]!, [_0]) + return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1702]!, self._r[1702]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1702]! } - public var WallpaperPreview_Title: String { return self._s[1703]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1704]! } - public var Settings_ProxyConnecting: String { return self._s[1705]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1707]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1708]! } - public var Profile_MessageLifetime5s: String { return self._s[1709]! } - public var Username_InvalidCharacters: String { return self._s[1710]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1711]! } - public var ScheduledMessages_ClearAll: String { return self._s[1712]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1713]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1714]! } - public var Settings_AddAccount: String { return self._s[1715]! } - public var Notification_CreatedChannel: String { return self._s[1718]! } + public var Notification_CallCanceled: String { return self._s[1703]! } + public var WallpaperPreview_Title: String { return self._s[1704]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1705]! } + public var Settings_ProxyConnecting: String { return self._s[1706]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1708]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1709]! } + public var Profile_MessageLifetime5s: String { return self._s[1710]! } + public var Username_InvalidCharacters: String { return self._s[1711]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1712]! } + public var ScheduledMessages_ClearAll: String { return self._s[1713]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1714]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1715]! } + public var Settings_AddAccount: String { return self._s[1716]! } + public var Notification_CreatedChannel: String { return self._s[1719]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1721]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1722]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1723]! } - public var Contacts_TopSection: String { return self._s[1724]! } + public var Passcode_AppLockedAlert: String { return self._s[1722]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1723]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1724]! } + public var Contacts_TopSection: String { return self._s[1725]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1725]!, self._r[1725]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1726]!, self._r[1726]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1726]!, self._r[1726]!, [_0]) + return formatWithArgumentRanges(self._s[1727]!, self._r[1727]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1727]! } - public var UserInfo_TapToCall: String { return self._s[1728]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1730]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1731]! } - public var Common_Search: String { return self._s[1732]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1733]! } + public var ReportPeer_ReasonSpam: String { return self._s[1728]! } + public var UserInfo_TapToCall: String { return self._s[1729]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1731]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1732]! } + public var Common_Search: String { return self._s[1733]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1734]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_0]) + return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1735]! } - public var Message_InvoiceLabel: String { return self._s[1736]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1737]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1738]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1736]! } + public var Message_InvoiceLabel: String { return self._s[1737]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1738]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1739]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0]) + return formatWithArgumentRanges(self._s[1740]!, self._r[1740]!, [_0]) } - public var Conversation_Info: String { return self._s[1740]! } - public var Login_InfoDeletePhoto: String { return self._s[1741]! } - public var Passport_Language_vi: String { return self._s[1743]! } - public var UserInfo_ScamUserWarning: String { return self._s[1744]! } - public var Conversation_Search: String { return self._s[1745]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1746]! } - public var ReportPeer_ReasonPornography: String { return self._s[1747]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1748]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1749]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1750]! } - public var Channel_Setup_TypeHeader: String { return self._s[1751]! } - public var AuthSessions_LoggedIn: String { return self._s[1752]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1753]! } - public var Login_SmsRequestState3: String { return self._s[1754]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1755]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1756]! } - public var Join_ChannelsTooMuch: String { return self._s[1757]! } - public var Channel_Edit_LinkItem: String { return self._s[1758]! } - public var Privacy_Calls_P2PNever: String { return self._s[1759]! } - public var Conversation_AddToReadingList: String { return self._s[1761]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1762]! } - public var Message_Animation: String { return self._s[1763]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1764]! } - public var Map_Unknown: String { return self._s[1765]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1766]! } + public var Conversation_Info: String { return self._s[1741]! } + public var Login_InfoDeletePhoto: String { return self._s[1742]! } + public var Passport_Language_vi: String { return self._s[1744]! } + public var UserInfo_ScamUserWarning: String { return self._s[1745]! } + public var Conversation_Search: String { return self._s[1746]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1747]! } + public var ReportPeer_ReasonPornography: String { return self._s[1748]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1749]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1750]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1751]! } + public var Channel_Setup_TypeHeader: String { return self._s[1752]! } + public var AuthSessions_LoggedIn: String { return self._s[1753]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1754]! } + public var Login_SmsRequestState3: String { return self._s[1755]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1756]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1757]! } + public var Join_ChannelsTooMuch: String { return self._s[1758]! } + public var Channel_Edit_LinkItem: String { return self._s[1759]! } + public var Privacy_Calls_P2PNever: String { return self._s[1760]! } + public var Conversation_AddToReadingList: String { return self._s[1762]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1763]! } + public var Message_Animation: String { return self._s[1764]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1765]! } + public var Map_Unknown: String { return self._s[1766]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1767]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1767]!, self._r[1767]!, [_1, _2]) - } - public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1769]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1770]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1771]! } + public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_1, _2]) + } + public var Call_StatusRequesting: String { return self._s[1770]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1771]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1772]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_0]) + return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_0]) } - public var Update_Skip: String { return self._s[1774]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1775]! } - public var Message_PinnedPollMessage: String { return self._s[1776]! } - public var BlockedUsers_Title: String { return self._s[1777]! } + public var Update_Skip: String { return self._s[1775]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1776]! } + public var Message_PinnedPollMessage: String { return self._s[1777]! } + public var BlockedUsers_Title: String { return self._s[1778]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_1]) + return formatWithArgumentRanges(self._s[1779]!, self._r[1779]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1779]! } - public var NotificationsSound_Bell: String { return self._s[1780]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1781]! } - public var Weekday_Monday: String { return self._s[1782]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1783]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1784]! } - public var ChatSettings_Groups: String { return self._s[1785]! } + public var Username_CheckingUsername: String { return self._s[1780]! } + public var NotificationsSound_Bell: String { return self._s[1781]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1782]! } + public var Weekday_Monday: String { return self._s[1783]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1784]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1785]! } + public var ChatSettings_Groups: String { return self._s[1786]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1786]!, self._r[1786]!, [_0]) + return formatWithArgumentRanges(self._s[1787]!, self._r[1787]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1787]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1789]! } - public var ChatList_Unmute: String { return self._s[1790]! } - public var PhotoEditor_CurvesAll: String { return self._s[1791]! } - public var Weekday_ShortTuesday: String { return self._s[1792]! } - public var DialogList_Read: String { return self._s[1793]! } - public var Appearance_AppIconClassic: String { return self._s[1794]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1795]! } - public var Passport_Identity_Gender: String { return self._s[1796]! } + public var Your_card_was_declined: String { return self._s[1788]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1790]! } + public var ChatList_Unmute: String { return self._s[1791]! } + public var PhotoEditor_CurvesAll: String { return self._s[1792]! } + public var Weekday_ShortTuesday: String { return self._s[1793]! } + public var DialogList_Read: String { return self._s[1794]! } + public var Appearance_AppIconClassic: String { return self._s[1795]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1796]! } + public var Passport_Identity_Gender: String { return self._s[1797]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1797]!, self._r[1797]!, [_0]) + return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1798]! } + public var Target_SelectGroup: String { return self._s[1799]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_0]) + return formatWithArgumentRanges(self._s[1801]!, self._r[1801]!, [_0]) } - public var Passport_Language_en: String { return self._s[1801]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1802]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1803]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1804]! } - public var ScheduledMessages_SendNow: String { return self._s[1805]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1807]! } - public var Login_InfoHelp: String { return self._s[1808]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1809]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1810]! } + public var Passport_Language_en: String { return self._s[1802]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1803]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1804]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1805]! } + public var ScheduledMessages_SendNow: String { return self._s[1806]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1808]! } + public var Login_InfoHelp: String { return self._s[1809]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1810]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1811]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1811]!, self._r[1811]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1812]!, self._r[1812]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1814]! } - public var CreatePoll_Title: String { return self._s[1815]! } - public var Conversation_ViewTheme: String { return self._s[1816]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1817]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1818]! } - public var UserInfo_GroupsInCommon: String { return self._s[1819]! } - public var Call_AudioRouteHide: String { return self._s[1820]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1822]! } + public var SocksProxySetup_AddProxy: String { return self._s[1815]! } + public var CreatePoll_Title: String { return self._s[1816]! } + public var Conversation_ViewTheme: String { return self._s[1817]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1818]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1819]! } + public var UserInfo_GroupsInCommon: String { return self._s[1820]! } + public var Call_AudioRouteHide: String { return self._s[1821]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1823]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1823]!, self._r[1823]!, [_0]) + return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1824]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1825]! } - public var Notifications_Title: String { return self._s[1826]! } - public var Group_Username_InvalidTooShort: String { return self._s[1827]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1828]! } + public var TextFormat_Bold: String { return self._s[1825]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1826]! } + public var Notifications_Title: String { return self._s[1827]! } + public var Group_Username_InvalidTooShort: String { return self._s[1828]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1829]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1829]!, self._r[1829]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1830]!, self._r[1830]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1831]! } - public var Stickers_SuggestAdded: String { return self._s[1832]! } - public var Login_CountryCode: String { return self._s[1833]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1834]! } - public var Map_GetDirections: String { return self._s[1835]! } - public var Login_PhoneFloodError: String { return self._s[1836]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1832]! } + public var Stickers_SuggestAdded: String { return self._s[1833]! } + public var Login_CountryCode: String { return self._s[1834]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1835]! } + public var Map_GetDirections: String { return self._s[1836]! } + public var Login_PhoneFloodError: String { return self._s[1837]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1837]!, self._r[1837]!, [_0]) + return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1839]! } - public var Group_Location_ChangeLocation: String { return self._s[1840]! } - public var Notification_GroupInviterSelf: String { return self._s[1841]! } - public var InstantPage_TapToOpenLink: String { return self._s[1842]! } + public var Settings_SetUsername: String { return self._s[1840]! } + public var Group_Location_ChangeLocation: String { return self._s[1841]! } + public var Notification_GroupInviterSelf: String { return self._s[1842]! } + public var InstantPage_TapToOpenLink: String { return self._s[1843]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_0]) + return formatWithArgumentRanges(self._s[1844]!, self._r[1844]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1844]! } - public var SecretChat_Title: String { return self._s[1845]! } - public var Group_UpgradeNoticeText1: String { return self._s[1846]! } - public var AuthSessions_Title: String { return self._s[1847]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1845]! } + public var SecretChat_Title: String { return self._s[1846]! } + public var Group_UpgradeNoticeText1: String { return self._s[1847]! } + public var AuthSessions_Title: String { return self._s[1848]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_0]) + return formatWithArgumentRanges(self._s[1849]!, self._r[1849]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1849]! } - public var Channel_About_Title: String { return self._s[1850]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1851]! } + public var PhotoEditor_CropAuto: String { return self._s[1850]! } + public var Channel_About_Title: String { return self._s[1851]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1852]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1854]!, self._r[1854]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1854]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1856]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1857]! } + public var VoiceOver_MessageContextReport: String { return self._s[1855]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1857]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1858]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_1]) + return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1860]!, self._r[1860]!, [_0]) - } - public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1862]! } - public var Presence_online: String { return self._s[1864]! } - public var PasscodeSettings_Title: String { return self._s[1865]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1866]! } - public var Web_OpenExternal: String { return self._s[1867]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1869]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1870]! } - public var LocalGroup_Title: String { return self._s[1871]! } + public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, [_0]) + } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1863]! } + public var Presence_online: String { return self._s[1865]! } + public var PasscodeSettings_Title: String { return self._s[1866]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1867]! } + public var Web_OpenExternal: String { return self._s[1868]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1870]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1871]! } + public var LocalGroup_Title: String { return self._s[1872]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1872]!, self._r[1872]!, [_0]) + return formatWithArgumentRanges(self._s[1873]!, self._r[1873]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1873]! } - public var Map_YouAreHere: String { return self._s[1874]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1874]! } + public var Map_YouAreHere: String { return self._s[1875]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1877]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1878]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1879]!, self._r[1879]!, [_0]) + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1878]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1879]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1880]!, self._r[1880]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1881]! } - public var Bot_Start: String { return self._s[1882]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1883]!, self._r[1883]!, [_0]) + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + public var SocksProxySetup_Username: String { return self._s[1882]! } + public var Bot_Start: String { return self._s[1883]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1885]! } - public var AccentColor_Title: String { return self._s[1887]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1888]! } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[1886]! } + public var AccentColor_Title: String { return self._s[1888]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1889]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_0]) + return formatWithArgumentRanges(self._s[1891]!, self._r[1891]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1891]!, self._r[1891]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1892]!, self._r[1892]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1892]! } - public var Login_InfoAvatarPhoto: String { return self._s[1893]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1894]! } - public var Tour_Title4: String { return self._s[1895]! } - public var Passport_Identity_Translation: String { return self._s[1896]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1897]! } - public var Login_TermsOfServiceLabel: String { return self._s[1899]! } - public var Passport_Language_it: String { return self._s[1900]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1901]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1902]! } - public var Conversation_ClearAll: String { return self._s[1904]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1906]! } - public var TwoStepAuth_FloodError: String { return self._s[1907]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1893]! } + public var Login_InfoAvatarPhoto: String { return self._s[1894]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1895]! } + public var Tour_Title4: String { return self._s[1896]! } + public var Passport_Identity_Translation: String { return self._s[1897]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1898]! } + public var Login_TermsOfServiceLabel: String { return self._s[1900]! } + public var Passport_Language_it: String { return self._s[1901]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1902]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1903]! } + public var Conversation_ClearAll: String { return self._s[1905]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1907]! } + public var TwoStepAuth_FloodError: String { return self._s[1908]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1908]!, self._r[1908]!, [_1]) + return formatWithArgumentRanges(self._s[1909]!, self._r[1909]!, [_1]) } - public var Paint_Delete: String { return self._s[1909]! } - public var Privacy_AddNewPeer: String { return self._s[1910]! } + public var Paint_Delete: String { return self._s[1910]! } + public var Privacy_AddNewPeer: String { return self._s[1911]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1]) + return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1912]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1913]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1914]! } + public var Message_PinnedAudioMessage: String { return self._s[1915]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1915]!, self._r[1915]!, [_0]) + return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1916]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1917]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1918]! } - public var Conversation_MessageEditedLabel: String { return self._s[1919]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1920]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1921]! } + public var Notification_Mute1hMin: String { return self._s[1917]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1918]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1919]! } + public var Conversation_MessageEditedLabel: String { return self._s[1920]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1921]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1922]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1923]!, self._r[1923]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1923]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1924]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1924]!, self._r[1924]!, [_1]) + return formatWithArgumentRanges(self._s[1925]!, self._r[1925]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1925]! } - public var Month_GenOctober: String { return self._s[1926]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1927]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1928]! } - public var MediaPicker_TimerTooltip: String { return self._s[1930]! } - public var SharedMedia_TitleAll: String { return self._s[1931]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1934]! } - public var Conversation_RestrictedMedia: String { return self._s[1935]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1936]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1938]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1939]! } + public var AccessDenied_LocationTracking: String { return self._s[1926]! } + public var Month_GenOctober: String { return self._s[1927]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1928]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1929]! } + public var MediaPicker_TimerTooltip: String { return self._s[1931]! } + public var SharedMedia_TitleAll: String { return self._s[1932]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1935]! } + public var Conversation_RestrictedMedia: String { return self._s[1936]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1937]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1939]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1940]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1940]!, self._r[1940]!, [_0]) + return formatWithArgumentRanges(self._s[1941]!, self._r[1941]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1943]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1945]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1946]! } + public var Conversation_SavedMessages: String { return self._s[1944]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1946]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1947]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_0]) + return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1949]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1950]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1950]!, self._r[1950]!, [_0]) + return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1951]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1952]! } + public var ReportPeer_AlertSuccess: String { return self._s[1952]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1953]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1954]!, self._r[1954]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1954]! } - public var PhotoEditor_FadeTool: String { return self._s[1955]! } - public var Privacy_ContactsReset: String { return self._s[1956]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1955]! } + public var PhotoEditor_FadeTool: String { return self._s[1956]! } + public var Privacy_ContactsReset: String { return self._s[1957]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1958]!, self._r[1958]!, [_0]) + return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1959]! } - public var ChatList_Mute: String { return self._s[1960]! } - public var Permissions_CellularDataText_v0: String { return self._s[1961]! } - public var ShareMenu_SelectChats: String { return self._s[1963]! } - public var MusicPlayer_VoiceNote: String { return self._s[1964]! } - public var Conversation_RestrictedText: String { return self._s[1965]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1966]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1967]! } - public var Cache_Videos: String { return self._s[1968]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1969]! } - public var FeatureDisabled_Oops: String { return self._s[1971]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1972]! } + public var Message_PinnedVideoMessage: String { return self._s[1960]! } + public var ChatList_Mute: String { return self._s[1961]! } + public var Permissions_CellularDataText_v0: String { return self._s[1962]! } + public var ShareMenu_SelectChats: String { return self._s[1964]! } + public var MusicPlayer_VoiceNote: String { return self._s[1965]! } + public var Conversation_RestrictedText: String { return self._s[1966]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1967]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1968]! } + public var Cache_Videos: String { return self._s[1969]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1970]! } + public var FeatureDisabled_Oops: String { return self._s[1972]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1973]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1973]!, self._r[1973]!, [_0]) + return formatWithArgumentRanges(self._s[1974]!, self._r[1974]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1974]! } - public var GroupPermission_NoSendPolls: String { return self._s[1975]! } - public var Message_VideoExpired: String { return self._s[1977]! } - public var Notifications_Badge: String { return self._s[1978]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1979]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1980]! } - public var Username_InvalidTooShort: String { return self._s[1981]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1982]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1983]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1984]! } + public var Stickers_GroupStickersHelp: String { return self._s[1975]! } + public var GroupPermission_NoSendPolls: String { return self._s[1976]! } + public var Message_VideoExpired: String { return self._s[1978]! } + public var Notifications_Badge: String { return self._s[1979]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1980]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1981]! } + public var Username_InvalidTooShort: String { return self._s[1982]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1983]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1984]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1985]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1985]!, self._r[1985]!, [_1]) + return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1986]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1987]! } - public var SharedMedia_CategoryDocs: String { return self._s[1990]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1987]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1988]! } + public var SharedMedia_CategoryDocs: String { return self._s[1991]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_1]) + return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[1993]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1994]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_1]) + return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1995]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1996]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1996]!, self._r[1996]!, [_0]) + return formatWithArgumentRanges(self._s[1997]!, self._r[1997]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1997]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1998]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1999]! } - public var Channel_UpdatePhotoItem: String { return self._s[2000]! } - public var GroupInfo_LeftStatus: String { return self._s[2001]! } - public var Watch_MessageView_Forward: String { return self._s[2003]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2004]! } - public var Cache_ClearEmpty: String { return self._s[2006]! } - public var Localization_LanguageName: String { return self._s[2007]! } - public var WebSearch_GIFs: String { return self._s[2008]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2009]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2010]! } - public var Common_Back: String { return self._s[2011]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2012]! } + public var ChatSettings_PrivateChats: String { return self._s[1998]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1999]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2000]! } + public var Channel_UpdatePhotoItem: String { return self._s[2001]! } + public var GroupInfo_LeftStatus: String { return self._s[2002]! } + public var Watch_MessageView_Forward: String { return self._s[2004]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2005]! } + public var Cache_ClearEmpty: String { return self._s[2007]! } + public var Localization_LanguageName: String { return self._s[2008]! } + public var WebSearch_GIFs: String { return self._s[2009]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2010]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2011]! } + public var Common_Back: String { return self._s[2012]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2013]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2014]! } - public var Watch_Conversation_Reply: String { return self._s[2016]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2018]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2019]! } - public var Channel_BanUser_Unban: String { return self._s[2021]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2022]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2023]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2025]! } - public var Passport_Identity_Name: String { return self._s[2026]! } + public var Passport_Email_Help: String { return self._s[2015]! } + public var Watch_Conversation_Reply: String { return self._s[2017]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2019]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2020]! } + public var Channel_BanUser_Unban: String { return self._s[2022]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2023]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2024]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2026]! } + public var Passport_Identity_Name: String { return self._s[2027]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2027]!, self._r[2027]!, [_0]) + return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2028]! } - public var Conversation_BlockUser: String { return self._s[2029]! } - public var Month_GenJanuary: String { return self._s[2030]! } - public var ChatSettings_TextSize: String { return self._s[2031]! } - public var Notification_PassportValuePhone: String { return self._s[2032]! } - public var Passport_Language_ne: String { return self._s[2033]! } - public var Notification_CallBack: String { return self._s[2034]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2035]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2029]! } + public var Conversation_BlockUser: String { return self._s[2030]! } + public var Month_GenJanuary: String { return self._s[2031]! } + public var ChatSettings_TextSize: String { return self._s[2032]! } + public var Notification_PassportValuePhone: String { return self._s[2033]! } + public var Passport_Language_ne: String { return self._s[2034]! } + public var Notification_CallBack: String { return self._s[2035]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2036]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2036]!, self._r[2036]!, [_0]) + return formatWithArgumentRanges(self._s[2037]!, self._r[2037]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2037]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2038]! } - public var Stickers_FrequentlyUsed: String { return self._s[2039]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2040]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2042]! } + public var Channel_Info_Management: String { return self._s[2038]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2039]! } + public var Stickers_FrequentlyUsed: String { return self._s[2040]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2041]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2043]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2043]!, self._r[2043]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2044]!, self._r[2044]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2044]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2045]! } - public var CreatePoll_TextHeader: String { return self._s[2046]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2045]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2046]! } + public var CreatePoll_TextHeader: String { return self._s[2047]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_0]) + return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2048]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2049]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2051]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2052]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2053]! } + public var PhotoEditor_QualityMedium: String { return self._s[2049]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2050]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2052]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2053]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2054]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2054]!, self._r[2054]!, [_0]) + return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_1]) + return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2057]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2058]! } - public var Settings_Username: String { return self._s[2060]! } - public var Conversation_Block: String { return self._s[2062]! } - public var Wallpaper_Wallpaper: String { return self._s[2063]! } - public var SocksProxySetup_UseProxy: String { return self._s[2065]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2066]! } - public var MessageTimer_Forever: String { return self._s[2067]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2068]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2069]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2070]! } - public var Passport_Language_da: String { return self._s[2071]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2072]! } + public var Conversation_LinkDialogOpen: String { return self._s[2058]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2059]! } + public var Settings_Username: String { return self._s[2061]! } + public var Conversation_Block: String { return self._s[2063]! } + public var Wallpaper_Wallpaper: String { return self._s[2064]! } + public var SocksProxySetup_UseProxy: String { return self._s[2066]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2067]! } + public var MessageTimer_Forever: String { return self._s[2068]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2069]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2070]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2071]! } + public var Passport_Language_da: String { return self._s[2072]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2073]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2073]!, self._r[2073]!, [_0]) + return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2074]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2075]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2076]!, self._r[2076]!, [_0]) + return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2078]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2079]! } - public var Conversation_PinnedPoll: String { return self._s[2080]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2081]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2079]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2080]! } + public var Conversation_PinnedPoll: String { return self._s[2081]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2082]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2082]!, self._r[2082]!, [_1]) + return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2083]! } - public var Cache_ByPeerHeader: String { return self._s[2084]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2084]! } + public var Cache_ByPeerHeader: String { return self._s[2085]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2085]!, self._r[2085]!, [_0]) + return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2086]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2089]! } - public var Notification_PinnedMessage: String { return self._s[2090]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2092]! } - public var Contacts_SortBy: String { return self._s[2093]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2087]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2090]! } + public var Notification_PinnedMessage: String { return self._s[2091]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2093]! } + public var Contacts_SortBy: String { return self._s[2094]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2094]!, self._r[2094]!, [_1]) + return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2096]!, self._r[2096]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2097]!, self._r[2097]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2097]! } - public var Watch_UserInfo_Service: String { return self._s[2098]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2100]! } - public var Conversation_Unpin: String { return self._s[2102]! } - public var CancelResetAccount_Title: String { return self._s[2103]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2104]! } + public var Call_EncryptionKey_Title: String { return self._s[2098]! } + public var Watch_UserInfo_Service: String { return self._s[2099]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2101]! } + public var Conversation_Unpin: String { return self._s[2103]! } + public var CancelResetAccount_Title: String { return self._s[2104]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2105]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2107]!, self._r[2107]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2107]! } - public var CallSettings_Title: String { return self._s[2108]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2109]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2111]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2112]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2108]! } + public var CallSettings_Title: String { return self._s[2109]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2110]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2112]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2113]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2114]! } - public var LoginPassword_PasswordHelp: String { return self._s[2115]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2116]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2117]! } - public var Checkout_TotalPaidAmount: String { return self._s[2118]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2115]! } + public var LoginPassword_PasswordHelp: String { return self._s[2116]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2117]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2118]! } + public var Checkout_TotalPaidAmount: String { return self._s[2119]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2119]!, self._r[2119]!, [_0]) + return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2120]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2122]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2123]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2121]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2123]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2124]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2124]!, self._r[2124]!, [_1]) + return formatWithArgumentRanges(self._s[2125]!, self._r[2125]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2125]! } - public var Contacts_InviteFriends: String { return self._s[2127]! } - public var Map_ChooseLocationTitle: String { return self._s[2128]! } - public var Conversation_StopPoll: String { return self._s[2130]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2126]! } + public var Contacts_InviteFriends: String { return self._s[2128]! } + public var Map_ChooseLocationTitle: String { return self._s[2129]! } + public var Conversation_StopPoll: String { return self._s[2131]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2131]!, self._r[2131]!, [_0]) + return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_0]) } - public var Call_Camera: String { return self._s[2132]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2133]! } - public var Calls_RatingFeedback: String { return self._s[2134]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2135]! } - public var NotificationsSound_Pulse: String { return self._s[2136]! } - public var Watch_LastSeen_Lately: String { return self._s[2137]! } - public var ReportGroupLocation_Report: String { return self._s[2140]! } - public var Widget_NoUsers: String { return self._s[2141]! } - public var Conversation_UnvotePoll: String { return self._s[2142]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2144]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2145]! } - public var NotificationsSound_Circles: String { return self._s[2146]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2148]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2149]! } - public var Proxy_TooltipUnavailable: String { return self._s[2150]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2152]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2154]! } - public var Conversation_FileDropbox: String { return self._s[2155]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2156]! } - public var Tour_Text3: String { return self._s[2158]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2160]! } - public var GroupPermission_NoSendMessages: String { return self._s[2161]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2162]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2163]! } + public var Call_Camera: String { return self._s[2133]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2134]! } + public var Calls_RatingFeedback: String { return self._s[2135]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2136]! } + public var NotificationsSound_Pulse: String { return self._s[2137]! } + public var Watch_LastSeen_Lately: String { return self._s[2138]! } + public var ReportGroupLocation_Report: String { return self._s[2141]! } + public var Widget_NoUsers: String { return self._s[2142]! } + public var Conversation_UnvotePoll: String { return self._s[2143]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2145]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2146]! } + public var NotificationsSound_Circles: String { return self._s[2147]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2149]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2150]! } + public var Proxy_TooltipUnavailable: String { return self._s[2151]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2153]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2155]! } + public var Conversation_FileDropbox: String { return self._s[2156]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2157]! } + public var Tour_Text3: String { return self._s[2159]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2161]! } + public var GroupPermission_NoSendMessages: String { return self._s[2162]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2163]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2164]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_0]) + return formatWithArgumentRanges(self._s[2166]!, self._r[2166]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2166]! } - public var Checkout_ShippingOption_Title: String { return self._s[2167]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2168]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2167]! } + public var Checkout_ShippingOption_Title: String { return self._s[2168]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2169]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2169]!, self._r[2169]!, [_0]) - } - public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2171]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2172]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2173]! } - public var AutoDownloadSettings_Photos: String { return self._s[2175]! } - public var Appearance_PreviewIncomingText: String { return self._s[2176]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2177]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2178]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2179]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2180]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2181]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2182]! } - public var Notification_SecretChatScreenshot: String { return self._s[2183]! } - public var AccessDenied_Wallpapers: String { return self._s[2184]! } - public var Passport_Address_City: String { return self._s[2186]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2187]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2188]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2189]! } - public var AccessDenied_LocationDisabled: String { return self._s[2190]! } - public var Group_Location_Title: String { return self._s[2191]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2193]! } - public var GroupInfo_Sound: String { return self._s[2194]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2195]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2196]! } - public var Contacts_Title: String { return self._s[2197]! } - public var Passport_Language_fr: String { return self._s[2198]! } - public var Notifications_ResetAllNotifications: String { return self._s[2199]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2202]! } - public var Checkout_NewCard_Title: String { return self._s[2203]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2204]! } - public var Conversation_ForwardChats: String { return self._s[2205]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2207]! } - public var Settings_FAQ: String { return self._s[2209]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2210]! } - public var Conversation_ContextMenuForward: String { return self._s[2211]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2214]! } - public var PrivacyPolicy_Title: String { return self._s[2217]! } - public var Notifications_TextTone: String { return self._s[2218]! } - public var Profile_CreateNewContact: String { return self._s[2219]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2220]! } - public var Call_Speaker: String { return self._s[2222]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2223]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2225]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2226]! } + public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2171]!, self._r[2171]!, [_0]) + } + public var Channel_Management_LabelAdministrator: String { return self._s[2172]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2173]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2174]! } + public var AutoDownloadSettings_Photos: String { return self._s[2176]! } + public var Appearance_PreviewIncomingText: String { return self._s[2177]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2178]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2179]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2180]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2181]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2182]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2183]! } + public var Notification_SecretChatScreenshot: String { return self._s[2184]! } + public var AccessDenied_Wallpapers: String { return self._s[2185]! } + public var Passport_Address_City: String { return self._s[2187]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2188]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2189]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2190]! } + public var AccessDenied_LocationDisabled: String { return self._s[2191]! } + public var Group_Location_Title: String { return self._s[2192]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2194]! } + public var GroupInfo_Sound: String { return self._s[2195]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2196]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2197]! } + public var Contacts_Title: String { return self._s[2198]! } + public var Passport_Language_fr: String { return self._s[2199]! } + public var Notifications_ResetAllNotifications: String { return self._s[2200]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2203]! } + public var Checkout_NewCard_Title: String { return self._s[2204]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2205]! } + public var Conversation_ForwardChats: String { return self._s[2206]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2208]! } + public var Settings_FAQ: String { return self._s[2210]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2211]! } + public var Conversation_ContextMenuForward: String { return self._s[2212]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2215]! } + public var PrivacyPolicy_Title: String { return self._s[2218]! } + public var Notifications_TextTone: String { return self._s[2219]! } + public var Profile_CreateNewContact: String { return self._s[2220]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2221]! } + public var Call_Speaker: String { return self._s[2223]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2224]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2226]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2227]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2227]!, self._r[2227]!, [_0]) + return formatWithArgumentRanges(self._s[2228]!, self._r[2228]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2228]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2229]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2230]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2231]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2232]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2233]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2234]! } - public var Bot_Unblock: String { return self._s[2235]! } - public var TextFormat_Italic: String { return self._s[2236]! } - public var WallpaperSearch_ColorPink: String { return self._s[2237]! } - public var Settings_About_Help: String { return self._s[2238]! } - public var SearchImages_Title: String { return self._s[2239]! } - public var Weekday_Wednesday: String { return self._s[2240]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2241]! } - public var ExplicitContent_AlertTitle: String { return self._s[2242]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2229]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2230]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2231]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2232]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2233]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2234]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2235]! } + public var Bot_Unblock: String { return self._s[2236]! } + public var TextFormat_Italic: String { return self._s[2237]! } + public var WallpaperSearch_ColorPink: String { return self._s[2238]! } + public var Settings_About_Help: String { return self._s[2239]! } + public var SearchImages_Title: String { return self._s[2240]! } + public var Weekday_Wednesday: String { return self._s[2241]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2242]! } + public var ExplicitContent_AlertTitle: String { return self._s[2243]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2243]!, self._r[2243]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2244]!, self._r[2244]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2244]! } - public var Weekday_Thursday: String { return self._s[2245]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2246]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2247]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2245]! } + public var Weekday_Thursday: String { return self._s[2246]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2247]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2248]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2248]!, self._r[2248]!, [_0]) + return formatWithArgumentRanges(self._s[2249]!, self._r[2249]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2249]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2250]! } - public var Passport_RequestedInformation: String { return self._s[2251]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2252]! } - public var Conversation_EncryptionProcessing: String { return self._s[2254]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2255]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2257]! } - public var Channel_Setup_Title: String { return self._s[2258]! } - public var Conversation_SearchPlaceholder: String { return self._s[2259]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2260]! } - public var Checkout_ErrorGeneric: String { return self._s[2261]! } - public var Passport_Language_hu: String { return self._s[2262]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2250]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2251]! } + public var Passport_RequestedInformation: String { return self._s[2252]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2253]! } + public var Conversation_EncryptionProcessing: String { return self._s[2255]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2256]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2258]! } + public var Channel_Setup_Title: String { return self._s[2259]! } + public var Conversation_SearchPlaceholder: String { return self._s[2260]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2261]! } + public var Checkout_ErrorGeneric: String { return self._s[2262]! } + public var Passport_Language_hu: String { return self._s[2263]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2264]!, self._r[2264]!, [_0]) + return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2267]!, self._r[2267]!, [_1]) + return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_0]) + return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) } - public var Group_Location_Info: String { return self._s[2269]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2270]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2271]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2272]! } + public var Group_Location_Info: String { return self._s[2270]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2271]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2272]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2273]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2273]!, self._r[2273]!, [_0]) + return formatWithArgumentRanges(self._s[2274]!, self._r[2274]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2274]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2275]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2276]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2275]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2276]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2277]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2277]!, self._r[2277]!, [_0]) + return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2278]! } - public var Message_PinnedAnimationMessage: String { return self._s[2280]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2282]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2283]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2285]! } - public var Embed_PlayingInPIP: String { return self._s[2286]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2287]! } + public var Passport_Language_cs: String { return self._s[2279]! } + public var Message_PinnedAnimationMessage: String { return self._s[2281]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2283]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2284]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2286]! } + public var Embed_PlayingInPIP: String { return self._s[2287]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2288]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_0]) + return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2289]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2290]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2290]!, self._r[2290]!, [_1]) + return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2291]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2292]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2293]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2294]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2295]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2296]! } + public var Notification_PaymentSent: String { return self._s[2292]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2293]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2294]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2295]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2296]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2297]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1]) - } - public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_1]) } - public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2301]!, self._r[2301]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2303]! } - public var PasscodeSettings_HelpTop: String { return self._s[2304]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2305]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2306]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2307]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2308]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2309]! } - public var Call_Accept: String { return self._s[2311]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2312]! } - public var Month_GenMarch: String { return self._s[2314]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2315]! } - public var LoginPassword_Title: String { return self._s[2316]! } - public var Call_End: String { return self._s[2317]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2318]! } - public var VoiceOver_Chat_Contact: String { return self._s[2319]! } - public var CallSettings_Always: String { return self._s[2320]! } - public var CallFeedback_Success: String { return self._s[2321]! } - public var TwoStepAuth_SetupHint: String { return self._s[2322]! } + public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1]) + } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2304]! } + public var PasscodeSettings_HelpTop: String { return self._s[2305]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2306]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2307]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2308]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2309]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2310]! } + public var Call_Accept: String { return self._s[2312]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2313]! } + public var Month_GenMarch: String { return self._s[2315]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2316]! } + public var LoginPassword_Title: String { return self._s[2317]! } + public var Call_End: String { return self._s[2318]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2319]! } + public var VoiceOver_Chat_Contact: String { return self._s[2320]! } + public var CallSettings_Always: String { return self._s[2321]! } + public var CallFeedback_Success: String { return self._s[2322]! } + public var TwoStepAuth_SetupHint: String { return self._s[2323]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2323]!, self._r[2323]!, [_1]) + return formatWithArgumentRanges(self._s[2324]!, self._r[2324]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2324]! } - public var Login_PhoneTitle: String { return self._s[2325]! } - public var Passport_FieldPhoneHelp: String { return self._s[2326]! } - public var Weekday_ShortSunday: String { return self._s[2327]! } - public var Passport_InfoFAQ_URL: String { return self._s[2328]! } - public var ContactInfo_Job: String { return self._s[2330]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2331]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2332]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2333]! } - public var Invite_ChannelsTooMuch: String { return self._s[2334]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2335]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2336]! } - public var CallFeedback_ReasonNoise: String { return self._s[2337]! } - public var Appearance_AppIconDefault: String { return self._s[2339]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2340]! } - public var MediaPicker_AddCaption: String { return self._s[2341]! } - public var CallSettings_TabIconDescription: String { return self._s[2342]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2325]! } + public var Login_PhoneTitle: String { return self._s[2326]! } + public var Passport_FieldPhoneHelp: String { return self._s[2327]! } + public var Weekday_ShortSunday: String { return self._s[2328]! } + public var Passport_InfoFAQ_URL: String { return self._s[2329]! } + public var ContactInfo_Job: String { return self._s[2331]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2332]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2333]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2334]! } + public var Invite_ChannelsTooMuch: String { return self._s[2335]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2336]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2337]! } + public var CallFeedback_ReasonNoise: String { return self._s[2338]! } + public var Appearance_AppIconDefault: String { return self._s[2340]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2341]! } + public var MediaPicker_AddCaption: String { return self._s[2342]! } + public var CallSettings_TabIconDescription: String { return self._s[2343]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2343]!, self._r[2343]!, [_0]) + return formatWithArgumentRanges(self._s[2344]!, self._r[2344]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2344]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2345]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2346]! } - public var DialogList_SearchSectionRecent: String { return self._s[2347]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2348]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2351]! } - public var LastSeen_WithinAWeek: String { return self._s[2352]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2353]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2355]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2356]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2345]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2346]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2347]! } + public var DialogList_SearchSectionRecent: String { return self._s[2348]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2349]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2352]! } + public var LastSeen_WithinAWeek: String { return self._s[2353]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2354]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2356]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2357]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2357]!, self._r[2357]!, [_0]) + return formatWithArgumentRanges(self._s[2358]!, self._r[2358]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2358]! } - public var Conversation_StatusLeftGroup: String { return self._s[2359]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2360]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2362]! } - public var GroupPermission_AddSuccess: String { return self._s[2363]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2365]! } - public var Conversation_ContextMenuCopy: String { return self._s[2366]! } - public var AccessDenied_CallMicrophone: String { return self._s[2367]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2359]! } + public var Conversation_StatusLeftGroup: String { return self._s[2360]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2361]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2363]! } + public var GroupPermission_AddSuccess: String { return self._s[2364]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2366]! } + public var Conversation_ContextMenuCopy: String { return self._s[2367]! } + public var AccessDenied_CallMicrophone: String { return self._s[2368]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2368]!, self._r[2368]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2369]!, self._r[2369]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2369]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2370]! } - public var Checkout_PaymentMethod_New: String { return self._s[2371]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2372]! } - public var PhotoEditor_QualityTool: String { return self._s[2373]! } - public var Login_SendCodeViaSms: String { return self._s[2374]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2375]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2376]! } - public var Login_EmailNotConfiguredError: String { return self._s[2377]! } - public var SocksProxySetup_Status: String { return self._s[2378]! } - public var PrivacyPolicy_Accept: String { return self._s[2379]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2380]! } - public var Appearance_AppIconClassicX: String { return self._s[2381]! } + public var Login_InvalidFirstNameError: String { return self._s[2370]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2371]! } + public var Checkout_PaymentMethod_New: String { return self._s[2372]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2373]! } + public var PhotoEditor_QualityTool: String { return self._s[2374]! } + public var Login_SendCodeViaSms: String { return self._s[2375]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2376]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2377]! } + public var Login_EmailNotConfiguredError: String { return self._s[2378]! } + public var SocksProxySetup_Status: String { return self._s[2379]! } + public var PrivacyPolicy_Accept: String { return self._s[2380]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2381]! } + public var Appearance_AppIconClassicX: String { return self._s[2382]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2382]!, self._r[2382]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2383]!, self._r[2383]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2383]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2384]! } - public var AutoNightTheme_Automatic: String { return self._s[2385]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2386]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2387]! } - public var Cache_Help: String { return self._s[2388]! } - public var Group_ErrorAccessDenied: String { return self._s[2389]! } - public var Passport_Language_fa: String { return self._s[2390]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2391]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2392]! } - public var PrivacySettings_LastSeen: String { return self._s[2393]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2384]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2385]! } + public var AutoNightTheme_Automatic: String { return self._s[2386]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2387]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2388]! } + public var Cache_Help: String { return self._s[2389]! } + public var Group_ErrorAccessDenied: String { return self._s[2390]! } + public var Passport_Language_fa: String { return self._s[2391]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2392]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2393]! } + public var PrivacySettings_LastSeen: String { return self._s[2394]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2394]!, self._r[2394]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2395]!, self._r[2395]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2398]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2399]! } - public var Profile_About: String { return self._s[2400]! } - public var Channel_About_Placeholder: String { return self._s[2401]! } - public var Login_InfoTitle: String { return self._s[2402]! } + public var Preview_SaveGif: String { return self._s[2399]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2400]! } + public var Profile_About: String { return self._s[2401]! } + public var Channel_About_Placeholder: String { return self._s[2402]! } + public var Login_InfoTitle: String { return self._s[2403]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2403]!, self._r[2403]!, [_0]) + return formatWithArgumentRanges(self._s[2404]!, self._r[2404]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2405]! } - public var ContactInfo_Title: String { return self._s[2406]! } - public var Media_ShareThisVideo: String { return self._s[2407]! } - public var Weekday_ShortFriday: String { return self._s[2408]! } - public var AccessDenied_Contacts: String { return self._s[2410]! } - public var Notification_CallIncomingShort: String { return self._s[2411]! } - public var Group_Setup_TypePublic: String { return self._s[2412]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2413]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2414]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2417]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2418]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2419]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2420]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2421]! } - public var DialogList_Typing: String { return self._s[2422]! } - public var CallFeedback_IncludeLogs: String { return self._s[2424]! } - public var Checkout_Phone: String { return self._s[2426]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2429]! } - public var Privacy_Calls_Integration: String { return self._s[2430]! } - public var Notifications_PermissionsAllow: String { return self._s[2431]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2435]! } - public var Settings_ChatSettings: String { return self._s[2436]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2406]! } + public var ContactInfo_Title: String { return self._s[2407]! } + public var Media_ShareThisVideo: String { return self._s[2408]! } + public var Weekday_ShortFriday: String { return self._s[2409]! } + public var AccessDenied_Contacts: String { return self._s[2411]! } + public var Notification_CallIncomingShort: String { return self._s[2412]! } + public var Group_Setup_TypePublic: String { return self._s[2413]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2414]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2415]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2418]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2419]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2420]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2421]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2422]! } + public var DialogList_Typing: String { return self._s[2423]! } + public var CallFeedback_IncludeLogs: String { return self._s[2425]! } + public var Checkout_Phone: String { return self._s[2427]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2430]! } + public var Privacy_Calls_Integration: String { return self._s[2431]! } + public var Notifications_PermissionsAllow: String { return self._s[2432]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2436]! } + public var Settings_ChatSettings: String { return self._s[2437]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2437]!, self._r[2437]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2438]!, self._r[2438]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2439]! } + public var GroupRemoved_DeleteUser: String { return self._s[2440]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2440]!, self._r[2440]!, [_0]) + return formatWithArgumentRanges(self._s[2441]!, self._r[2441]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2441]!, self._r[2441]!, [_1]) + return formatWithArgumentRanges(self._s[2442]!, self._r[2442]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2442]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2443]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2445]! } - public var Conversation_Unblock: String { return self._s[2446]! } - public var PrivacySettings_DataSettings: String { return self._s[2447]! } - public var Group_PublicLink_Info: String { return self._s[2448]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2449]! } + public var Login_ContinueWithLocalization: String { return self._s[2443]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2444]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2446]! } + public var Conversation_Unblock: String { return self._s[2447]! } + public var PrivacySettings_DataSettings: String { return self._s[2448]! } + public var Group_PublicLink_Info: String { return self._s[2449]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2450]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2453]! } - public var Call_Mute: String { return self._s[2454]! } - public var Passport_Language_dz: String { return self._s[2455]! } - public var Passport_Language_tk: String { return self._s[2456]! } + public var PrivacySettings_Passcode: String { return self._s[2454]! } + public var Call_Mute: String { return self._s[2455]! } + public var Passport_Language_dz: String { return self._s[2456]! } + public var Passport_Language_tk: String { return self._s[2457]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2457]!, self._r[2457]!, [_0]) + return formatWithArgumentRanges(self._s[2458]!, self._r[2458]!, [_0]) } - public var Settings_Search: String { return self._s[2458]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2459]! } - public var Conversation_ContextMenuReply: String { return self._s[2460]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2461]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2462]! } - public var Tour_Title1: String { return self._s[2463]! } - public var Conversation_ClearGroupHistory: String { return self._s[2465]! } - public var WallpaperPreview_Motion: String { return self._s[2466]! } + public var Settings_Search: String { return self._s[2459]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2460]! } + public var Conversation_ContextMenuReply: String { return self._s[2461]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2462]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2463]! } + public var Tour_Title1: String { return self._s[2464]! } + public var Conversation_ClearGroupHistory: String { return self._s[2466]! } + public var WallpaperPreview_Motion: String { return self._s[2467]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_0]) + return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) } - public var Call_RateCall: String { return self._s[2468]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2469]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2470]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2471]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2473]! } + public var Call_RateCall: String { return self._s[2469]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2470]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2471]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2472]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2474]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2475]!, self._r[2475]!, [_0]) + return formatWithArgumentRanges(self._s[2476]!, self._r[2476]!, [_0]) } - public var Compose_Create: String { return self._s[2476]! } - public var Contacts_InviteToTelegram: String { return self._s[2477]! } - public var GroupInfo_Notifications: String { return self._s[2478]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2480]! } - public var Month_GenApril: String { return self._s[2481]! } - public var Appearance_AutoNightTheme: String { return self._s[2482]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2484]! } - public var Login_CodeSentSms: String { return self._s[2486]! } + public var Compose_Create: String { return self._s[2477]! } + public var Contacts_InviteToTelegram: String { return self._s[2478]! } + public var GroupInfo_Notifications: String { return self._s[2479]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2481]! } + public var Month_GenApril: String { return self._s[2482]! } + public var Appearance_AutoNightTheme: String { return self._s[2483]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2485]! } + public var Login_CodeSentSms: String { return self._s[2487]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2487]!, self._r[2487]!, [_0]) + return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2488]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2489]! } - public var Passport_Language_hr: String { return self._s[2490]! } - public var Common_ActionNotAllowedError: String { return self._s[2491]! } + public var EmptyGroupInfo_Line3: String { return self._s[2489]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2490]! } + public var Passport_Language_hr: String { return self._s[2491]! } + public var Common_ActionNotAllowedError: String { return self._s[2492]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2492]!, self._r[2492]!, [_0]) + return formatWithArgumentRanges(self._s[2493]!, self._r[2493]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2493]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2494]! } - public var Privacy_SecretChatsTitle: String { return self._s[2495]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2497]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2498]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2499]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2500]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2501]! } - public var Preview_DeleteGif: String { return self._s[2502]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2503]! } - public var Group_ErrorNotMutualContact: String { return self._s[2504]! } - public var Notification_MessageLifetime5s: String { return self._s[2505]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2494]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2495]! } + public var Privacy_SecretChatsTitle: String { return self._s[2496]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2498]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2499]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2500]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2501]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2502]! } + public var Preview_DeleteGif: String { return self._s[2503]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2504]! } + public var Group_ErrorNotMutualContact: String { return self._s[2505]! } + public var Notification_MessageLifetime5s: String { return self._s[2506]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_0]) + return formatWithArgumentRanges(self._s[2507]!, self._r[2507]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2507]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2509]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2510]! } - public var Passport_Address_AddBankStatement: String { return self._s[2511]! } - public var Notification_CallIncoming: String { return self._s[2512]! } - public var Compose_NewGroupTitle: String { return self._s[2513]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2515]! } - public var Passport_Address_Postcode: String { return self._s[2517]! } + public var VoiceOver_Chat_Video: String { return self._s[2508]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2510]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2511]! } + public var Passport_Address_AddBankStatement: String { return self._s[2512]! } + public var Notification_CallIncoming: String { return self._s[2513]! } + public var Compose_NewGroupTitle: String { return self._s[2514]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2516]! } + public var Passport_Address_Postcode: String { return self._s[2518]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2518]!, self._r[2518]!, [_0]) + return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2519]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2520]! } - public var WallpaperColors_Title: String { return self._s[2521]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2522]! } - public var VoiceOver_MessageContextForward: String { return self._s[2523]! } - public var GroupPermission_Duration: String { return self._s[2524]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2520]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2521]! } + public var WallpaperColors_Title: String { return self._s[2522]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2523]! } + public var VoiceOver_MessageContextForward: String { return self._s[2524]! } + public var GroupPermission_Duration: String { return self._s[2525]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2525]!, self._r[2525]!, [_0]) + return formatWithArgumentRanges(self._s[2526]!, self._r[2526]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2526]! } - public var Username_Placeholder: String { return self._s[2527]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2528]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2529]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2530]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2527]! } + public var Username_Placeholder: String { return self._s[2528]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2529]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2530]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2531]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2532]!, self._r[2532]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2533]!, self._r[2533]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2533]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2534]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2535]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2536]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2537]! } - public var Conversation_ContextMenuMore: String { return self._s[2538]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2539]! } - public var CallSettings_TabIcon: String { return self._s[2540]! } - public var KeyCommand_Find: String { return self._s[2541]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2542]! } - public var Message_PinnedGame: String { return self._s[2543]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2544]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2546]! } - public var Login_CallRequestState2: String { return self._s[2548]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2550]! } + public var Passport_PasswordDescription: String { return self._s[2534]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2535]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2536]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2537]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2538]! } + public var Conversation_ContextMenuMore: String { return self._s[2539]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2540]! } + public var CallSettings_TabIcon: String { return self._s[2541]! } + public var KeyCommand_Find: String { return self._s[2542]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2543]! } + public var Message_PinnedGame: String { return self._s[2544]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2545]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2547]! } + public var Login_CallRequestState2: String { return self._s[2549]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2551]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2551]!, self._r[2551]!, [_0]) + return formatWithArgumentRanges(self._s[2552]!, self._r[2552]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) + return formatWithArgumentRanges(self._s[2554]!, self._r[2554]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2554]! } - public var Conversation_InstantPagePreview: String { return self._s[2555]! } + public var WallpaperPreview_Blurred: String { return self._s[2555]! } + public var Conversation_InstantPagePreview: String { return self._s[2556]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_0]) + return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2559]! } - public var WallpaperSearch_ColorRed: String { return self._s[2560]! } - public var GroupPermission_NoPinMessages: String { return self._s[2561]! } - public var Passport_Language_es: String { return self._s[2562]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2564]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2565]! } + public var SecretTimer_VideoDescription: String { return self._s[2560]! } + public var WallpaperSearch_ColorRed: String { return self._s[2561]! } + public var GroupPermission_NoPinMessages: String { return self._s[2562]! } + public var Passport_Language_es: String { return self._s[2563]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2565]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2566]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2567]!, self._r[2567]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2567]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2568]! } - public var Watch_UserInfo_Unmute: String { return self._s[2569]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2570]! } - public var AccessDenied_CameraRestricted: String { return self._s[2572]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2568]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2569]! } + public var Watch_UserInfo_Unmute: String { return self._s[2570]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2571]! } + public var AccessDenied_CameraRestricted: String { return self._s[2573]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2573]!, self._r[2573]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2574]!, self._r[2574]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2575]! } - public var Settings_CopyUsername: String { return self._s[2576]! } - public var Contacts_SearchLabel: String { return self._s[2577]! } - public var Map_OpenInYandexNavigator: String { return self._s[2579]! } - public var PasscodeSettings_EncryptData: String { return self._s[2580]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2581]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2582]! } - public var DialogList_AdNoticeAlert: String { return self._s[2583]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2585]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2586]! } - public var Localization_LanguageCustom: String { return self._s[2587]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2588]! } - public var CallFeedback_Title: String { return self._s[2589]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2592]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2593]! } - public var Conversation_InfoGroup: String { return self._s[2594]! } - public var Compose_NewMessage: String { return self._s[2595]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2596]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2597]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2598]! } + public var ChatList_ReadAll: String { return self._s[2576]! } + public var Settings_CopyUsername: String { return self._s[2577]! } + public var Contacts_SearchLabel: String { return self._s[2578]! } + public var Map_OpenInYandexNavigator: String { return self._s[2580]! } + public var PasscodeSettings_EncryptData: String { return self._s[2581]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2582]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2583]! } + public var DialogList_AdNoticeAlert: String { return self._s[2584]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2586]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2587]! } + public var Localization_LanguageCustom: String { return self._s[2588]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2589]! } + public var CallFeedback_Title: String { return self._s[2590]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2593]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2594]! } + public var Conversation_InfoGroup: String { return self._s[2595]! } + public var Compose_NewMessage: String { return self._s[2596]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2597]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2598]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2599]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2599]!, self._r[2599]!, [_0]) + return formatWithArgumentRanges(self._s[2600]!, self._r[2600]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2600]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2601]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2602]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2603]! } - public var Channel_BlackList_Title: String { return self._s[2604]! } - public var UserInfo_PhoneCall: String { return self._s[2605]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2607]! } - public var State_connecting: String { return self._s[2608]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2609]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2601]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2602]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2603]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2604]! } + public var Channel_BlackList_Title: String { return self._s[2605]! } + public var UserInfo_PhoneCall: String { return self._s[2606]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2608]! } + public var State_connecting: String { return self._s[2609]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2610]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_0]) + return formatWithArgumentRanges(self._s[2611]!, self._r[2611]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2611]! } - public var Passport_Identity_EditPassport: String { return self._s[2612]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2614]! } - public var Localization_EnglishLanguageName: String { return self._s[2615]! } - public var Share_AuthDescription: String { return self._s[2616]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2617]! } - public var Passport_Identity_Surname: String { return self._s[2618]! } - public var Compose_TokenListPlaceholder: String { return self._s[2619]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2620]! } - public var Settings_AboutEmpty: String { return self._s[2621]! } - public var Conversation_Unmute: String { return self._s[2622]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2624]! } + public var Notifications_GroupNotifications: String { return self._s[2612]! } + public var Passport_Identity_EditPassport: String { return self._s[2613]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2615]! } + public var Localization_EnglishLanguageName: String { return self._s[2616]! } + public var Share_AuthDescription: String { return self._s[2617]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2618]! } + public var Passport_Identity_Surname: String { return self._s[2619]! } + public var Compose_TokenListPlaceholder: String { return self._s[2620]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2621]! } + public var Settings_AboutEmpty: String { return self._s[2622]! } + public var Conversation_Unmute: String { return self._s[2623]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2625]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_1]) + return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2626]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2628]! } - public var ChatSettings_Appearance: String { return self._s[2629]! } - public var Appearance_PickAccentColor: String { return self._s[2630]! } + public var Login_CodeSentCall: String { return self._s[2627]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2629]! } + public var ChatSettings_Appearance: String { return self._s[2630]! } + public var Appearance_PickAccentColor: String { return self._s[2631]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1]) + return formatWithArgumentRanges(self._s[2633]!, self._r[2633]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2633]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2634]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2635]! } - public var ChatAdmins_AdminLabel: String { return self._s[2637]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2638]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2640]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2641]! } - public var Month_GenJune: String { return self._s[2642]! } - public var Watch_Location_Current: String { return self._s[2643]! } - public var Conversation_TitleMute: String { return self._s[2644]! } + public var Notification_CallMissed: String { return self._s[2634]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2635]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2636]! } + public var ChatAdmins_AdminLabel: String { return self._s[2638]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2639]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2641]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2642]! } + public var Month_GenJune: String { return self._s[2643]! } + public var Watch_Location_Current: String { return self._s[2644]! } + public var Conversation_TitleMute: String { return self._s[2645]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_1]) + return formatWithArgumentRanges(self._s[2646]!, self._r[2646]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2646]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2647]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_0]) + return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2648]! } - public var Chat_SlowmodeSendError: String { return self._s[2649]! } - public var MaskStickerSettings_Info: String { return self._s[2650]! } + public var Call_ReportPlaceholder: String { return self._s[2649]! } + public var Chat_SlowmodeSendError: String { return self._s[2650]! } + public var MaskStickerSettings_Info: String { return self._s[2651]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2651]!, self._r[2651]!, [_0]) + return formatWithArgumentRanges(self._s[2652]!, self._r[2652]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2652]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2654]! } - public var Contacts_ShareTelegram: String { return self._s[2655]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2656]! } - public var Channel_ErrorAccessDenied: String { return self._s[2657]! } - public var UserInfo_ScamBotWarning: String { return self._s[2659]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2660]! } - public var Call_ConnectionErrorTitle: String { return self._s[2661]! } - public var UserInfo_NotificationsEnable: String { return self._s[2662]! } - public var ArchivedChats_IntroText1: String { return self._s[2663]! } - public var Tour_Text4: String { return self._s[2666]! } - public var WallpaperSearch_Recent: String { return self._s[2667]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2668]! } - public var Profile_MessageLifetime2s: String { return self._s[2670]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2671]! } - public var Notification_MessageLifetime2s: String { return self._s[2672]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2653]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2655]! } + public var Contacts_ShareTelegram: String { return self._s[2656]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2657]! } + public var Channel_ErrorAccessDenied: String { return self._s[2658]! } + public var UserInfo_ScamBotWarning: String { return self._s[2660]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2661]! } + public var Call_ConnectionErrorTitle: String { return self._s[2662]! } + public var UserInfo_NotificationsEnable: String { return self._s[2663]! } + public var ArchivedChats_IntroText1: String { return self._s[2664]! } + public var Tour_Text4: String { return self._s[2667]! } + public var WallpaperSearch_Recent: String { return self._s[2668]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2669]! } + public var Profile_MessageLifetime2s: String { return self._s[2671]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2672]! } + public var Notification_MessageLifetime2s: String { return self._s[2673]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2673]!, self._r[2673]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2674]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2675]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2676]! } + public var Cache_ClearCache: String { return self._s[2675]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2676]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2677]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_0]) + return formatWithArgumentRanges(self._s[2681]!, self._r[2681]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2682]!, self._r[2682]!, [_0]) + return formatWithArgumentRanges(self._s[2683]!, self._r[2683]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2683]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2684]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2685]! } - public var ChatList_UnarchiveAction: String { return self._s[2686]! } - public var AutoNightTheme_Title: String { return self._s[2687]! } - public var InstantPage_FeedbackButton: String { return self._s[2688]! } - public var Passport_FieldAddress: String { return self._s[2689]! } + public var LocalGroup_Text: String { return self._s[2684]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2685]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2686]! } + public var ChatList_UnarchiveAction: String { return self._s[2687]! } + public var AutoNightTheme_Title: String { return self._s[2688]! } + public var InstantPage_FeedbackButton: String { return self._s[2689]! } + public var Passport_FieldAddress: String { return self._s[2690]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2691]!, self._r[2691]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2691]! } + public var Month_ShortMarch: String { return self._s[2692]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2692]!, self._r[2692]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2693]!, self._r[2693]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2693]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2694]! } - public var Passport_FloodError: String { return self._s[2695]! } - public var SecretGif_Title: String { return self._s[2696]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2697]! } - public var Passport_Language_th: String { return self._s[2699]! } - public var Passport_Address_Address: String { return self._s[2700]! } - public var Login_InvalidLastNameError: String { return self._s[2701]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2702]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2703]! } - public var SettingsSearch_FAQ: String { return self._s[2704]! } - public var ShareMenu_Send: String { return self._s[2705]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2707]! } - public var Month_GenNovember: String { return self._s[2709]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2711]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2694]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2695]! } + public var Passport_FloodError: String { return self._s[2696]! } + public var SecretGif_Title: String { return self._s[2697]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2698]! } + public var Passport_Language_th: String { return self._s[2700]! } + public var Passport_Address_Address: String { return self._s[2701]! } + public var Login_InvalidLastNameError: String { return self._s[2702]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2703]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2704]! } + public var SettingsSearch_FAQ: String { return self._s[2705]! } + public var ShareMenu_Send: String { return self._s[2706]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2708]! } + public var Month_GenNovember: String { return self._s[2710]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2712]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2712]!, self._r[2712]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2713]!, self._r[2713]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2713]! } - public var NotificationsSound_Tritone: String { return self._s[2714]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2716]! } + public var Checkout_Email: String { return self._s[2714]! } + public var NotificationsSound_Tritone: String { return self._s[2715]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2717]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1]) + return formatWithArgumentRanges(self._s[2720]!, self._r[2720]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2720]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2721]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2722]!, self._r[2722]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2722]! } - public var Notification_Exceptions_Add: String { return self._s[2723]! } - public var DialogList_You: String { return self._s[2724]! } - public var MediaPicker_Send: String { return self._s[2727]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2728]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2729]! } - public var Call_AudioRouteSpeaker: String { return self._s[2730]! } - public var Appearance_CreateThemeInfo: String { return self._s[2731]! } - public var Watch_UserInfo_Title: String { return self._s[2732]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2733]! } - public var Appearance_AccentColor: String { return self._s[2734]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2723]! } + public var Notification_Exceptions_Add: String { return self._s[2724]! } + public var DialogList_You: String { return self._s[2725]! } + public var MediaPicker_Send: String { return self._s[2728]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2729]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2730]! } + public var Call_AudioRouteSpeaker: String { return self._s[2731]! } + public var Appearance_CreateThemeInfo: String { return self._s[2732]! } + public var Watch_UserInfo_Title: String { return self._s[2733]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2734]! } + public var Appearance_AccentColor: String { return self._s[2735]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2735]!, self._r[2735]!, [_0]) + return formatWithArgumentRanges(self._s[2736]!, self._r[2736]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2736]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2737]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2737]!, self._r[2737]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2738]!, self._r[2738]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2738]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2739]! } - public var Notification_CallOutgoing: String { return self._s[2740]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2741]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2742]! } - public var Call_RecordingDisabledMessage: String { return self._s[2743]! } - public var Message_Game: String { return self._s[2744]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2745]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2746]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2747]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2748]! } - public var Date_DialogDateFormat: String { return self._s[2749]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2750]! } - public var Notifications_InAppNotifications: String { return self._s[2751]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2739]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2740]! } + public var Notification_CallOutgoing: String { return self._s[2741]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2742]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2743]! } + public var Call_RecordingDisabledMessage: String { return self._s[2744]! } + public var Message_Game: String { return self._s[2745]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2746]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2747]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2748]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2749]! } + public var Date_DialogDateFormat: String { return self._s[2750]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2751]! } + public var Notifications_InAppNotifications: String { return self._s[2752]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2752]!, self._r[2752]!, [_0]) + return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2754]! } + public var NewContact_Title: String { return self._s[2755]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2755]!, self._r[2755]!, [_0]) + return formatWithArgumentRanges(self._s[2756]!, self._r[2756]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2756]! } + public var Conversation_ViewContactDetails: String { return self._s[2757]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2758]!, self._r[2758]!, [_1]) + return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2759]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2760]! } - public var PrivacySettings_Title: String { return self._s[2761]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2764]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2765]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2766]! } - public var Contacts_PhoneNumber: String { return self._s[2767]! } - public var Map_ShowPlaces: String { return self._s[2769]! } - public var ChatAdmins_Title: String { return self._s[2770]! } - public var InstantPage_Reference: String { return self._s[2772]! } - public var ReportGroupLocation_Text: String { return self._s[2773]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2760]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2761]! } + public var PrivacySettings_Title: String { return self._s[2762]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2765]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2766]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2767]! } + public var Contacts_PhoneNumber: String { return self._s[2768]! } + public var Map_ShowPlaces: String { return self._s[2770]! } + public var ChatAdmins_Title: String { return self._s[2771]! } + public var InstantPage_Reference: String { return self._s[2773]! } + public var ReportGroupLocation_Text: String { return self._s[2774]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2774]!, self._r[2774]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2775]!, self._r[2775]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2775]! } - public var Watch_UserInfo_Block: String { return self._s[2776]! } - public var ChatSettings_Stickers: String { return self._s[2777]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2778]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2779]! } + public var Camera_FlashOff: String { return self._s[2776]! } + public var Watch_UserInfo_Block: String { return self._s[2777]! } + public var ChatSettings_Stickers: String { return self._s[2778]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2779]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2780]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2780]!, self._r[2780]!, [_0]) + return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2781]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2782]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2783]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2784]! } - public var VoiceOver_MessageContextShare: String { return self._s[2785]! } - public var CreateTheme_Title: String { return self._s[2787]! } + public var Settings_ViewPhoto: String { return self._s[2782]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2783]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2784]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2785]! } + public var VoiceOver_MessageContextShare: String { return self._s[2786]! } + public var CreateTheme_Title: String { return self._s[2788]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2788]!, self._r[2788]!, [_0]) + return formatWithArgumentRanges(self._s[2789]!, self._r[2789]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2789]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2790]! } + public var Privacy_DeleteDrafts: String { return self._s[2790]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2791]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2791]!, self._r[2791]!, [_0]) + return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2792]! } - public var DialogList_SavedMessages: String { return self._s[2793]! } - public var GroupInfo_UpgradeButton: String { return self._s[2794]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2796]! } - public var DialogList_Pin: String { return self._s[2797]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2793]! } + public var DialogList_SavedMessages: String { return self._s[2794]! } + public var GroupInfo_UpgradeButton: String { return self._s[2795]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2797]! } + public var DialogList_Pin: String { return self._s[2798]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2798]!, self._r[2798]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2799]!, self._r[2799]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2799]!, self._r[2799]!, [_0]) + return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2800]! } - public var UserInfo_NotificationsDisable: String { return self._s[2801]! } - public var Paint_Outlined: String { return self._s[2802]! } - public var Activity_PlayingGame: String { return self._s[2803]! } - public var SearchImages_NoImagesFound: String { return self._s[2804]! } - public var SocksProxySetup_ProxyType: String { return self._s[2805]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2807]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2808]! } - public var Settings_AppLanguage: String { return self._s[2809]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2810]! } - public var Common_ChoosePhoto: String { return self._s[2811]! } - public var CallFeedback_ReasonEcho: String { return self._s[2812]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2801]! } + public var UserInfo_NotificationsDisable: String { return self._s[2802]! } + public var Paint_Outlined: String { return self._s[2803]! } + public var Activity_PlayingGame: String { return self._s[2804]! } + public var SearchImages_NoImagesFound: String { return self._s[2805]! } + public var SocksProxySetup_ProxyType: String { return self._s[2806]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2808]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2809]! } + public var Settings_AppLanguage: String { return self._s[2810]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2811]! } + public var Common_ChoosePhoto: String { return self._s[2812]! } + public var CallFeedback_ReasonEcho: String { return self._s[2813]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2813]!, self._r[2813]!, [_1]) + return formatWithArgumentRanges(self._s[2814]!, self._r[2814]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2814]! } - public var Activity_UploadingVideo: String { return self._s[2815]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2816]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2817]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2818]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2819]! } - public var Checkout_PayWithTouchId: String { return self._s[2820]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2821]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2815]! } + public var Activity_UploadingVideo: String { return self._s[2816]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2817]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2818]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2819]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2820]! } + public var Checkout_PayWithTouchId: String { return self._s[2821]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2822]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2823]!, self._r[2823]!, [_1]) + return formatWithArgumentRanges(self._s[2824]!, self._r[2824]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2824]! } + public var Notifications_ExceptionsNone: String { return self._s[2825]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2825]!, self._r[2825]!, [_0]) + return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_1]) + return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2828]! } - public var Passport_Address_Region: String { return self._s[2831]! } - public var ChatList_DeleteChat: String { return self._s[2832]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2833]! } - public var PhotoEditor_TiltShift: String { return self._s[2834]! } - public var Settings_FAQ_URL: String { return self._s[2835]! } - public var Passport_Language_sl: String { return self._s[2836]! } - public var Settings_PrivacySettings: String { return self._s[2838]! } - public var SharedMedia_TitleLink: String { return self._s[2839]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2840]! } - public var Settings_SetProfilePhoto: String { return self._s[2841]! } - public var Channel_About_Help: String { return self._s[2842]! } - public var Contacts_PermissionsEnable: String { return self._s[2843]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2844]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2845]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2847]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2848]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2849]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2850]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2851]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2853]! } - public var Map_OpenInYandexMaps: String { return self._s[2855]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2856]! } - public var VoiceOver_MessageContextReply: String { return self._s[2857]! } - public var PhotoEditor_SaturationTool: String { return self._s[2858]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2829]! } + public var Passport_Address_Region: String { return self._s[2832]! } + public var ChatList_DeleteChat: String { return self._s[2833]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2834]! } + public var PhotoEditor_TiltShift: String { return self._s[2835]! } + public var Settings_FAQ_URL: String { return self._s[2836]! } + public var Passport_Language_sl: String { return self._s[2837]! } + public var Settings_PrivacySettings: String { return self._s[2839]! } + public var SharedMedia_TitleLink: String { return self._s[2840]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2841]! } + public var Settings_SetProfilePhoto: String { return self._s[2842]! } + public var Channel_About_Help: String { return self._s[2843]! } + public var Contacts_PermissionsEnable: String { return self._s[2844]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2845]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2846]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2848]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2849]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2850]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2851]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2852]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2854]! } + public var Map_OpenInYandexMaps: String { return self._s[2856]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2857]! } + public var VoiceOver_MessageContextReply: String { return self._s[2858]! } + public var PhotoEditor_SaturationTool: String { return self._s[2859]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2860]!, self._r[2860]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2860]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2861]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2862]! } - public var Appearance_TextSize: String { return self._s[2863]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2861]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2862]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2863]! } + public var Appearance_TextSize: String { return self._s[2864]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2864]!, self._r[2864]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2865]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2867]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2866]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2868]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2868]!, self._r[2868]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2870]!, self._r[2870]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2870]! } - public var Passport_PassportInformation: String { return self._s[2873]! } - public var WatchRemote_AlertTitle: String { return self._s[2874]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2875]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2877]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2871]! } + public var Passport_PassportInformation: String { return self._s[2874]! } + public var WatchRemote_AlertTitle: String { return self._s[2875]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2876]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2878]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_1]) + return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2880]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2882]! } - public var AccessDenied_CameraDisabled: String { return self._s[2883]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2881]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2883]! } + public var AccessDenied_CameraDisabled: String { return self._s[2884]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2884]!, self._r[2884]!, [_0]) + return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2887]! } + public var PhotoEditor_ContrastTool: String { return self._s[2888]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2888]!, self._r[2888]!, [_1]) + return formatWithArgumentRanges(self._s[2889]!, self._r[2889]!, [_1]) } - public var DialogList_Draft: String { return self._s[2889]! } - public var Privacy_TopPeersDelete: String { return self._s[2891]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2892]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2893]! } - public var WebSearch_RecentSectionClear: String { return self._s[2894]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2896]! } - public var Common_Done: String { return self._s[2898]! } - public var AuthSessions_EmptyText: String { return self._s[2899]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2900]! } - public var Tour_Title5: String { return self._s[2901]! } + public var DialogList_Draft: String { return self._s[2890]! } + public var Privacy_TopPeersDelete: String { return self._s[2892]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2893]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2894]! } + public var WebSearch_RecentSectionClear: String { return self._s[2895]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2897]! } + public var Common_Done: String { return self._s[2899]! } + public var AuthSessions_EmptyText: String { return self._s[2900]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2901]! } + public var Tour_Title5: String { return self._s[2902]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2902]!, self._r[2902]!, [_0]) + return formatWithArgumentRanges(self._s[2903]!, self._r[2903]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2903]! } - public var Conversation_LinkDialogSave: String { return self._s[2904]! } - public var GroupInfo_ActionRestrict: String { return self._s[2905]! } - public var Checkout_Title: String { return self._s[2906]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2908]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2910]! } - public var Notification_RenamedGroup: String { return self._s[2911]! } - public var PeopleNearby_Groups: String { return self._s[2912]! } - public var Checkout_PayWithFaceId: String { return self._s[2913]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2914]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2916]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2917]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2918]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2904]! } + public var Conversation_LinkDialogSave: String { return self._s[2905]! } + public var GroupInfo_ActionRestrict: String { return self._s[2906]! } + public var Checkout_Title: String { return self._s[2907]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2909]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2911]! } + public var Notification_RenamedGroup: String { return self._s[2912]! } + public var PeopleNearby_Groups: String { return self._s[2913]! } + public var Checkout_PayWithFaceId: String { return self._s[2914]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2915]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2917]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2918]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2919]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_0]) + return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2921]! } + public var Profile_AddToExisting: String { return self._s[2922]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2924]! } - public var Permissions_PrivacyPolicy: String { return self._s[2925]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2926]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2927]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2929]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2931]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2932]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2933]! } - public var VoiceOver_AttachMedia: String { return self._s[2935]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2936]! } + public var Cache_Files: String { return self._s[2925]! } + public var Permissions_PrivacyPolicy: String { return self._s[2926]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2927]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2928]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2930]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2932]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2933]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2934]! } + public var VoiceOver_AttachMedia: String { return self._s[2936]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2937]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2937]!, self._r[2937]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2938]!, self._r[2938]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2938]! } - public var Conversation_SetReminder_Title: String { return self._s[2939]! } - public var Passport_FieldAddressHelp: String { return self._s[2940]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2941]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2939]! } + public var Conversation_SetReminder_Title: String { return self._s[2940]! } + public var Passport_FieldAddressHelp: String { return self._s[2941]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2942]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2942]!, self._r[2942]!, [_0]) + return formatWithArgumentRanges(self._s[2943]!, self._r[2943]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2943]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2945]! } - public var Login_UnknownError: String { return self._s[2946]! } - public var Group_UpgradeNoticeText2: String { return self._s[2948]! } - public var Watch_Compose_AddContact: String { return self._s[2949]! } - public var Web_Error: String { return self._s[2950]! } - public var Gif_Search: String { return self._s[2951]! } - public var Profile_MessageLifetime1h: String { return self._s[2952]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2953]! } - public var Channel_Username_CheckingUsername: String { return self._s[2954]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2955]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2956]! } - public var Channel_AboutItem: String { return self._s[2957]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2959]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2960]! } - public var GroupInfo_SharedMedia: String { return self._s[2961]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2944]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2946]! } + public var Login_UnknownError: String { return self._s[2947]! } + public var Group_UpgradeNoticeText2: String { return self._s[2949]! } + public var Watch_Compose_AddContact: String { return self._s[2950]! } + public var Web_Error: String { return self._s[2951]! } + public var Gif_Search: String { return self._s[2952]! } + public var Profile_MessageLifetime1h: String { return self._s[2953]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2954]! } + public var Channel_Username_CheckingUsername: String { return self._s[2955]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2956]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2957]! } + public var Channel_AboutItem: String { return self._s[2958]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2960]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2961]! } + public var GroupInfo_SharedMedia: String { return self._s[2962]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2962]!, self._r[2962]!, [_1]) + return formatWithArgumentRanges(self._s[2963]!, self._r[2963]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2963]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2964]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2964]!, self._r[2964]!, [_1]) + return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2965]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2966]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2967]! } - public var CreatePoll_AddOption: String { return self._s[2968]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2969]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2970]! } - public var Channel_Management_AddModerator: String { return self._s[2971]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2972]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2973]! } - public var NotificationsSound_Hello: String { return self._s[2974]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2975]! } - public var Channel_Stickers_Placeholder: String { return self._s[2977]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2966]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2967]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2968]! } + public var CreatePoll_AddOption: String { return self._s[2969]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2970]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2971]! } + public var Channel_Management_AddModerator: String { return self._s[2972]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2973]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2974]! } + public var NotificationsSound_Hello: String { return self._s[2975]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2976]! } + public var Channel_Stickers_Placeholder: String { return self._s[2978]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2978]!, self._r[2978]!, [_0]) + return formatWithArgumentRanges(self._s[2979]!, self._r[2979]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2979]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2980]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2981]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2982]! } - public var AutoDownloadSettings_Channels: String { return self._s[2983]! } - public var Passport_Language_mn: String { return self._s[2984]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2987]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2988]! } - public var Passport_Language_ja: String { return self._s[2990]! } - public var Settings_About_Title: String { return self._s[2991]! } - public var Settings_NotificationsAndSounds: String { return self._s[2992]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2993]! } - public var Settings_BlockedUsers: String { return self._s[2994]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2980]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2981]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2982]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2983]! } + public var AutoDownloadSettings_Channels: String { return self._s[2984]! } + public var Passport_Language_mn: String { return self._s[2985]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2988]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2989]! } + public var Passport_Language_ja: String { return self._s[2991]! } + public var Settings_About_Title: String { return self._s[2992]! } + public var Settings_NotificationsAndSounds: String { return self._s[2993]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2994]! } + public var Settings_BlockedUsers: String { return self._s[2995]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2995]!, self._r[2995]!, [_0]) + return formatWithArgumentRanges(self._s[2996]!, self._r[2996]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2996]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2997]! } - public var Channel_Username_Title: String { return self._s[2998]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2997]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2998]! } + public var Channel_Username_Title: String { return self._s[2999]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_0]) + return formatWithArgumentRanges(self._s[3000]!, self._r[3000]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3001]! } - public var AppleWatch_Title: String { return self._s[3002]! } - public var Activity_RecordingVideoMessage: String { return self._s[3003]! } + public var AttachmentMenu_File: String { return self._s[3002]! } + public var AppleWatch_Title: String { return self._s[3003]! } + public var Activity_RecordingVideoMessage: String { return self._s[3004]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3004]!, self._r[3004]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3005]!, self._r[3005]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3005]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3006]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3007]! } - public var Common_Next: String { return self._s[3009]! } - public var Channel_Stickers_YourStickers: String { return self._s[3011]! } - public var Call_AudioRouteHeadphones: String { return self._s[3012]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3014]! } - public var Watch_Contacts_NoResults: String { return self._s[3016]! } - public var PhotoEditor_TintTool: String { return self._s[3019]! } - public var LoginPassword_ResetAccount: String { return self._s[3021]! } - public var Settings_SavedMessages: String { return self._s[3022]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3023]! } - public var Bot_GenericSupportStatus: String { return self._s[3024]! } - public var StickerPack_Add: String { return self._s[3025]! } - public var Checkout_TotalAmount: String { return self._s[3026]! } - public var Your_cards_number_is_invalid: String { return self._s[3027]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3028]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3029]! } + public var Weekday_Saturday: String { return self._s[3006]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3007]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3008]! } + public var Common_Next: String { return self._s[3010]! } + public var Channel_Stickers_YourStickers: String { return self._s[3012]! } + public var Call_AudioRouteHeadphones: String { return self._s[3013]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3015]! } + public var Watch_Contacts_NoResults: String { return self._s[3017]! } + public var PhotoEditor_TintTool: String { return self._s[3020]! } + public var LoginPassword_ResetAccount: String { return self._s[3022]! } + public var Settings_SavedMessages: String { return self._s[3023]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3024]! } + public var Bot_GenericSupportStatus: String { return self._s[3025]! } + public var StickerPack_Add: String { return self._s[3026]! } + public var Checkout_TotalAmount: String { return self._s[3027]! } + public var Your_cards_number_is_invalid: String { return self._s[3028]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3029]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3030]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0]) + return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3032]!, self._r[3032]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3032]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3033]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_0]) + return formatWithArgumentRanges(self._s[3036]!, self._r[3036]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3036]! } - public var StickerPack_Share: String { return self._s[3037]! } - public var Passport_DeleteAddress: String { return self._s[3038]! } - public var Settings_Passport: String { return self._s[3039]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3040]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3041]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3042]! } - public var Contacts_PermissionsText: String { return self._s[3043]! } - public var Group_Setup_HistoryVisible: String { return self._s[3044]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3046]! } - public var SocksProxySetup_Title: String { return self._s[3047]! } - public var Notification_Mute1h: String { return self._s[3048]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3037]! } + public var StickerPack_Share: String { return self._s[3038]! } + public var Passport_DeleteAddress: String { return self._s[3039]! } + public var Settings_Passport: String { return self._s[3040]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3041]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3042]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3043]! } + public var Contacts_PermissionsText: String { return self._s[3044]! } + public var Group_Setup_HistoryVisible: String { return self._s[3045]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3047]! } + public var SocksProxySetup_Title: String { return self._s[3048]! } + public var Notification_Mute1h: String { return self._s[3049]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0]) + return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3050]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3051]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3051]!, self._r[3051]!, [_1]) + return formatWithArgumentRanges(self._s[3052]!, self._r[3052]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3052]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3055]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3057]! } - public var DialogList_NoMessagesText: String { return self._s[3058]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3059]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3060]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3062]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3063]! } - public var Common_TakePhotoOrVideo: String { return self._s[3064]! } - public var Call_StatusBusy: String { return self._s[3065]! } - public var Conversation_PinnedMessage: String { return self._s[3066]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3067]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3068]! } - public var Undo_ChatCleared: String { return self._s[3069]! } - public var AppleWatch_ReplyPresets: String { return self._s[3070]! } - public var Passport_DiscardMessageDescription: String { return self._s[3072]! } - public var Login_NetworkError: String { return self._s[3073]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3053]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3056]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3058]! } + public var DialogList_NoMessagesText: String { return self._s[3059]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3060]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3061]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3063]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3064]! } + public var Common_TakePhotoOrVideo: String { return self._s[3065]! } + public var Call_StatusBusy: String { return self._s[3066]! } + public var Conversation_PinnedMessage: String { return self._s[3067]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3068]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3069]! } + public var Undo_ChatCleared: String { return self._s[3070]! } + public var AppleWatch_ReplyPresets: String { return self._s[3071]! } + public var Passport_DiscardMessageDescription: String { return self._s[3073]! } + public var Login_NetworkError: String { return self._s[3074]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3074]!, self._r[3074]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3076]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3078]! } + public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3076]!, self._r[3076]!, [_0]) + } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3077]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3079]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_0]) + return formatWithArgumentRanges(self._s[3081]!, self._r[3081]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3081]! } - public var VoiceOver_Chat_Music: String { return self._s[3082]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3083]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3085]! } - public var ConversationMedia_Title: String { return self._s[3086]! } - public var EncryptionKey_Title: String { return self._s[3088]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3089]! } - public var Notification_Exceptions_AddException: String { return self._s[3090]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3091]! } - public var Profile_MessageLifetime1m: String { return self._s[3092]! } + public var Call_ConnectionErrorMessage: String { return self._s[3082]! } + public var VoiceOver_Chat_Music: String { return self._s[3083]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3084]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3086]! } + public var ConversationMedia_Title: String { return self._s[3087]! } + public var EncryptionKey_Title: String { return self._s[3089]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3090]! } + public var Notification_Exceptions_AddException: String { return self._s[3091]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3092]! } + public var Profile_MessageLifetime1m: String { return self._s[3093]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3093]!, self._r[3093]!, [_1]) + return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_1]) } - public var Month_GenMay: String { return self._s[3094]! } + public var Month_GenMay: String { return self._s[3095]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_0]) + return formatWithArgumentRanges(self._s[3096]!, self._r[3096]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3096]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3097]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3098]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3100]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3101]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3102]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3103]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3104]! } - public var Channel_JoinChannel: String { return self._s[3106]! } - public var Appearance_Animations: String { return self._s[3109]! } + public var PeopleNearby_Users: String { return self._s[3097]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3098]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3099]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3101]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3102]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3103]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3104]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3105]! } + public var Channel_JoinChannel: String { return self._s[3107]! } + public var Appearance_Animations: String { return self._s[3110]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3110]!, self._r[3110]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3112]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3114]! } - public var Passport_Address_Street: String { return self._s[3115]! } - public var Conversation_AddContact: String { return self._s[3116]! } - public var Login_PhonePlaceholder: String { return self._s[3117]! } - public var Channel_Members_InviteLink: String { return self._s[3119]! } - public var Bot_Stop: String { return self._s[3120]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3122]! } - public var Notification_PassportValueAddress: String { return self._s[3123]! } - public var Month_ShortJuly: String { return self._s[3124]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3125]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3126]! } - public var Passport_Identity_ReverseSide: String { return self._s[3127]! } - public var Watch_Stickers_Recents: String { return self._s[3130]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3132]! } - public var Map_SendThisLocation: String { return self._s[3133]! } + public var Stickers_GroupStickers: String { return self._s[3113]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3115]! } + public var Passport_Address_Street: String { return self._s[3116]! } + public var Conversation_AddContact: String { return self._s[3117]! } + public var Login_PhonePlaceholder: String { return self._s[3118]! } + public var Channel_Members_InviteLink: String { return self._s[3120]! } + public var Bot_Stop: String { return self._s[3121]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3123]! } + public var Notification_PassportValueAddress: String { return self._s[3124]! } + public var Month_ShortJuly: String { return self._s[3125]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3126]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3127]! } + public var Passport_Identity_ReverseSide: String { return self._s[3128]! } + public var Watch_Stickers_Recents: String { return self._s[3131]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3133]! } + public var Map_SendThisLocation: String { return self._s[3134]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3136]! } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3137]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3137]!, self._r[3137]!, [_0]) + return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3138]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3139]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3141]! } - public var Wallpaper_SearchShort: String { return self._s[3142]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3144]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3145]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3146]! } + public var Login_CallRequestState3: String { return self._s[3142]! } + public var Wallpaper_SearchShort: String { return self._s[3143]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3145]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3146]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3147]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3147]!, self._r[3147]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3148]!, self._r[3148]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3148]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3152]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3149]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3153]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3153]!, self._r[3153]!, [_0]) + return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3154]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3155]! } + public var Passport_CorrectErrors: String { return self._s[3155]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3156]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_0]) + return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3157]! } - public var Channel_DiscussionGroup: String { return self._s[3158]! } + public var Map_SendMyCurrentLocation: String { return self._s[3158]! } + public var Channel_DiscussionGroup: String { return self._s[3159]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3160]! } - public var Permissions_NotificationsText_v0: String { return self._s[3161]! } - public var Appearance_AppIcon: String { return self._s[3162]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3163]! } - public var LoginPassword_FloodError: String { return self._s[3164]! } - public var Appearance_Publish: String { return self._s[3166]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3167]! } + public var SharedMedia_SearchNoResults: String { return self._s[3161]! } + public var Permissions_NotificationsText_v0: String { return self._s[3162]! } + public var Appearance_AppIcon: String { return self._s[3163]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3164]! } + public var LoginPassword_FloodError: String { return self._s[3165]! } + public var Appearance_Publish: String { return self._s[3167]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3168]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3168]!, self._r[3168]!, [_0]) + return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3169]! } + public var Passport_Language_bn: String { return self._s[3170]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_0]) - } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_0]) } - public var CreateTheme_ShortLinkInfo: String { return self._s[3172]! } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_0]) + } + public var CreateTheme_ShortLinkInfo: String { return self._s[3173]! } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3173]!, self._r[3173]!, [_0]) + return formatWithArgumentRanges(self._s[3174]!, self._r[3174]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3176]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3178]! } - public var Contacts_PermissionsAllow: String { return self._s[3179]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3180]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3181]! } - public var WallpaperPreview_Pattern: String { return self._s[3182]! } - public var Paint_Duplicate: String { return self._s[3183]! } - public var Passport_Address_Country: String { return self._s[3184]! } - public var Notification_RenamedChannel: String { return self._s[3186]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3187]! } - public var Group_MessagePhotoUpdated: String { return self._s[3188]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3189]! } - public var Conversation_ContextMenuBan: String { return self._s[3190]! } - public var TwoStepAuth_EmailSent: String { return self._s[3191]! } - public var MessagePoll_NoVotes: String { return self._s[3192]! } - public var Passport_Language_is: String { return self._s[3193]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3195]! } - public var Tour_Text5: String { return self._s[3196]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3177]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3179]! } + public var Contacts_PermissionsAllow: String { return self._s[3180]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3181]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3182]! } + public var WallpaperPreview_Pattern: String { return self._s[3183]! } + public var Paint_Duplicate: String { return self._s[3184]! } + public var Passport_Address_Country: String { return self._s[3185]! } + public var Notification_RenamedChannel: String { return self._s[3187]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3188]! } + public var Group_MessagePhotoUpdated: String { return self._s[3189]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3190]! } + public var Conversation_ContextMenuBan: String { return self._s[3191]! } + public var TwoStepAuth_EmailSent: String { return self._s[3192]! } + public var MessagePoll_NoVotes: String { return self._s[3193]! } + public var Passport_Language_is: String { return self._s[3194]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3196]! } + public var Tour_Text5: String { return self._s[3197]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3199]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3200]! } + public var Undo_SecretChatDeleted: String { return self._s[3200]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3201]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3201]!, self._r[3201]!, [_0]) + return formatWithArgumentRanges(self._s[3202]!, self._r[3202]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3202]! } - public var Paint_Edit: String { return self._s[3204]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3206]! } - public var Undo_DeletedGroup: String { return self._s[3208]! } - public var LoginPassword_ForgotPassword: String { return self._s[3209]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3210]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3203]! } + public var Paint_Edit: String { return self._s[3205]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3207]! } + public var Undo_DeletedGroup: String { return self._s[3209]! } + public var LoginPassword_ForgotPassword: String { return self._s[3210]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3211]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3211]!, self._r[3211]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3212]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3213]! } - public var Passport_Language_uz: String { return self._s[3214]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3215]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3216]! } - public var Map_StopLiveLocation: String { return self._s[3218]! } - public var VoiceOver_MessageContextSend: String { return self._s[3220]! } - public var PasscodeSettings_Help: String { return self._s[3221]! } - public var NotificationsSound_Input: String { return self._s[3222]! } - public var Share_Title: String { return self._s[3225]! } - public var LogoutOptions_Title: String { return self._s[3226]! } - public var Login_TermsOfServiceAgree: String { return self._s[3227]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3228]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3229]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3230]! } - public var EnterPasscode_EnterTitle: String { return self._s[3231]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3213]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3214]! } + public var Passport_Language_uz: String { return self._s[3215]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3216]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3217]! } + public var Map_StopLiveLocation: String { return self._s[3219]! } + public var VoiceOver_MessageContextSend: String { return self._s[3221]! } + public var PasscodeSettings_Help: String { return self._s[3222]! } + public var NotificationsSound_Input: String { return self._s[3223]! } + public var Share_Title: String { return self._s[3226]! } + public var LogoutOptions_Title: String { return self._s[3227]! } + public var Login_TermsOfServiceAgree: String { return self._s[3228]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3229]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3230]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3231]! } + public var EnterPasscode_EnterTitle: String { return self._s[3232]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3232]!, self._r[3232]!, [_0]) + return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3233]! } - public var Conversation_AddToContacts: String { return self._s[3234]! } + public var Settings_CopyPhoneNumber: String { return self._s[3234]! } + public var Conversation_AddToContacts: String { return self._s[3235]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3235]!, self._r[3235]!, [_0]) + return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3236]! } + public var NotificationsSound_Keys: String { return self._s[3237]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_0]) + return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3238]! } - public var Message_Video: String { return self._s[3239]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3240]! } + public var Notification_MessageLifetime1w: String { return self._s[3239]! } + public var Message_Video: String { return self._s[3240]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3241]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_1]) + return formatWithArgumentRanges(self._s[3242]!, self._r[3242]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3244]!, self._r[3244]!, [_0]) - } - public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3245]!, self._r[3245]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3246]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3247]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3249]! } - public var PrivacyPolicy_Decline: String { return self._s[3250]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3251]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3252]! } - public var Permissions_SiriAllow_v0: String { return self._s[3254]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3255]! } + public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_0]) + } + public var Passport_Language_mk: String { return self._s[3247]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3248]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3250]! } + public var PrivacyPolicy_Decline: String { return self._s[3251]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3252]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3253]! } + public var Permissions_SiriAllow_v0: String { return self._s[3255]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3256]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3256]!, self._r[3256]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3257]!, self._r[3257]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3257]!, self._r[3257]!, [_0]) + return formatWithArgumentRanges(self._s[3258]!, self._r[3258]!, [_0]) } - public var Paint_Regular: String { return self._s[3258]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3259]! } - public var SocksProxySetup_ShareLink: String { return self._s[3260]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3261]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3263]! } - public var GroupInfo_InviteByLink: String { return self._s[3264]! } - public var MessageTimer_Custom: String { return self._s[3265]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3266]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3268]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3269]! } - public var VoiceOver_Chat_Selected: String { return self._s[3270]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3271]! } - public var Channel_Username_InvalidTaken: String { return self._s[3272]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3273]! } - public var Settings_ChatBackground: String { return self._s[3274]! } - public var Channel_Subscribers_Title: String { return self._s[3275]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3276]! } - public var Watch_ConnectionDescription: String { return self._s[3277]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3281]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3282]! } - public var EditProfile_Title: String { return self._s[3283]! } - public var NotificationsSound_Bamboo: String { return self._s[3285]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3287]! } - public var Login_SmsRequestState2: String { return self._s[3288]! } - public var Passport_Language_ar: String { return self._s[3289]! } + public var Paint_Regular: String { return self._s[3259]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3260]! } + public var SocksProxySetup_ShareLink: String { return self._s[3261]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3262]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3264]! } + public var GroupInfo_InviteByLink: String { return self._s[3265]! } + public var MessageTimer_Custom: String { return self._s[3266]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3267]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3269]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3270]! } + public var VoiceOver_Chat_Selected: String { return self._s[3271]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3272]! } + public var Channel_Username_InvalidTaken: String { return self._s[3273]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3274]! } + public var Settings_ChatBackground: String { return self._s[3275]! } + public var Channel_Subscribers_Title: String { return self._s[3276]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3277]! } + public var Watch_ConnectionDescription: String { return self._s[3278]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3282]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3283]! } + public var EditProfile_Title: String { return self._s[3284]! } + public var NotificationsSound_Bamboo: String { return self._s[3286]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3288]! } + public var Login_SmsRequestState2: String { return self._s[3289]! } + public var Passport_Language_ar: String { return self._s[3290]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3290]!, self._r[3290]!, [_0]) + return formatWithArgumentRanges(self._s[3291]!, self._r[3291]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3291]! } - public var Conversation_MessageDialogEdit: String { return self._s[3292]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3293]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3292]! } + public var Conversation_MessageDialogEdit: String { return self._s[3293]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3294]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3294]!, self._r[3294]!, [_1]) + return formatWithArgumentRanges(self._s[3295]!, self._r[3295]!, [_1]) } - public var Common_Close: String { return self._s[3295]! } - public var GroupInfo_PublicLink: String { return self._s[3296]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3297]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3298]! } + public var Common_Close: String { return self._s[3296]! } + public var GroupInfo_PublicLink: String { return self._s[3297]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3298]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3299]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_0]) + return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3303]! } + public var UserInfo_About_Placeholder: String { return self._s[3304]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_0]) + return formatWithArgumentRanges(self._s[3305]!, self._r[3305]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3305]! } - public var Channel_Info_Banned: String { return self._s[3307]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3306]! } + public var Channel_Info_Banned: String { return self._s[3308]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_0]) + return formatWithArgumentRanges(self._s[3309]!, self._r[3309]!, [_0]) } - public var Appearance_Other: String { return self._s[3309]! } - public var Passport_Language_my: String { return self._s[3310]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3311]! } + public var Appearance_Other: String { return self._s[3310]! } + public var Passport_Language_my: String { return self._s[3311]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3312]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3312]!, self._r[3312]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3313]!, self._r[3313]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3313]! } - public var Preview_CopyAddress: String { return self._s[3314]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3314]! } + public var Preview_CopyAddress: String { return self._s[3315]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3315]!, self._r[3315]!, [_0]) + return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3316]! } - public var UserInfo_BotSettings: String { return self._s[3317]! } - public var LiveLocation_MenuStopAll: String { return self._s[3319]! } - public var Passport_PasswordCreate: String { return self._s[3320]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3321]! } - public var Message_PinnedLocationMessage: String { return self._s[3322]! } - public var Map_Satellite: String { return self._s[3323]! } - public var Watch_Message_Unsupported: String { return self._s[3324]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3325]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3326]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3317]! } + public var UserInfo_BotSettings: String { return self._s[3318]! } + public var LiveLocation_MenuStopAll: String { return self._s[3320]! } + public var Passport_PasswordCreate: String { return self._s[3321]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3322]! } + public var Message_PinnedLocationMessage: String { return self._s[3323]! } + public var Map_Satellite: String { return self._s[3324]! } + public var Watch_Message_Unsupported: String { return self._s[3325]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3326]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3327]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3327]!, self._r[3327]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3328]!, self._r[3328]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3328]!, self._r[3328]!, [_0]) + return formatWithArgumentRanges(self._s[3329]!, self._r[3329]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3329]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3330]! } - public var NotificationsSound_None: String { return self._s[3331]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3333]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3334]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3330]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3331]! } + public var NotificationsSound_None: String { return self._s[3332]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3334]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3335]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3335]!, self._r[3335]!, [_1]) + return formatWithArgumentRanges(self._s[3336]!, self._r[3336]!, [_1]) } - public var Cache_Indexing: String { return self._s[3336]! } - public var DialogList_RecentTitlePeople: String { return self._s[3338]! } - public var DialogList_EncryptionRejected: String { return self._s[3339]! } - public var GroupInfo_Administrators: String { return self._s[3340]! } - public var Passport_ScanPassportHelp: String { return self._s[3341]! } - public var Application_Name: String { return self._s[3342]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3343]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3345]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3346]! } + public var Cache_Indexing: String { return self._s[3337]! } + public var DialogList_RecentTitlePeople: String { return self._s[3339]! } + public var DialogList_EncryptionRejected: String { return self._s[3340]! } + public var GroupInfo_Administrators: String { return self._s[3341]! } + public var Passport_ScanPassportHelp: String { return self._s[3342]! } + public var Application_Name: String { return self._s[3343]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3344]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3346]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3347]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3347]!, self._r[3347]!, [_0]) - } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3348]!, self._r[3348]!, [_0]) } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3350]! } - public var Privacy_ChatsTitle: String { return self._s[3351]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3352]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3353]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3354]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3355]! } - public var Group_LinkedChannel: String { return self._s[3356]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3357]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3358]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3359]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3360]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3362]! } - public var Channel_Setup_TypePublic: String { return self._s[3364]! } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3350]!, self._r[3350]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3351]! } + public var Privacy_ChatsTitle: String { return self._s[3352]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3353]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3354]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3355]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3356]! } + public var Group_LinkedChannel: String { return self._s[3357]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3358]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3359]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3360]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3361]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3363]! } + public var Channel_Setup_TypePublic: String { return self._s[3365]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0]) + return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3367]! } - public var Map_OpenInMaps: String { return self._s[3369]! } + public var Channel_TypeSetup_Title: String { return self._s[3368]! } + public var Map_OpenInMaps: String { return self._s[3370]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3370]!, self._r[3370]!, [_1]) + return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3372]! } + public var NotificationsSound_Tremolo: String { return self._s[3373]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3373]!, self._r[3373]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3374]!, self._r[3374]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3374]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3375]! } - public var Passport_PasswordHelp: String { return self._s[3376]! } - public var Login_CodeExpiredError: String { return self._s[3377]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3378]! } - public var Conversation_TitleUnmute: String { return self._s[3379]! } - public var Passport_Identity_ScansHelp: String { return self._s[3380]! } - public var Passport_Language_lo: String { return self._s[3381]! } - public var Camera_FlashAuto: String { return self._s[3382]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3383]! } - public var Common_Cancel: String { return self._s[3384]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3385]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3386]! } - public var Appearance_TintAllColors: String { return self._s[3387]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3375]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3376]! } + public var Passport_PasswordHelp: String { return self._s[3377]! } + public var Login_CodeExpiredError: String { return self._s[3378]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3379]! } + public var Conversation_TitleUnmute: String { return self._s[3380]! } + public var Passport_Identity_ScansHelp: String { return self._s[3381]! } + public var Passport_Language_lo: String { return self._s[3382]! } + public var Camera_FlashAuto: String { return self._s[3383]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3384]! } + public var Common_Cancel: String { return self._s[3385]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3386]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3387]! } + public var Appearance_TintAllColors: String { return self._s[3388]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_1]) + return formatWithArgumentRanges(self._s[3389]!, self._r[3389]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3389]! } - public var ChatSettings_Title: String { return self._s[3391]! } - public var Passport_PasswordReset: String { return self._s[3392]! } - public var SocksProxySetup_TypeNone: String { return self._s[3393]! } - public var PhoneNumberHelp_Help: String { return self._s[3395]! } - public var Checkout_EnterPassword: String { return self._s[3396]! } - public var Share_AuthTitle: String { return self._s[3398]! } - public var Activity_UploadingDocument: String { return self._s[3399]! } - public var State_Connecting: String { return self._s[3400]! } - public var Profile_MessageLifetime1w: String { return self._s[3401]! } - public var Conversation_ContextMenuReport: String { return self._s[3402]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3403]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3404]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3390]! } + public var ChatSettings_Title: String { return self._s[3392]! } + public var Passport_PasswordReset: String { return self._s[3393]! } + public var SocksProxySetup_TypeNone: String { return self._s[3394]! } + public var PhoneNumberHelp_Help: String { return self._s[3396]! } + public var Checkout_EnterPassword: String { return self._s[3397]! } + public var Share_AuthTitle: String { return self._s[3399]! } + public var Activity_UploadingDocument: String { return self._s[3400]! } + public var State_Connecting: String { return self._s[3401]! } + public var Profile_MessageLifetime1w: String { return self._s[3402]! } + public var Conversation_ContextMenuReport: String { return self._s[3403]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3404]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3405]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3405]!, self._r[3405]!, [_0]) + return formatWithArgumentRanges(self._s[3406]!, self._r[3406]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3406]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3407]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3408]! } - public var PhotoEditor_Set: String { return self._s[3409]! } - public var EmptyGroupInfo_Title: String { return self._s[3410]! } - public var Login_PadPhoneHelp: String { return self._s[3411]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3413]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3415]! } - public var NotificationsSound_Complete: String { return self._s[3416]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3417]! } - public var Group_Info_AdminLog: String { return self._s[3418]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3419]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3420]! } - public var Conversation_Admin: String { return self._s[3422]! } - public var Conversation_GifTooltip: String { return self._s[3423]! } - public var Passport_NotLoggedInMessage: String { return self._s[3424]! } + public var AuthSessions_Terminate: String { return self._s[3407]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3408]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3409]! } + public var PhotoEditor_Set: String { return self._s[3410]! } + public var EmptyGroupInfo_Title: String { return self._s[3411]! } + public var Login_PadPhoneHelp: String { return self._s[3412]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3414]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3416]! } + public var NotificationsSound_Complete: String { return self._s[3417]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3418]! } + public var Group_Info_AdminLog: String { return self._s[3419]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3420]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3421]! } + public var Conversation_Admin: String { return self._s[3423]! } + public var Conversation_GifTooltip: String { return self._s[3424]! } + public var Passport_NotLoggedInMessage: String { return self._s[3425]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3425]!, self._r[3425]!, [_0]) + return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3426]! } - public var SharedMedia_EmptyTitle: String { return self._s[3428]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3430]! } - public var Username_Help: String { return self._s[3431]! } - public var DialogList_LanguageTooltip: String { return self._s[3433]! } - public var Map_LoadError: String { return self._s[3434]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3435]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3436]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3437]! } - public var Notification_Exceptions_NewException: String { return self._s[3438]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3439]! } - public var WatchRemote_AlertText: String { return self._s[3440]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3443]! } + public var Profile_MessageLifetimeForever: String { return self._s[3427]! } + public var SharedMedia_EmptyTitle: String { return self._s[3429]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3431]! } + public var Username_Help: String { return self._s[3432]! } + public var DialogList_LanguageTooltip: String { return self._s[3434]! } + public var Map_LoadError: String { return self._s[3435]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3436]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3437]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3438]! } + public var Notification_Exceptions_NewException: String { return self._s[3439]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3440]! } + public var WatchRemote_AlertText: String { return self._s[3441]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3444]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_0]) + return formatWithArgumentRanges(self._s[3445]!, self._r[3445]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3445]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3446]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3446]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3447]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3447]!, self._r[3447]!, [_0]) + return formatWithArgumentRanges(self._s[3448]!, self._r[3448]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3448]!, self._r[3448]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3449]!, self._r[3449]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3449]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3450]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3452]! } - public var ChatList_UndoArchiveText1: String { return self._s[3453]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3454]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3455]! } - public var Cache_ClearNone: String { return self._s[3456]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3457]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3458]! } + public var Group_AdminLog_EmptyText: String { return self._s[3450]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3451]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3453]! } + public var ChatList_UndoArchiveText1: String { return self._s[3454]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3455]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3456]! } + public var Cache_ClearNone: String { return self._s[3457]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3458]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3459]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3459]!, self._r[3459]!, [_0]) + return formatWithArgumentRanges(self._s[3460]!, self._r[3460]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3460]! } + public var Passport_Identity_Country: String { return self._s[3461]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3461]!, self._r[3461]!, [_0]) - } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3462]!, self._r[3462]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3463]! } - public var AccessDenied_Settings: String { return self._s[3464]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3465]! } - public var Month_ShortMay: String { return self._s[3466]! } - public var Compose_NewGroup: String { return self._s[3467]! } - public var Group_Setup_TypePrivate: String { return self._s[3469]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3471]! } - public var Appearance_ThemeDayClassic: String { return self._s[3472]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3473]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3474]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3475]! } - public var Conversation_typing: String { return self._s[3477]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3478]! } - public var Paint_Masks: String { return self._s[3479]! } - public var Contacts_DeselectAll: String { return self._s[3480]! } - public var Username_InvalidTaken: String { return self._s[3481]! } - public var Call_StatusNoAnswer: String { return self._s[3482]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3483]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3484]! } - public var Passport_Identity_Selfie: String { return self._s[3485]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3486]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3487]! } - public var Conversation_ClearSecretHistory: String { return self._s[3488]! } - public var PeopleNearby_Description: String { return self._s[3490]! } - public var NetworkUsageSettings_Title: String { return self._s[3491]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3493]! } + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_0]) + } + public var Exceptions_AddToExceptions: String { return self._s[3464]! } + public var AccessDenied_Settings: String { return self._s[3465]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3466]! } + public var Month_ShortMay: String { return self._s[3467]! } + public var Compose_NewGroup: String { return self._s[3468]! } + public var Group_Setup_TypePrivate: String { return self._s[3470]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3472]! } + public var Appearance_ThemeDayClassic: String { return self._s[3473]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3474]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3475]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3476]! } + public var Conversation_typing: String { return self._s[3478]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3479]! } + public var Paint_Masks: String { return self._s[3480]! } + public var Contacts_DeselectAll: String { return self._s[3481]! } + public var Username_InvalidTaken: String { return self._s[3482]! } + public var Call_StatusNoAnswer: String { return self._s[3483]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3484]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3485]! } + public var Passport_Identity_Selfie: String { return self._s[3486]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3487]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3488]! } + public var Conversation_ClearSecretHistory: String { return self._s[3489]! } + public var PeopleNearby_Description: String { return self._s[3491]! } + public var NetworkUsageSettings_Title: String { return self._s[3492]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3494]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3495]!, self._r[3495]!, [_0]) + return formatWithArgumentRanges(self._s[3496]!, self._r[3496]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3496]!, self._r[3496]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3497]!, self._r[3497]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3498]! } - public var VoiceOver_Navigation_Search: String { return self._s[3499]! } - public var Map_LiveLocationTitle: String { return self._s[3500]! } - public var Login_InfoAvatarAdd: String { return self._s[3501]! } - public var Passport_Identity_FilesView: String { return self._s[3502]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3503]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3504]! } - public var VoiceOver_Chat_File: String { return self._s[3505]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3499]! } + public var VoiceOver_Navigation_Search: String { return self._s[3500]! } + public var Map_LiveLocationTitle: String { return self._s[3501]! } + public var Login_InfoAvatarAdd: String { return self._s[3502]! } + public var Passport_Identity_FilesView: String { return self._s[3503]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3504]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3505]! } + public var VoiceOver_Chat_File: String { return self._s[3506]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3506]!, self._r[3506]!, [_0]) + return formatWithArgumentRanges(self._s[3507]!, self._r[3507]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3507]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3508]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3509]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3508]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3509]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3510]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3511]! } - public var Tour_Title2: String { return self._s[3512]! } - public var Conversation_FileOpenIn: String { return self._s[3513]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3514]! } - public var Wallpaper_Set: String { return self._s[3515]! } - public var Passport_Identity_Translations: String { return self._s[3517]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3512]! } + public var Tour_Title2: String { return self._s[3513]! } + public var Conversation_FileOpenIn: String { return self._s[3514]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3515]! } + public var Wallpaper_Set: String { return self._s[3516]! } + public var Passport_Identity_Translations: String { return self._s[3518]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3518]!, self._r[3518]!, [_0]) + return formatWithArgumentRanges(self._s[3519]!, self._r[3519]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3519]! } + public var Channel_LeaveChannel: String { return self._s[3520]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3520]!, self._r[3520]!, [_1]) + return formatWithArgumentRanges(self._s[3521]!, self._r[3521]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3522]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3523]! } - public var Passport_Email_Delete: String { return self._s[3524]! } - public var Conversation_Mute: String { return self._s[3526]! } - public var Channel_AddBotAsAdmin: String { return self._s[3527]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3529]! } - public var Channel_Management_LabelOwner: String { return self._s[3531]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3523]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3524]! } + public var Passport_Email_Delete: String { return self._s[3525]! } + public var Conversation_Mute: String { return self._s[3527]! } + public var Channel_AddBotAsAdmin: String { return self._s[3528]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3530]! } + public var Channel_Management_LabelOwner: String { return self._s[3532]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3533]!, self._r[3533]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3533]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3534]! } - public var Common_No: String { return self._s[3535]! } - public var Weekday_Sunday: String { return self._s[3536]! } - public var Notification_Reply: String { return self._s[3537]! } - public var Conversation_ViewMessage: String { return self._s[3538]! } + public var Calls_CallTabDescription: String { return self._s[3534]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3535]! } + public var Common_No: String { return self._s[3536]! } + public var Weekday_Sunday: String { return self._s[3537]! } + public var Notification_Reply: String { return self._s[3538]! } + public var Conversation_ViewMessage: String { return self._s[3539]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3539]!, self._r[3539]!, [_0]) - } - public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3540]!, self._r[3540]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3541]! } - public var Message_PinnedDocumentMessage: String { return self._s[3542]! } - public var DialogList_TabTitle: String { return self._s[3544]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3545]! } - public var Passport_FieldEmail: String { return self._s[3546]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3547]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3548]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3549]! } - public var Privacy_Calls_P2P: String { return self._s[3550]! } + public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3541]!, self._r[3541]!, [_0]) + } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3542]! } + public var Message_PinnedDocumentMessage: String { return self._s[3543]! } + public var DialogList_TabTitle: String { return self._s[3545]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3546]! } + public var Passport_FieldEmail: String { return self._s[3547]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3548]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3549]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3550]! } + public var Privacy_Calls_P2P: String { return self._s[3551]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_0]) + return formatWithArgumentRanges(self._s[3553]!, self._r[3553]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3553]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3554]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3554]!, self._r[3554]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3555]!, self._r[3555]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3555]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3556]! } - public var Passport_InfoText: String { return self._s[3557]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3558]! } + public var Stickers_ClearRecent: String { return self._s[3556]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3557]! } + public var Passport_InfoText: String { return self._s[3558]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3559]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3559]!, self._r[3559]!, [_0]) + return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3561]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3562]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3563]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3564]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3566]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3567]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3562]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3563]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3564]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3565]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3567]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3568]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3569]!, self._r[3569]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3570]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3571]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3572]!, self._r[3572]!, [_0]) + return formatWithArgumentRanges(self._s[3573]!, self._r[3573]!, [_0]) } - public var DialogList_Unread: String { return self._s[3573]! } + public var DialogList_Unread: String { return self._s[3574]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3574]!, self._r[3574]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3575]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3576]! } + public var User_DeletedAccount: String { return self._s[3576]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3577]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_0]) + return formatWithArgumentRanges(self._s[3578]!, self._r[3578]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3578]! } - public var SharedMedia_CategoryMedia: String { return self._s[3579]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3580]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3581]! } - public var Watch_ChatList_Compose: String { return self._s[3582]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3583]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3584]! } - public var Watch_Microphone_Access: String { return self._s[3585]! } - public var Group_Setup_HistoryHeader: String { return self._s[3586]! } - public var Map_SetThisLocation: String { return self._s[3587]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3588]! } - public var Activity_UploadingPhoto: String { return self._s[3589]! } - public var Conversation_Edit: String { return self._s[3591]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3592]! } - public var Login_TermsOfServiceDecline: String { return self._s[3593]! } - public var Message_PinnedContactMessage: String { return self._s[3594]! } + public var UserInfo_NotificationsDefault: String { return self._s[3579]! } + public var SharedMedia_CategoryMedia: String { return self._s[3580]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3581]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3582]! } + public var Watch_ChatList_Compose: String { return self._s[3583]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3584]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3585]! } + public var Watch_Microphone_Access: String { return self._s[3586]! } + public var Group_Setup_HistoryHeader: String { return self._s[3587]! } + public var Map_SetThisLocation: String { return self._s[3588]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3589]! } + public var Activity_UploadingPhoto: String { return self._s[3590]! } + public var Conversation_Edit: String { return self._s[3592]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3593]! } + public var Login_TermsOfServiceDecline: String { return self._s[3594]! } + public var Message_PinnedContactMessage: String { return self._s[3595]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3595]!, self._r[3595]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3596]!, self._r[3596]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3596]!, self._r[3596]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3597]!, self._r[3597]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3597]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3599]! } + public var Appearance_LargeEmoji: String { return self._s[3598]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3600]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3601]!, self._r[3601]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3601]! } - public var Message_PinnedPhotoMessage: String { return self._s[3602]! } - public var Passport_FieldPhone: String { return self._s[3603]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3604]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3605]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3607]! } - public var Conversation_Call: String { return self._s[3608]! } - public var Common_TakePhoto: String { return self._s[3610]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3611]! } - public var Channel_NotificationLoading: String { return self._s[3612]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3602]! } + public var Message_PinnedPhotoMessage: String { return self._s[3603]! } + public var Passport_FieldPhone: String { return self._s[3604]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3605]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3606]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3608]! } + public var Conversation_Call: String { return self._s[3609]! } + public var Common_TakePhoto: String { return self._s[3611]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3612]! } + public var Channel_NotificationLoading: String { return self._s[3613]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3613]!, self._r[3613]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3614]!, self._r[3614]!, [_0]) } + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_0]) + } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_1]) + return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3616]! } + public var Permissions_SiriTitle_v0: String { return self._s[3617]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3617]!, self._r[3617]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3619]! } - public var Common_edit: String { return self._s[3620]! } - public var PrivacySettings_AuthSessions: String { return self._s[3621]! } - public var Month_ShortJune: String { return self._s[3622]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3623]! } - public var Call_ReportSend: String { return self._s[3624]! } - public var Watch_LastSeen_JustNow: String { return self._s[3625]! } - public var Notifications_MessageNotifications: String { return self._s[3626]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3627]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3629]! } - public var Group_Status: String { return self._s[3630]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3619]!, self._r[3619]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[3620]! } + public var Common_edit: String { return self._s[3621]! } + public var PrivacySettings_AuthSessions: String { return self._s[3622]! } + public var Month_ShortJune: String { return self._s[3623]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3624]! } + public var Call_ReportSend: String { return self._s[3625]! } + public var Watch_LastSeen_JustNow: String { return self._s[3626]! } + public var Notifications_MessageNotifications: String { return self._s[3627]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3628]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3630]! } + public var Group_Status: String { return self._s[3631]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3632]! } - public var ShareMenu_ShareTo: String { return self._s[3633]! } - public var Conversation_Moderate_Ban: String { return self._s[3634]! } + public var TextFormat_AddLinkTitle: String { return self._s[3633]! } + public var ShareMenu_ShareTo: String { return self._s[3634]! } + public var Conversation_Moderate_Ban: String { return self._s[3635]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3635]!, self._r[3635]!, [_0]) + return formatWithArgumentRanges(self._s[3636]!, self._r[3636]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3636]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3637]! } + public var SharedMedia_ViewInChat: String { return self._s[3637]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3638]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3638]!, self._r[3638]!, [_1]) + return formatWithArgumentRanges(self._s[3639]!, self._r[3639]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3639]!, self._r[3639]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3640]!, self._r[3640]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3641]!, self._r[3641]!, [_0]) + return formatWithArgumentRanges(self._s[3642]!, self._r[3642]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3642]! } - public var Appearance_ReduceMotion: String { return self._s[3643]! } + public var Map_OpenInHereMaps: String { return self._s[3643]! } + public var Appearance_ReduceMotion: String { return self._s[3644]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3644]!, self._r[3644]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3645]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3646]! } - public var PhotoEditor_Skip: String { return self._s[3647]! } - public func StickerPack_StickerCount(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[3646]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3647]! } + public var PhotoEditor_Skip: String { return self._s[3648]! } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Seconds(_ value: Int32) -> String { + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusOnline(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPolls(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedMessages(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func Contacts_ImportersCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func MessageTimer_Months(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_Exceptions(_ value: Int32) -> String { + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAudios(_ value: Int32) -> String { + public func Call_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, _1, _2) } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift index 2f59548bcf..150ff1c108 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift @@ -151,7 +151,11 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { } if scheduled { - text = presentationData.strings.ScheduledMessages_ScheduledDate(text).0 + if timeinfo.tm_year == timeinfoNow.tm_year && timeinfo.tm_yday == timeinfoNow.tm_yday { + text = presentationData.strings.ScheduledMessages_ScheduledToday + } else { + text = presentationData.strings.ScheduledMessages_ScheduledDate(text).0 + } } let attributedString = NSAttributedString(string: text, font: titleFont, textColor: bubbleVariableColor(variableColor: presentationData.theme.theme.chat.serviceMessage.dateTextColor, wallpaper: presentationData.theme.wallpaper)) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 8e0df3f42114b99afa2fde1c3632667ef97ebd9f..6e5d162fe83c29970c3e04f4fbd124eee491007b 100644 GIT binary patch delta 33265 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 X51dX$DICGd=zd9AX^H&%q~-ZP?P-sN From 7a185a8f5ac91af8689af5258d6085c486b94e6a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 19:48:33 +0300 Subject: [PATCH 54/86] API update [skip ci] --- submodules/TelegramApi/Sources/Api0.swift | 7 +- submodules/TelegramApi/Sources/Api1.swift | 92 +++++----------- submodules/TelegramApi/Sources/Api3.swift | 104 +++++++++--------- .../TelegramCore/EnqueueMessage.swift | 25 +++-- .../TelegramCore/MessageUtils.swift | 2 +- .../TelegramCore/PendingMessageManager.swift | 3 + .../TelegramCore/StoreMessage_Telegram.swift | 4 +- .../TelegramCore/TelegramCore/Theme.swift | 20 ++-- .../TelegramCore/TelegramCore/Themes.swift | 94 +++++++++++++--- .../TelegramCore/TelegramCore/Wallpaper.swift | 2 +- 10 files changed, 190 insertions(+), 163 deletions(-) diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index c6f4eed860..3132ce6cd9 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -240,8 +240,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1263546448] = { return Api.Update.parse_updatePeerLocated($0) } dict[967122427] = { return Api.Update.parse_updateNewScheduledMessage($0) } dict[-1870238482] = { return Api.Update.parse_updateDeleteScheduledMessages($0) } - dict[-2112423005] = { return Api.Update.parse_updateTheme($0) } dict[357013699] = { return Api.Update.parse_updateMessageReactions($0) } + dict[-2112423005] = { return Api.Update.parse_updateTheme($0) } dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) } dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) } dict[367766557] = { return Api.ChannelParticipant.parse_channelParticipant($0) } @@ -428,7 +428,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-2128640689] = { return Api.account.SentEmailCode.parse_sentEmailCode($0) } dict[-1038136962] = { return Api.EncryptedFile.parse_encryptedFileEmpty($0) } dict[1248893260] = { return Api.EncryptedFile.parse_encryptedFile($0) } - dict[-557924733] = { return Api.CodeSettings.parse_codeSettings($0) } dict[-391902247] = { return Api.SecureValueError.parse_secureValueErrorData($0) } dict[12467706] = { return Api.SecureValueError.parse_secureValueErrorFrontSide($0) } dict[-2037765467] = { return Api.SecureValueError.parse_secureValueErrorReverseSide($0) } @@ -726,7 +725,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-104284986] = { return Api.WebDocument.parse_webDocumentNoProxy($0) } dict[475467473] = { return Api.WebDocument.parse_webDocument($0) } dict[1211967244] = { return Api.Theme.parse_themeDocumentNotModified($0) } - dict[1464749545] = { return Api.Theme.parse_theme($0) } + dict[975846885] = { return Api.Theme.parse_theme($0) } dict[-1290580579] = { return Api.contacts.Found.parse_found($0) } dict[-368018716] = { return Api.ChannelAdminLogEventsFilter.parse_channelAdminLogEventsFilter($0) } dict[1889961234] = { return Api.PeerNotifySettings.parse_peerNotifySettingsEmpty($0) } @@ -1088,8 +1087,6 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.EncryptedFile: _1.serialize(buffer, boxed) - case let _1 as Api.CodeSettings: - _1.serialize(buffer, boxed) case let _1 as Api.SecureValueError: _1.serialize(buffer, boxed) case let _1 as Api.NotifyPeer: diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 687ae5d6b6..e8851bbe79 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -4143,8 +4143,8 @@ public extension Api { case updatePeerLocated(peers: [Api.PeerLocated]) case updateNewScheduledMessage(message: Api.Message) case updateDeleteScheduledMessages(peer: Api.Peer, messages: [Int32]) - case updateTheme(theme: Api.Theme) case updateMessageReactions(peer: Api.Peer, msgId: Int32, reactions: Api.MessageReactions) + case updateTheme(theme: Api.Theme) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -4763,12 +4763,6 @@ public extension Api { serializeInt32(item, buffer: buffer, boxed: false) } break - case .updateTheme(let theme): - if boxed { - buffer.appendInt32(-2112423005) - } - theme.serialize(buffer, true) - break case .updateMessageReactions(let peer, let msgId, let reactions): if boxed { buffer.appendInt32(357013699) @@ -4777,6 +4771,12 @@ public extension Api { serializeInt32(msgId, buffer: buffer, boxed: false) reactions.serialize(buffer, true) break + case .updateTheme(let theme): + if boxed { + buffer.appendInt32(-2112423005) + } + theme.serialize(buffer, true) + break } } @@ -4928,10 +4928,10 @@ public extension Api { return ("updateNewScheduledMessage", [("message", message)]) case .updateDeleteScheduledMessages(let peer, let messages): return ("updateDeleteScheduledMessages", [("peer", peer), ("messages", messages)]) - case .updateTheme(let theme): - return ("updateTheme", [("theme", theme)]) case .updateMessageReactions(let peer, let msgId, let reactions): return ("updateMessageReactions", [("peer", peer), ("msgId", msgId), ("reactions", reactions)]) + case .updateTheme(let theme): + return ("updateTheme", [("theme", theme)]) } } @@ -6177,19 +6177,6 @@ public extension Api { return nil } } - public static func parse_updateTheme(_ reader: BufferReader) -> Update? { - var _1: Api.Theme? - if let signature = reader.readInt32() { - _1 = Api.parse(reader, signature: signature) as? Api.Theme - } - let _c1 = _1 != nil - if _c1 { - return Api.Update.updateTheme(theme: _1!) - } - else { - return nil - } - } public static func parse_updateMessageReactions(_ reader: BufferReader) -> Update? { var _1: Api.Peer? if let signature = reader.readInt32() { @@ -6211,6 +6198,19 @@ public extension Api { return nil } } + public static func parse_updateTheme(_ reader: BufferReader) -> Update? { + var _1: Api.Theme? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.Theme + } + let _c1 = _1 != nil + if _c1 { + return Api.Update.updateTheme(theme: _1!) + } + else { + return nil + } + } } public enum PopularContact: TypeConstructorDescription { @@ -10642,40 +10642,6 @@ public extension Api { } } - } - public enum CodeSettings: TypeConstructorDescription { - case codeSettings(flags: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .codeSettings(let flags): - if boxed { - buffer.appendInt32(-557924733) - } - serializeInt32(flags, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .codeSettings(let flags): - return ("codeSettings", [("flags", flags)]) - } - } - - public static func parse_codeSettings(_ reader: BufferReader) -> CodeSettings? { - var _1: Int32? - _1 = reader.readInt32() - let _c1 = _1 != nil - if _c1 { - return Api.CodeSettings.codeSettings(flags: _1!) - } - else { - return nil - } - } - } public enum SecureValueError: TypeConstructorDescription { case secureValueErrorData(type: Api.SecureValueType, dataHash: Buffer, field: String, text: String) @@ -18455,7 +18421,7 @@ public extension Api { } public enum Theme: TypeConstructorDescription { case themeDocumentNotModified - case theme(flags: Int32, id: Int64, accessHash: Int64, slug: String, title: String, document: Api.Document) + case theme(flags: Int32, id: Int64, accessHash: Int64, slug: String, title: String, document: Api.Document?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -18467,14 +18433,14 @@ public extension Api { break case .theme(let flags, let id, let accessHash, let slug, let title, let document): if boxed { - buffer.appendInt32(1464749545) + buffer.appendInt32(975846885) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt64(id, buffer: buffer, boxed: false) serializeInt64(accessHash, buffer: buffer, boxed: false) serializeString(slug, buffer: buffer, boxed: false) serializeString(title, buffer: buffer, boxed: false) - document.serialize(buffer, true) + if Int(flags) & Int(1 << 2) != 0 {document!.serialize(buffer, true)} break } } @@ -18503,17 +18469,17 @@ public extension Api { var _5: String? _5 = parseString(reader) var _6: Api.Document? - if let signature = reader.readInt32() { + if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() { _6 = Api.parse(reader, signature: signature) as? Api.Document - } + } } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil let _c4 = _4 != nil let _c5 = _5 != nil - let _c6 = _6 != nil + let _c6 = (Int(_1!) & Int(1 << 2) == 0) || _6 != nil if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 { - return Api.Theme.theme(flags: _1!, id: _2!, accessHash: _3!, slug: _4!, title: _5!, document: _6!) + return Api.Theme.theme(flags: _1!, id: _2!, accessHash: _3!, slug: _4!, title: _5!, document: _6) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 47f4660cbc..5beab5564d 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -2924,6 +2924,33 @@ public extension Api { }) } + public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-637606386) + serializeInt32(flags, buffer: buffer, boxed: false) + fromPeer.serialize(buffer, true) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(randomId.count)) + for item in randomId { + serializeInt64(item, buffer: buffer, boxed: false) + } + toPeer.serialize(buffer, true) + if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(570955184) @@ -2944,6 +2971,31 @@ public extension Api { }) } + public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1224152952) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt32(id, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} + if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(entities!.count)) + for item in entities! { + item.serialize(buffer, true) + }} + if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia], scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-872345397) @@ -2966,33 +3018,6 @@ public extension Api { }) } - public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-637606386) - serializeInt32(flags, buffer: buffer, boxed: false) - fromPeer.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt32(item, buffer: buffer, boxed: false) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(randomId.count)) - for item in randomId { - serializeInt64(item, buffer: buffer, boxed: false) - } - toPeer.serialize(buffer, true) - if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func getScheduledHistory(peer: Api.InputPeer, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-490575781) @@ -3065,31 +3090,6 @@ public extension Api { }) } - public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1224152952) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - serializeInt32(id, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} - if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} - if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) - buffer.appendInt32(Int32(entities!.count)) - for item in entities! { - item.serialize(buffer, true) - }} - if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func sendReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, reaction: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(627641572) diff --git a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift index 5d6bb1e239..7224e62459 100644 --- a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift +++ b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift @@ -329,17 +329,6 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, attributes.append(ConsumableContentMessageAttribute(consumed: false)) } } - if let peer = peer as? TelegramChannel { - switch peer.info { - case let .broadcast(info): - attributes.append(ViewCountMessageAttribute(count: 1)) - if info.flags.contains(.messagesShouldHaveSignatures) { - attributes.append(AuthorSignatureMessageAttribute(signature: accountPeer.debugDisplayTitle)) - } - case .group: - break - } - } var entitiesAttribute: TextEntitiesMessageAttribute? for attribute in attributes { @@ -398,6 +387,20 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, } } + if let peer = peer as? TelegramChannel { + switch peer.info { + case let .broadcast(info): + if messageNamespace != Namespaces.Message.ScheduledLocal { + attributes.append(ViewCountMessageAttribute(count: 1)) + } + if info.flags.contains(.messagesShouldHaveSignatures) { + attributes.append(AuthorSignatureMessageAttribute(signature: accountPeer.debugDisplayTitle)) + } + case .group: + break + } + } + storeMessages.append(StoreMessage(peerId: peerId, namespace: messageNamespace, globallyUniqueId: randomId, groupingKey: localGroupingKey, timestamp: effectiveTimestamp, flags: flags, tags: tags, globalTags: globalTags, localTags: localTags, forwardInfo: nil, authorId: authorId, text: text, attributes: attributes, media: mediaList)) case let .forward(source, grouping, requestedAttributes): let sourceMessage = transaction.getMessage(source) diff --git a/submodules/TelegramCore/TelegramCore/MessageUtils.swift b/submodules/TelegramCore/TelegramCore/MessageUtils.swift index 153d35fcf6..1709b078fe 100644 --- a/submodules/TelegramCore/TelegramCore/MessageUtils.swift +++ b/submodules/TelegramCore/TelegramCore/MessageUtils.swift @@ -194,7 +194,7 @@ public extension Message { if self.flags.contains(.Failed) { return true } else if self.id.namespace == Namespaces.Message.ScheduledCloud { - return timestamp > self.timestamp + return timestamp > self.timestamp + 30 } else { return false } diff --git a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift index f97e33be98..0059a66ffd 100644 --- a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift +++ b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift @@ -64,6 +64,7 @@ public enum PendingMessageFailureReason { case publicBan case mediaRestricted case slowmodeActive + case tooMuchScheduled } private func reasonForError(_ error: String) -> PendingMessageFailureReason? { @@ -75,6 +76,8 @@ private func reasonForError(_ error: String) -> PendingMessageFailureReason? { return .mediaRestricted } else if error.hasPrefix("SLOWMODE_WAIT") { return .slowmodeActive + } else if error.hasPrefix("SCHEDULE_TOO_MUCH") { + return .tooMuchScheduled } else { return nil } diff --git a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift index 4f08eb87a9..3c33ae3317 100644 --- a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift @@ -501,7 +501,7 @@ extension StoreMessage { attributes.append(ReplyMessageAttribute(messageId: MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId))) } - if let views = views { + if let views = views, namespace != Namespaces.Message.ScheduledCloud { attributes.append(ViewCountMessageAttribute(count: Int(views))) } @@ -537,8 +537,6 @@ extension StoreMessage { attributes.append(ContentRequiresValidationMessageAttribute()) } - - if let reactions = reactions { attributes.append(ReactionsMessageAttribute(apiReactions: reactions)) } diff --git a/submodules/TelegramCore/TelegramCore/Theme.swift b/submodules/TelegramCore/TelegramCore/Theme.swift index 96e936ede8..d785dafb65 100644 --- a/submodules/TelegramCore/TelegramCore/Theme.swift +++ b/submodules/TelegramCore/TelegramCore/Theme.swift @@ -14,11 +14,11 @@ public final class TelegramTheme: OrderedItemListEntryContents, Equatable { public let accessHash: Int64 public let slug: String public let title: String - public let file: TelegramMediaFile + public let file: TelegramMediaFile? public let isCreator: Bool public let isDefault: Bool - public init(id: Int64, accessHash: Int64, slug: String, title: String, file: TelegramMediaFile, isCreator: Bool, isDefault: Bool) { + public init(id: Int64, accessHash: Int64, slug: String, title: String, file: TelegramMediaFile?, isCreator: Bool, isDefault: Bool) { self.id = id self.accessHash = accessHash self.slug = slug @@ -33,7 +33,7 @@ public final class TelegramTheme: OrderedItemListEntryContents, Equatable { self.accessHash = decoder.decodeInt64ForKey("accessHash", orElse: 0) self.slug = decoder.decodeStringForKey("slug", orElse: "") self.title = decoder.decodeStringForKey("title", orElse: "") - self.file = decoder.decodeObjectForKey("file", decoder: { TelegramMediaFile(decoder: $0) }) as! TelegramMediaFile + self.file = decoder.decodeObjectForKey("file", decoder: { TelegramMediaFile(decoder: $0) }) as? TelegramMediaFile self.isCreator = decoder.decodeInt32ForKey("isCreator", orElse: 0) != 0 self.isDefault = decoder.decodeInt32ForKey("isDefault", orElse: 0) != 0 } @@ -43,7 +43,11 @@ public final class TelegramTheme: OrderedItemListEntryContents, Equatable { encoder.encodeInt64(self.accessHash, forKey: "accessHash") encoder.encodeString(self.slug, forKey: "slug") encoder.encodeString(self.title, forKey: "title") - encoder.encodeObject(self.file, forKey: "file") + if let file = self.file { + encoder.encodeObject(file, forKey: "file") + } else { + encoder.encodeNil(forKey: "file") + } encoder.encodeInt32(self.isCreator ? 1 : 0, forKey: "isCreator") encoder.encodeInt32(self.isDefault ? 1 : 0, forKey: "isDefault") } @@ -61,7 +65,7 @@ public final class TelegramTheme: OrderedItemListEntryContents, Equatable { if lhs.title != rhs.title { return false } - if lhs.file.id != rhs.file.id { + if lhs.file?.id != rhs.file?.id { return false } if lhs.isCreator != rhs.isCreator { @@ -78,11 +82,7 @@ extension TelegramTheme { convenience init?(apiTheme: Api.Theme) { switch apiTheme { case let .theme(flags, id, accessHash, slug, title, document): - if let file = telegramMediaFileFromApiDocument(document) { - self.init(id: id, accessHash: accessHash, slug: slug, title: title, file: file, isCreator: (flags & 1 << 0) != 0, isDefault: (flags & 1 << 1) != 0) - } else { - return nil - } + self.init(id: id, accessHash: accessHash, slug: slug, title: title, file: document.flatMap(telegramMediaFileFromApiDocument), isCreator: (flags & 1 << 0) != 0, isDefault: (flags & 1 << 1) != 0) default: return nil } diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index 227803c976..726bf75693 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -96,6 +96,26 @@ public func getTheme(account: Account, slug: String) -> Signal Signal { + guard let file = theme.file, let fileId = file.id?.id else { + return .fail(.generic) + } + return account.network.request(Api.functions.account.getTheme(format: themeFormat, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), documentId: fileId)) + |> mapError { _ -> GetThemeError in return .generic } + |> map { theme -> CheckThemeUpdatedResult in + if let theme = TelegramTheme(apiTheme: theme) { + return .updated(theme) + } else { + return .notModified + } + } +} + public func saveTheme(account: Account, theme: TelegramTheme) -> Signal { return saveUnsaveTheme(account: account, theme: theme, unsave: false) } @@ -124,7 +144,7 @@ public func installTheme(account: Account, theme: TelegramTheme) -> Signal Signal { +private func uploadTheme(account: Account, resource: MediaResource) -> Signal { let fileName = "theme.\(themeFileExtension)" let mimeType = "application/x-tgtheme-\(themeFormat)" return uploadedTheme(postbox: account.postbox, network: account.network, resource: resource) |> mapError { _ -> UploadThemeError in return .generic } - |> mapToSignal { result -> Signal<(UploadThemeStatus, MediaResource?), UploadThemeError> in + |> mapToSignal { result -> Signal<(UploadThemeResult, MediaResource?), UploadThemeError> in switch result.content { case .error: return .fail(.generic) @@ -170,7 +190,7 @@ private func uploadTheme(account: Account, resource: MediaResource) -> Signal mapError { _ in return UploadThemeError.generic } - |> mapToSignal { document -> Signal<(UploadThemeStatus, MediaResource?), UploadThemeError> in + |> mapToSignal { document -> Signal<(UploadThemeResult, MediaResource?), UploadThemeError> in if let file = telegramMediaFileFromApiDocument(document) { return .single((.complete(file), result.resource)) } else { @@ -182,7 +202,7 @@ private func uploadTheme(account: Account, resource: MediaResource) -> Signal map { result, _ -> UploadThemeStatus in + |> map { result, _ -> UploadThemeResult in return result } } @@ -191,18 +211,23 @@ public enum CreateThemeError { case generic } -public func createTheme(account: Account, resource: MediaResource, title: String, slug: String) -> Signal { +public enum CreateThemeResult { + case result(TelegramTheme) + case progress(Float) +} + +public func createTheme(account: Account, resource: MediaResource, title: String) -> Signal { return uploadTheme(account: account, resource: resource) |> mapError { _ in return CreateThemeError.generic } - |> mapToSignal { status -> Signal in - switch status { + |> mapToSignal { result -> Signal in + switch result { case let .complete(file): if let resource = file.resource as? CloudDocumentMediaResource { - return account.network.request(Api.functions.account.createTheme(slug: slug, title: title, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)))) + return account.network.request(Api.functions.account.createTheme(slug: "", title: title, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)))) |> mapError { _ in return CreateThemeError.generic } - |> mapToSignal { apiTheme -> Signal in + |> mapToSignal { apiTheme -> Signal in if let theme = TelegramTheme(apiTheme: apiTheme) { - return .single(theme) + return .single(.result(theme)) } else { return .fail(.generic) } @@ -211,17 +236,16 @@ public func createTheme(account: Account, resource: MediaResource, title: String else { return .fail(.generic) } - default: - return .complete() + case let .progress(progress): + return .single(.progress(progress)) } } } -public func updateTheme(account: Account, theme: TelegramTheme, title: String?, slug: String?, resource: MediaResource?) -> Signal { +public func updateTheme(account: Account, theme: TelegramTheme, title: String?, slug: String?, resource: MediaResource?) -> Signal { guard title != nil || slug != nil || resource != nil else { return .complete() } - var flags: Int32 = 0 if let _ = title { flags |= 1 << 1 @@ -230,6 +254,42 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, flags |= 1 << 0 } - return .never() - //return account.network.request(Api.functions.account.updateTheme(flags: flags, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: <#T##Api.InputDocument?#>)) + let uploadSignal: Signal + if let resource = resource { + uploadSignal = uploadTheme(account: account, resource: resource) + |> map(Optional.init) + } else { + uploadSignal = .single(nil) + } + return uploadSignal + |> mapError { _ -> CreateThemeError in + return .generic + } + |> mapToSignal { result -> Signal in + let inputDocument: Api.InputDocument? + if let status = result { + switch status { + case let .complete(file): + if let resource = file.resource as? CloudDocumentMediaResource { + inputDocument = .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)) + } else { + return .fail(.generic) + } + case let .progress(progress): + return .single(.progress(progress)) + } + } else { + inputDocument = nil + } + + return account.network.request(Api.functions.account.updateTheme(flags: flags, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: inputDocument)) + |> mapError { _ in return CreateThemeError.generic } + |> mapToSignal { apiTheme -> Signal in + if let theme = TelegramTheme(apiTheme: apiTheme) { + return .single(.result(theme)) + } else { + return .fail(.generic) + } + } + } } diff --git a/submodules/TelegramCore/TelegramCore/Wallpaper.swift b/submodules/TelegramCore/TelegramCore/Wallpaper.swift index 7a56e2bcf8..0d5563cee6 100644 --- a/submodules/TelegramCore/TelegramCore/Wallpaper.swift +++ b/submodules/TelegramCore/TelegramCore/Wallpaper.swift @@ -64,7 +64,7 @@ public enum TelegramWallpaper: OrderedItemListEntryContents, Equatable { case 3: let settings = decoder.decodeObjectForKey("settings", decoder: { WallpaperSettings(decoder: $0) }) as? WallpaperSettings ?? WallpaperSettings() if let file = decoder.decodeObjectForKey("file", decoder: { TelegramMediaFile(decoder: $0) }) as? TelegramMediaFile { - self = .file(id: decoder.decodeInt64ForKey("id", orElse: 0), accessHash: decoder.decodeInt64ForKey("accessHash", orElse: 0), isCreator: decoder.decodeInt32ForKey("isCreator", orElse: 0) != 0, isDefault: decoder.decodeInt32ForKey("isDefault", orElse: 0) != 0, isPattern: decoder.decodeInt32ForKey("isPattern", orElse: 0) != 0, isDark: decoder.decodeInt32ForKey("isDark", orElse: 0) != 0, slug: decoder.decodeStringForKey("slug", orElse: ""), file: decoder.decodeObjectForKey("file", decoder: { TelegramMediaFile(decoder: $0) }) as! TelegramMediaFile, settings: settings) + self = .file(id: decoder.decodeInt64ForKey("id", orElse: 0), accessHash: decoder.decodeInt64ForKey("accessHash", orElse: 0), isCreator: decoder.decodeInt32ForKey("isCreator", orElse: 0) != 0, isDefault: decoder.decodeInt32ForKey("isDefault", orElse: 0) != 0, isPattern: decoder.decodeInt32ForKey("isPattern", orElse: 0) != 0, isDark: decoder.decodeInt32ForKey("isDark", orElse: 0) != 0, slug: decoder.decodeStringForKey("slug", orElse: ""), file: file, settings: settings) } else { self = .color(0xffffff) } From 6692a819f2d880af3e1620d4ef29e7e7f1621fe8 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 22:44:58 +0400 Subject: [PATCH 55/86] Fix context menu animations --- Telegram-iOS/en.lproj/Localizable.strings | 4 +- .../ContextUI/Sources/ContextController.swift | 56 +++++-- .../Display/Display/CAAnimationUtils.swift | 7 +- .../Display/ContextMenuActionNode.swift | 4 +- .../Display/ContextMenuContainerNode.swift | 2 +- .../Display/Display/ContextMenuNode.swift | 26 +-- submodules/MtProtoKit/MTAes.m | 3 + .../MtProtoKit/MTProtoKit/MTTcpConnection.m | 97 ++++++++++- .../TelegramCore/ContactManagement.swift | 4 +- .../TelegramCore/ContactSyncManager.swift | 2 +- .../DefaultDarkPresentationTheme.swift | 4 +- .../DefaultDarkTintedPresentationTheme.swift | 4 +- .../Sources/DefaultDayPresentationTheme.swift | 8 +- .../Sources/PresentationTheme.swift | 6 +- .../Sources/PresentationThemeCodable.swift | 49 +++--- .../Unstar.imageset/Contents.json | 12 ++ .../Unstar.imageset/ic_lt_unstar.pdf | Bin 0 -> 4649 bytes .../TelegramUI/ChatController.swift | 156 ++++++++++-------- .../TelegramUI/ChatControllerNode.swift | 52 ++++-- .../TelegramUI/ChatHistoryListNode.swift | 8 +- .../ChatInterfaceStateContextMenus.swift | 23 +-- .../ChatMessageAnimatedStickerItemNode.swift | 12 +- .../ChatMessageBubbleItemNode.swift | 17 +- .../ChatMessageInstantVideoItemNode.swift | 12 +- .../ChatMessageStickerItemNode.swift | 12 +- .../ChatMessageTextBubbleContentNode.swift | 18 +- .../ChatPanelInterfaceInteraction.swift | 8 +- .../ChatRecentActionsController.swift | 6 +- .../TelegramUI/NavigateToChatController.swift | 8 +- .../PeerMediaCollectionController.swift | 6 +- .../Sources/TextSelectionNode.swift | 36 +++- 31 files changed, 453 insertions(+), 209 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Unstar.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Unstar.imageset/ic_lt_unstar.pdf diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 0c58910708..07a3a4fcdf 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -217,6 +217,8 @@ "PUSH_CHAT_MESSAGE_GAME_SCORE" = "%1$@ scored %4$@ in game %3$@ in the group %2$@"; "PUSH_CHAT_MESSAGE_VIDEOS" = "%1$@ sent %3$@ videos to the group %2$@"; +"PUSH_REMINDER_TITLE" = "🗓 Reminder"; + "LOCAL_MESSAGE_FWDS" = "%1$@ forwarded you %2$d messages"; "LOCAL_CHANNEL_MESSAGE_FWDS" = "%1$@ posted %2$d forwarded messages"; "LOCAL_CHAT_MESSAGE_FWDS" = "%1$@ forwarded %2$d messages"; @@ -4529,7 +4531,7 @@ Any member of this group will be able to see messages in the channel."; "VoiceOver.Chat.RecordModeVoiceMessage" = "Voice message"; "VoiceOver.Chat.RecordModeVoiceMessageInfo" = "Double tap and hold to record voice message. Slide up to pin recording, slide left to cancel. Double tap to switch to video."; "VoiceOver.Chat.RecordModeVideoMessage" = "Video message"; -"VoiceOver.Chat.RecordModeVideoMessageInfo" = "Double tap and hold to record voice message. Slide up to pin recording, slide left to cancel. Double tap to switch to audio."; +"VoiceOver.Chat.RecordModeVideoMessageInfo" = "Double tap and hold to record video message. Slide up to pin recording, slide left to cancel. Double tap to switch to audio."; "VoiceOver.Chat.Message" = "Message"; "VoiceOver.Chat.YourMessage" = "Your message"; "VoiceOver.Chat.ReplyFrom" = "Reply to message from: %@"; diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 6c2b964ccf..4625c2dae1 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -23,6 +23,7 @@ public enum ContextMenuActionItemTextColor { public enum ContextMenuActionResult { case `default` case dismissWithoutContent + case custom(ContainedViewLayoutTransition) } public final class ContextMenuActionItem { @@ -338,7 +339,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let _ = self.propertyAnimator { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { - self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.25 * animationDurationFactor, from: 0.0, to: 1.0, update: { [weak self] value in + self.displayLinkAnimator = DisplayLinkAnimator(duration: 0.2 * animationDurationFactor, from: 0.0, to: 1.0, update: { [weak self] value in (self?.propertyAnimator as? UIViewPropertyAnimator)?.fractionComplete = value }, completion: { [weak self] in self?.didCompleteAnimationIn = true @@ -372,9 +373,27 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } func animateOut(result: ContextMenuActionResult, completion: @escaping () -> Void) { + var transitionDuration: Double = 0.2 + var transitionCurve: ContainedViewLayoutTransitionCurve = .easeInOut + + switch result { + case let .custom(value): + switch value { + case let .animated(duration, curve): + transitionDuration = duration + transitionCurve = curve + default: + break + } + default: + break + } + self.isUserInteractionEnabled = false self.isAnimatingOut = true + self.scrollNode.view.setContentOffset(self.scrollNode.view.contentOffset, animated: false) + var completedEffect = false var completedContentNode = false var completedActionsNode = false @@ -384,8 +403,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let putBackInfo = putBackInfo, let contentParentNode = self.contentParentNode, let parentSupernode = contentParentNode.supernode { self.originalProjectedContentViewFrame = (parentSupernode.view.convert(contentParentNode.frame, to: self.view), contentParentNode.view.convert(contentParentNode.contentRect, to: self.view)) - self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: putBackInfo.contentAreaInScreenSpace, duration: 0.2 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) - self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: putBackInfo.contentAreaInScreenSpace.minY, duration: 0.2 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false) + self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: putBackInfo.contentAreaInScreenSpace, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) + self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: putBackInfo.contentAreaInScreenSpace.minY, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) } let contentParentNode = self.contentParentNode @@ -395,7 +414,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi let intermediateCompletion: () -> Void = { [weak contentParentNode] in if completedEffect && completedContentNode && completedActionsNode { switch result { - case .default: + case .default, .custom: if let contentParentNode = contentParentNode { contentParentNode.addSubnode(contentParentNode.contentNode) contentParentNode.isExtractedToContextPreview = false @@ -414,7 +433,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi let propertyAnimator = propertyAnimator as? UIViewPropertyAnimator propertyAnimator?.stopAnimation(true) } - self.propertyAnimator = UIViewPropertyAnimator(duration: 0.2, curve: .easeInOut, animations: { [weak self] in + self.propertyAnimator = UIViewPropertyAnimator(duration: transitionDuration, curve: .easeInOut, animations: { [weak self] in self?.effectView.effect = nil }) } @@ -442,22 +461,31 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi }) } - self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false) + self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false) self.actionsContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in completedActionsNode = true intermediateCompletion() }) self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: 0.2 * animationDurationFactor, removeOnCompletion: false) - if case .default = result, let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode { + + let animateOutToItem: Bool + switch result { + case .default, .custom: + animateOutToItem = true + case .dismissWithoutContent: + animateOutToItem = false + } + + if animateOutToItem, let originalProjectedContentViewFrame = self.originalProjectedContentViewFrame, let contentParentNode = self.contentParentNode { let localSourceFrame = self.view.convert(originalProjectedContentViewFrame.1, to: self.scrollNode.view) - self.actionsContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y), duration: 0.2 * animationDurationFactor, removeOnCompletion: false, additive: true) + self.actionsContainerNode.layer.animatePosition(from: CGPoint(), to: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y), duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true) let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y - contentParentNode.contentRect.minY) - self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: contentContainerOffset, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, additive: true, completion: { _ in + self.contentContainerNode.layer.animatePosition(from: CGPoint(), to: contentContainerOffset, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false, additive: true, completion: { _ in completedContentNode = true intermediateCompletion() }) contentParentNode.updateAbsoluteRect?(self.contentContainerNode.frame.offsetBy(dx: 0.0, dy: -self.scrollNode.view.contentOffset.y + contentContainerOffset.y), self.bounds.size) - contentParentNode.applyAbsoluteOffset?(-contentContainerOffset.y, .easeInOut, 0.2) + contentParentNode.applyAbsoluteOffset?(-contentContainerOffset.y, transitionCurve, transitionDuration) if let reactionContextNode = self.reactionContextNode { reactionContextNode.animateOut(to: CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: contentParentNode.contentRect.size), animatingOutToReaction: self.reactionContextNodeIsAnimatingOut) @@ -471,10 +499,12 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi contentParentNode.isExtractedToContextPreview = false contentParentNode.isExtractedToContextPreviewUpdated?(false) - self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in + self.contentContainerNode.allowsGroupOpacity = true + self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false, completion: { _ in completedContentNode = true intermediateCompletion() }) + //self.contentContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: transitionDuration * animationDurationFactor, removeOnCompletion: false) if let reactionContextNode = self.reactionContextNode { reactionContextNode.animateOut(to: nil, animatingOutToReaction: self.reactionContextNodeIsAnimatingOut) @@ -535,6 +565,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } func updateLayout(layout: ContainerViewLayout, transition: ContainedViewLayoutTransition, previousActionsContainerNode: ContextActionsContainerNode?) { + if self.isAnimatingOut { + return + } + self.validLayout = layout var actionsContainerTransition = transition diff --git a/submodules/Display/Display/CAAnimationUtils.swift b/submodules/Display/Display/CAAnimationUtils.swift index 81cf94009a..a1e588563b 100644 --- a/submodules/Display/Display/CAAnimationUtils.swift +++ b/submodules/Display/Display/CAAnimationUtils.swift @@ -160,7 +160,7 @@ public extension CALayer { self.add(animation, forKey: keyPath) } - public func animateSpring(from: AnyObject, to: AnyObject, keyPath: String, duration: Double, initialVelocity: CGFloat = 0.0, damping: CGFloat = 88.0, removeOnCompletion: Bool = true, additive: Bool = false, completion: ((Bool) -> Void)? = nil) { + public func animateSpring(from: AnyObject, to: AnyObject, keyPath: String, duration: Double, delay: Double = 0.0, initialVelocity: CGFloat = 0.0, damping: CGFloat = 88.0, removeOnCompletion: Bool = true, additive: Bool = false, completion: ((Bool) -> Void)? = nil) { let animation: CABasicAnimation if #available(iOS 9.0, *) { animation = makeSpringBounceAnimation(keyPath, initialVelocity, damping) @@ -181,6 +181,11 @@ public extension CALayer { speed = Float(1.0) / k } + if !delay.isZero { + animation.beginTime = CACurrentMediaTime() + delay + animation.fillMode = .both + } + animation.speed = speed * Float(animation.duration / duration) animation.isAdditive = additive diff --git a/submodules/Display/Display/ContextMenuActionNode.swift b/submodules/Display/Display/ContextMenuActionNode.swift index 64da141003..a26ed60144 100644 --- a/submodules/Display/Display/ContextMenuActionNode.swift +++ b/submodules/Display/Display/ContextMenuActionNode.swift @@ -54,7 +54,7 @@ final class ContextMenuActionNode: ASDisplayNode { super.init() - self.backgroundColor = UIColor(white: 0.0, alpha: 0.8) + self.backgroundColor = UIColor(rgb: 0x2f2f2f) if let textNode = self.textNode { self.addSubnode(textNode) } @@ -63,7 +63,7 @@ final class ContextMenuActionNode: ASDisplayNode { } self.button.highligthedChanged = { [weak self] highlighted in - self?.backgroundColor = highlighted ? UIColor(white: 0.0, alpha: 0.4) : UIColor(white: 0.0, alpha: 0.8) + self?.backgroundColor = highlighted ? UIColor(rgb: 0x8c8e8e) : UIColor(rgb: 0x2f2f2f) } self.view.addSubview(self.button) self.addSubnode(self.actionArea) diff --git a/submodules/Display/Display/ContextMenuContainerNode.swift b/submodules/Display/Display/ContextMenuContainerNode.swift index fe191a6f23..aea6ae2062 100644 --- a/submodules/Display/Display/ContextMenuContainerNode.swift +++ b/submodules/Display/Display/ContextMenuContainerNode.swift @@ -27,7 +27,7 @@ public final class ContextMenuContainerNode: ASDisplayNode { super.init() - self.backgroundColor = UIColor(rgb: 0xeaecec) + self.backgroundColor = UIColor(rgb: 0x8c8e8e) //self.view.addSubview(self.effectView) //self.effectView.mask = self.maskView self.view.mask = self.maskView diff --git a/submodules/Display/Display/ContextMenuNode.swift b/submodules/Display/Display/ContextMenuNode.swift index 7c3f9ffc4b..e1f37bb529 100644 --- a/submodules/Display/Display/ContextMenuNode.swift +++ b/submodules/Display/Display/ContextMenuNode.swift @@ -38,9 +38,9 @@ private final class ContextMenuContentScrollNode: ASDisplayNode { self.rightShadow.transform = CATransform3DMakeScale(-1.0, 1.0, 1.0) self.leftOverscrollNode = ASDisplayNode() - self.leftOverscrollNode.backgroundColor = UIColor(white: 0.0, alpha: 0.8) + //self.leftOverscrollNode.backgroundColor = UIColor(white: 0.0, alpha: 0.8) self.rightOverscrollNode = ASDisplayNode() - self.rightOverscrollNode.backgroundColor = UIColor(white: 0.0, alpha: 0.8) + //self.rightOverscrollNode.backgroundColor = UIColor(white: 0.0, alpha: 0.8) super.init() @@ -55,8 +55,8 @@ private final class ContextMenuContentScrollNode: ASDisplayNode { override func didLoad() { super.didLoad() - let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:))) - self.view.addGestureRecognizer(panRecognizer) + //let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:))) + //self.view.addGestureRecognizer(panRecognizer) } @objc func panGesture(_ recognizer: UIPanGestureRecognizer) { @@ -228,9 +228,12 @@ final class ContextMenuNode: ASDisplayNode { self.containerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: containerPosition.x, y: containerPosition.y + (self.arrowOnBottom ? 1.0 : -1.0) * self.containerNode.bounds.size.height / 2.0)), to: NSValue(cgPoint: containerPosition), keyPath: "position", duration: 0.4) } - self.containerNode.allowsGroupOpacity = true - self.containerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1, completion: { [weak self] _ in - self?.containerNode.allowsGroupOpacity = false + self.allowsGroupOpacity = true + self.layer.rasterizationScale = UIScreen.main.scale + self.layer.shouldRasterize = true + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1, completion: { [weak self] _ in + self?.allowsGroupOpacity = false + self?.layer.shouldRasterize = false }) if let feedback = self.feedback { @@ -239,9 +242,12 @@ final class ContextMenuNode: ASDisplayNode { } func animateOut(bounce: Bool, completion: @escaping () -> Void) { - self.containerNode.allowsGroupOpacity = true - self.containerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak self] _ in - self?.containerNode.allowsGroupOpacity = false + self.allowsGroupOpacity = true + self.layer.rasterizationScale = UIScreen.main.scale + self.layer.shouldRasterize = true + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak self] _ in + self?.allowsGroupOpacity = false + self?.layer.shouldRasterize = false completion() }) } diff --git a/submodules/MtProtoKit/MTAes.m b/submodules/MtProtoKit/MTAes.m index 0632586791..357d52932d 100644 --- a/submodules/MtProtoKit/MTAes.m +++ b/submodules/MtProtoKit/MTAes.m @@ -107,6 +107,9 @@ void MyAesIgeEncrypt(const void *inBytes, int length, void *outBytes, const void } void MyAesIgeDecrypt(const void *inBytes, int length, void *outBytes, const void *key, int keyLength, void *iv) { + assert(length % 16 == 0); + assert(length >= 0); + unsigned char aesIv[AES_BLOCK_SIZE]; memcpy(aesIv, iv, AES_BLOCK_SIZE); unsigned char ccIv[AES_BLOCK_SIZE]; diff --git a/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m b/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m index 677be9ee00..3dacdf6833 100644 --- a/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m +++ b/submodules/MtProtoKit/MTProtoKit/MTTcpConnection.m @@ -32,6 +32,99 @@ # import #endif +#import + +static BIGNUM *get_y2(BIGNUM *x, const BIGNUM *mod, BN_CTX *big_num_context) { + // returns y^2 = x^3 + 486662 * x^2 + x + BIGNUM *y = BN_dup(x); + assert(y != NULL); + BIGNUM *coef = BN_new(); + BN_set_word(coef, 486662); + BN_mod_add(y, y, coef, mod, big_num_context); + BN_mod_mul(y, y, x, mod, big_num_context); + BN_one(coef); + BN_mod_add(y, y, coef, mod, big_num_context); + BN_mod_mul(y, y, x, mod, big_num_context); + BN_clear_free(coef); + return y; +} + +static BIGNUM *get_double_x(BIGNUM *x, const BIGNUM *mod, BN_CTX *big_num_context) { + // returns x_2 =(x^2 - 1)^2/(4*y^2) + BIGNUM *denominator = get_y2(x, mod, big_num_context); + assert(denominator != NULL); + BIGNUM *coef = BN_new(); + BN_set_word(coef, 4); + BN_mod_mul(denominator, denominator, coef, mod, big_num_context); + + BIGNUM *numerator = BN_new(); + assert(numerator != NULL); + BN_mod_mul(numerator, x, x, mod, big_num_context); + BN_one(coef); + BN_mod_sub(numerator, numerator, coef, mod, big_num_context); + BN_mod_mul(numerator, numerator, numerator, mod, big_num_context); + + BN_mod_inverse(denominator, denominator, mod, big_num_context); + BN_mod_mul(numerator, numerator, denominator, mod, big_num_context); + + BN_clear_free(coef); + BN_clear_free(denominator); + return numerator; +} + +static void generate_public_key(unsigned char key[32]) { + BIGNUM *mod = NULL; + BN_hex2bn(&mod, "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"); + BIGNUM *pow = NULL; + BN_hex2bn(&pow, "3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"); + BN_CTX *big_num_context = BN_CTX_new(); + assert(big_num_context != NULL); + + BIGNUM *x = BN_new(); + while (1) { + int randomResult = SecRandomCopyBytes(kSecRandomDefault, 32, key); + assert(randomResult == errSecSuccess); + + key[31] &= 127; + BN_bin2bn(key, 32, x); + assert(x != NULL); + BN_mod_mul(x, x, x, mod, big_num_context); + + BIGNUM *y = get_y2(x, mod, big_num_context); + + BIGNUM *r = BN_new(); + BN_mod_exp(r, y, pow, mod, big_num_context); + BN_clear_free(y); + if (BN_is_one(r)) { + BN_clear_free(r); + break; + } + BN_clear_free(r); + } + + int i; + for (i = 0; i < 3; i++) { + BIGNUM *x2 = get_double_x(x, mod, big_num_context); + BN_clear_free(x); + x = x2; + } + + int num_size = BN_num_bytes(x); + assert(num_size <= 32); + memset(key, '\0', 32 - num_size); + BN_bn2bin(x, key + (32 - num_size)); + for (i = 0; i < 16; i++) { + unsigned char t = key[i]; + key[i] = key[31 - i]; + key[31 - i] = t; + } + + BN_clear_free(x); + BN_CTX_free(big_num_context); + BN_clear_free(pow); + BN_clear_free(mod); +} + @interface MTTcpConnectionData : NSObject @property (nonatomic, strong, readonly) NSString *ip; @@ -506,8 +599,8 @@ struct ctr_state { [helloData appendBytes:s6 length:117]; uint8_t r2[32]; - result = SecRandomCopyBytes(nil, 32, r2); - assert(result == errSecSuccess); + generate_public_key(r2); + [helloData appendBytes:r2 length:32]; uint8_t s9[35] = { 0x00, 0x2d, 0x00, 0x02, 0x01, 0x01, 0x00, 0x2b, 0x00, 0x09, 0x08, 0x03, 0x04, 0x03, 0x03, 0x03, 0x02, 0x03, 0x01, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x15 }; diff --git a/submodules/TelegramCore/TelegramCore/ContactManagement.swift b/submodules/TelegramCore/TelegramCore/ContactManagement.swift index d590838a5b..ca6bdce912 100644 --- a/submodules/TelegramCore/TelegramCore/ContactManagement.swift +++ b/submodules/TelegramCore/TelegramCore/ContactManagement.swift @@ -81,8 +81,8 @@ func syncContactsOnce(network: Network, postbox: Postbox, accountPeerId: PeerId) if wasEmpty { var insertSignal: Signal = .complete() - for s in stride(from: 0, to: peers.count, by: 100) { - let partPeers = Array(peers[s ..< min(s + 100, peers.count)]) + for s in stride(from: 0, to: peers.count, by: 500) { + let partPeers = Array(peers[s ..< min(s + 500, peers.count)]) let partSignal = postbox.transaction { transaction -> Void in updatePeers(transaction: transaction, peers: partPeers, update: { return $1 }) var updatedIds = transaction.getContactPeerIds() diff --git a/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift b/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift index c6375e3b8f..325d1fd07e 100644 --- a/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift +++ b/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift @@ -308,7 +308,7 @@ private func pushDeviceContacts(postbox: Postbox, network: Network, importableCo |> switchToLatest } -private let importBatchCount: Int = 100 +private let importBatchCount: Int = 500 private func pushDeviceContactData(postbox: Postbox, network: Network, contacts: [(DeviceContactNormalizedPhoneNumber, ImportableDeviceContactData)]) -> Signal { var batches: Signal = .single(PushDeviceContactsResult(addedReimportAttempts: [:])) diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index b70572f3a2..2a13eb2800 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -210,8 +210,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta ) let message = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628))), primaryTextColor: .white, secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.4), pendingActivityColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaPlaceholderColor: UIColor(rgb: 0x1f1f1f).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x737373), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0x000000), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff))), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor.white.withAlphaComponent(0.5), scamColor: outgoingScamColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: UIColor(rgb: 0x313131).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: outgoingPrimaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff))), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628))), primaryTextColor: .white, secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.4), pendingActivityColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaPlaceholderColor: UIColor(rgb: 0x1f1f1f).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x737373), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0x000000), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff)), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor.white.withAlphaComponent(0.5), scamColor: outgoingScamColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: UIColor(rgb: 0x313131).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: outgoingPrimaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff)), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x1f1f1f), highlightedFill: UIColor(rgb: 0x2a2a2a), stroke: UIColor(rgb: 0x1f1f1f)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x1f1f1f), highlightedFill: UIColor(rgb: 0x2a2a2a), stroke: UIColor(rgb: 0x1f1f1f))), infoPrimaryTextColor: .white, infoLinkTextColor: accentColor, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index ff7dd74cc6..34988cef6d 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -180,8 +180,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta let buttonStrokeColor = accentColor.withMultiplied(hue: 1.014, saturation: 0.56, brightness: 0.64).withAlphaComponent(0.15) let message = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: accentColor, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.585, brightness: 0.23), polls: PresentationThemeChatBubblePolls(radioButton: accentColor.withMultiplied(hue: 0.995, saturation: 0.317, brightness: 0.51), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: mainSeparatorColor, bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white)), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: .white, accentControlColor: .white, mediaActiveControlColor: .white, mediaInactiveControlColor: UIColor(rgb: 0xffffff, alpha: 0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: .white, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.804, brightness: 0.51), polls: PresentationThemeChatBubblePolls(radioButton: .white, radioProgress: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0), highlight: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0).withAlphaComponent(0.12), separator: mainSeparatorColor, bar: .white), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white)), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: accentColor, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.585, brightness: 0.23), polls: PresentationThemeChatBubblePolls(radioButton: accentColor.withMultiplied(hue: 0.995, saturation: 0.317, brightness: 0.51), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: mainSeparatorColor, bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: .white, accentControlColor: .white, mediaActiveControlColor: .white, mediaInactiveControlColor: UIColor(rgb: 0xffffff, alpha: 0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: .white, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.804, brightness: 0.51), polls: PresentationThemeChatBubblePolls(radioButton: .white, radioProgress: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0), highlight: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0).withAlphaComponent(0.12), separator: mainSeparatorColor, bar: .white), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor)), infoPrimaryTextColor: UIColor(rgb: 0xffffff), infoLinkTextColor: accentColor, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index cda4734426..4811caa63a 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -190,8 +190,8 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr ) let message = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x007ee5), accentControlColor: UIColor(rgb: 0x007ee5), mediaActiveControlColor: UIColor(rgb: 0x007ee5), mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xe8ecf0), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: UIColor(rgb: 0x007ee5), highlight: UIColor(rgb: 0x007ee5).withAlphaComponent(0.08), separator: UIColor(rgb: 0xc8c7cc), bar: UIColor(rgb: 0x007ee5)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white)), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE1FFC7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xe1ffc7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x008c09, alpha: 0.8), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x00a700), accentControlColor: UIColor(rgb: 0x3fc33b), mediaActiveControlColor: UIColor(rgb: 0x3fc33b), mediaInactiveControlColor: UIColor(rgb: 0x93d987), pendingActivityColor: UIColor(rgb: 0x42b649), fileTitleColor: UIColor(rgb: 0x3faa3c), fileDescriptionColor: UIColor(rgb: 0x6fb26a), fileDurationColor: UIColor(rgb: 0x008c09, alpha: 0.8), mediaPlaceholderColor: UIColor(rgb: 0xd2f2b6), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x93d987), radioProgress: UIColor(rgb: 0x3fc33b), highlight: UIColor(rgb: 0x3fc33b).withAlphaComponent(0.08), separator: UIColor(rgb: 0x93d987), bar: UIColor(rgb: 0x3fc33b)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white)), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x007ee5), accentControlColor: UIColor(rgb: 0x007ee5), mediaActiveControlColor: UIColor(rgb: 0x007ee5), mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xe8ecf0), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: UIColor(rgb: 0x007ee5), highlight: UIColor(rgb: 0x007ee5).withAlphaComponent(0.08), separator: UIColor(rgb: 0xc8c7cc), bar: UIColor(rgb: 0x007ee5)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE1FFC7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xe1ffc7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x008c09, alpha: 0.8), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x00a700), accentControlColor: UIColor(rgb: 0x3fc33b), mediaActiveControlColor: UIColor(rgb: 0x3fc33b), mediaInactiveControlColor: UIColor(rgb: 0x93d987), pendingActivityColor: UIColor(rgb: 0x42b649), fileTitleColor: UIColor(rgb: 0x3faa3c), fileDescriptionColor: UIColor(rgb: 0x6fb26a), fileDurationColor: UIColor(rgb: 0x008c09, alpha: 0.8), mediaPlaceholderColor: UIColor(rgb: 0xd2f2b6), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x93d987), radioProgress: UIColor(rgb: 0x3fc33b), highlight: UIColor(rgb: 0x3fc33b).withAlphaComponent(0.08), separator: UIColor(rgb: 0x93d987), bar: UIColor(rgb: 0x3fc33b)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), @@ -208,8 +208,8 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr ) let messageDay = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleStrokeColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor)), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleStrokeColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xDADADE), stroke: UIColor(rgb: 0xE5E5EA)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xE5E5EA))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), diff --git a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift index b96fe4d53c..048f54d19c 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift @@ -541,8 +541,10 @@ public final class PresentationThemePartedColors { public let actionButtonsFillColor: PresentationThemeVariableColor public let actionButtonsStrokeColor: PresentationThemeVariableColor public let actionButtonsTextColor: PresentationThemeVariableColor + public let textSelectionColor: UIColor + public let textSelectionKnobColor: UIColor - public init(bubble: PresentationThemeBubbleColor, primaryTextColor: UIColor, secondaryTextColor: UIColor, linkTextColor: UIColor, linkHighlightColor: UIColor, scamColor: UIColor, textHighlightColor: UIColor, accentTextColor: UIColor, accentControlColor: UIColor, mediaActiveControlColor: UIColor, mediaInactiveControlColor: UIColor, pendingActivityColor: UIColor, fileTitleColor: UIColor, fileDescriptionColor: UIColor, fileDurationColor: UIColor, mediaPlaceholderColor: UIColor, polls: PresentationThemeChatBubblePolls, actionButtonsFillColor: PresentationThemeVariableColor, actionButtonsStrokeColor: PresentationThemeVariableColor, actionButtonsTextColor: PresentationThemeVariableColor) { + public init(bubble: PresentationThemeBubbleColor, primaryTextColor: UIColor, secondaryTextColor: UIColor, linkTextColor: UIColor, linkHighlightColor: UIColor, scamColor: UIColor, textHighlightColor: UIColor, accentTextColor: UIColor, accentControlColor: UIColor, mediaActiveControlColor: UIColor, mediaInactiveControlColor: UIColor, pendingActivityColor: UIColor, fileTitleColor: UIColor, fileDescriptionColor: UIColor, fileDurationColor: UIColor, mediaPlaceholderColor: UIColor, polls: PresentationThemeChatBubblePolls, actionButtonsFillColor: PresentationThemeVariableColor, actionButtonsStrokeColor: PresentationThemeVariableColor, actionButtonsTextColor: PresentationThemeVariableColor, textSelectionColor: UIColor, textSelectionKnobColor: UIColor) { self.bubble = bubble self.primaryTextColor = primaryTextColor self.secondaryTextColor = secondaryTextColor @@ -563,6 +565,8 @@ public final class PresentationThemePartedColors { self.actionButtonsFillColor = actionButtonsFillColor self.actionButtonsStrokeColor = actionButtonsStrokeColor self.actionButtonsTextColor = actionButtonsTextColor + self.textSelectionColor = textSelectionColor + self.textSelectionKnobColor = textSelectionKnobColor } } diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index 264e2e1890..bc0078b670 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -915,33 +915,38 @@ extension PresentationThemePartedColors: Codable { case actionButtonsBg case actionButtonsStroke case actionButtonsText + case textSelection + case textSelectionKnob } public convenience init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) - self.init(bubble: try values.decode(PresentationThemeBubbleColor.self, forKey: .bubble), - primaryTextColor: try decodeColor(values, .primaryText), - secondaryTextColor: try decodeColor(values, .secondaryText), - linkTextColor: try decodeColor(values, .linkText), - linkHighlightColor: try decodeColor(values, .linkHighlight), - scamColor: try decodeColor(values, .scam), - textHighlightColor: try decodeColor(values, .textHighlight), - accentTextColor: try decodeColor(values, .accentText), - accentControlColor: try decodeColor(values, .accentControl), - mediaActiveControlColor: try decodeColor(values, .mediaActiveControl), - mediaInactiveControlColor: try decodeColor(values, .mediaInactiveControl), - pendingActivityColor: try decodeColor(values, .pendingActivity), - fileTitleColor: try decodeColor(values, .fileTitle), - fileDescriptionColor: try decodeColor(values, .fileDescription), - fileDurationColor: try decodeColor(values, .fileDuration), - mediaPlaceholderColor: try decodeColor(values, .mediaPlaceholder), - polls: try values.decode(PresentationThemeChatBubblePolls.self, forKey: .polls), - actionButtonsFillColor: try values.decode(PresentationThemeVariableColor.self, forKey: .actionButtonsBg), - actionButtonsStrokeColor: try values.decode(PresentationThemeVariableColor.self, forKey: .actionButtonsStroke), - actionButtonsTextColor: try values.decode(PresentationThemeVariableColor.self, forKey: .actionButtonsText)) + self.init( + bubble: try values.decode(PresentationThemeBubbleColor.self, forKey: .bubble), + primaryTextColor: try decodeColor(values, .primaryText), + secondaryTextColor: try decodeColor(values, .secondaryText), + linkTextColor: try decodeColor(values, .linkText), + linkHighlightColor: try decodeColor(values, .linkHighlight), + scamColor: try decodeColor(values, .scam), + textHighlightColor: try decodeColor(values, .textHighlight), + accentTextColor: try decodeColor(values, .accentText), + accentControlColor: try decodeColor(values, .accentControl), + mediaActiveControlColor: try decodeColor(values, .mediaActiveControl), + mediaInactiveControlColor: try decodeColor(values, .mediaInactiveControl), + pendingActivityColor: try decodeColor(values, .pendingActivity), + fileTitleColor: try decodeColor(values, .fileTitle), + fileDescriptionColor: try decodeColor(values, .fileDescription), + fileDurationColor: try decodeColor(values, .fileDuration), + mediaPlaceholderColor: try decodeColor(values, .mediaPlaceholder), + polls: try values.decode(PresentationThemeChatBubblePolls.self, forKey: .polls), + actionButtonsFillColor: try values.decode(PresentationThemeVariableColor.self, forKey: .actionButtonsBg), + actionButtonsStrokeColor: try values.decode(PresentationThemeVariableColor.self, forKey: .actionButtonsStroke), + actionButtonsTextColor: try values.decode(PresentationThemeVariableColor.self, forKey: .actionButtonsText), + textSelectionColor: try decodeColor(values, .textSelection), + textSelectionKnobColor: try decodeColor(values, .textSelectionKnob) + ) } - public func encode(to encoder: Encoder) throws { var values = encoder.container(keyedBy: CodingKeys.self) try values.encode(self.bubble, forKey: .bubble) @@ -964,6 +969,8 @@ extension PresentationThemePartedColors: Codable { try values.encode(self.actionButtonsFillColor, forKey: .actionButtonsBg) try values.encode(self.actionButtonsStrokeColor, forKey: .actionButtonsStroke) try values.encode(self.actionButtonsTextColor, forKey: .actionButtonsText) + try encodeColor(&values, self.textSelectionColor, .textSelection) + try encodeColor(&values, self.textSelectionKnobColor, .textSelectionKnob) } } diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Unstar.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Unstar.imageset/Contents.json new file mode 100644 index 0000000000..bd84ab891e --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Unstar.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_lt_unstar.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Unstar.imageset/ic_lt_unstar.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Unstar.imageset/ic_lt_unstar.pdf new file mode 100644 index 0000000000000000000000000000000000000000..551690fa0e1a2b6d220021f9784291a347e3c33f GIT binary patch literal 4649 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 ChatPresentationInterfaceState) { - self.updateChatPresentationInterfaceState(transition: animated ? .animated(duration: 0.4, curve: .spring) : .immediate, interactive: interactive, saveInterfaceState: saveInterfaceState, f) + func updateChatPresentationInterfaceState(animated: Bool = true, interactive: Bool, saveInterfaceState: Bool = false, _ f: (ChatPresentationInterfaceState) -> ChatPresentationInterfaceState, completion: @escaping (ContainedViewLayoutTransition) -> Void = { _ in }) { + self.updateChatPresentationInterfaceState(transition: animated ? .animated(duration: 0.4, curve: .spring) : .immediate, interactive: interactive, saveInterfaceState: saveInterfaceState, f, completion: completion) } - func updateChatPresentationInterfaceState(transition: ContainedViewLayoutTransition, interactive: Bool, saveInterfaceState: Bool = false, _ f: (ChatPresentationInterfaceState) -> ChatPresentationInterfaceState) { + func updateChatPresentationInterfaceState(transition: ContainedViewLayoutTransition, interactive: Bool, saveInterfaceState: Bool = false, _ f: (ChatPresentationInterfaceState) -> ChatPresentationInterfaceState, completion externalCompletion: @escaping (ContainedViewLayoutTransition) -> Void = { _ in }) { + var completion = externalCompletion var temporaryChatPresentationInterfaceState = f(self.presentationInterfaceState) if self.presentationInterfaceState.keyboardButtonsMessage?.visibleButtonKeyboardMarkup != temporaryChatPresentationInterfaceState.keyboardButtonsMessage?.visibleButtonKeyboardMarkup { @@ -4454,64 +4464,64 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G for (kind, update) in contextQueryUpdates { switch update { - case .remove: - if let (_, disposable) = self.contextQueryStates[kind] { - disposable.dispose() - self.contextQueryStates.removeValue(forKey: kind) - - updatedChatPresentationInterfaceState = updatedChatPresentationInterfaceState.updatedInputQueryResult(queryKind: kind, { _ in - return nil - }) - } - case let .update(query, signal): - let currentQueryAndDisposable = self.contextQueryStates[kind] - currentQueryAndDisposable?.1.dispose() + case .remove: + if let (_, disposable) = self.contextQueryStates[kind] { + disposable.dispose() + self.contextQueryStates.removeValue(forKey: kind) - var inScope = true - var inScopeResult: ((ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?)? - self.contextQueryStates[kind] = (query, (signal |> deliverOnMainQueue).start(next: { [weak self] result in - if let strongSelf = self { - if Thread.isMainThread && inScope { - inScope = false - inScopeResult = result - } else { - strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, { - $0.updatedInputQueryResult(queryKind: kind, { previousResult in - return result(previousResult) - }) - }) - } - } - }, error: { [weak self] error in - if let strongSelf = self { - switch error { - case let .inlineBotLocationRequest(peerId): - strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_ShareInlineBotLocationConfirmation, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_Cancel, action: { - let _ = ApplicationSpecificNotice.setInlineBotLocationRequest(accountManager: strongSelf.context.sharedContext.accountManager, peerId: peerId, value: Int32(Date().timeIntervalSince1970 + 10 * 60)).start() - }), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { - let _ = ApplicationSpecificNotice.setInlineBotLocationRequest(accountManager: strongSelf.context.sharedContext.accountManager, peerId: peerId, value: 0).start() - })]), in: .window(.root)) - } - } - })) - inScope = false - if let inScopeResult = inScopeResult { - updatedChatPresentationInterfaceState = updatedChatPresentationInterfaceState.updatedInputQueryResult(queryKind: kind, { previousResult in - return inScopeResult(previousResult) - }) - } + updatedChatPresentationInterfaceState = updatedChatPresentationInterfaceState.updatedInputQueryResult(queryKind: kind, { _ in + return nil + }) + } + case let .update(query, signal): + let currentQueryAndDisposable = self.contextQueryStates[kind] + currentQueryAndDisposable?.1.dispose() - if case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat { - if case .contextRequest = query { - let _ = (ApplicationSpecificNotice.getSecretChatInlineBotUsage(accountManager: self.context.sharedContext.accountManager) - |> deliverOnMainQueue).start(next: { [weak self] value in - if let strongSelf = self, !value { - let _ = ApplicationSpecificNotice.setSecretChatInlineBotUsage(accountManager: strongSelf.context.sharedContext.accountManager).start() - strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_SecretChatContextBotAlert, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - } + var inScope = true + var inScopeResult: ((ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?)? + self.contextQueryStates[kind] = (query, (signal |> deliverOnMainQueue).start(next: { [weak self] result in + if let strongSelf = self { + if Thread.isMainThread && inScope { + inScope = false + inScopeResult = result + } else { + strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, { + $0.updatedInputQueryResult(queryKind: kind, { previousResult in + return result(previousResult) + }) }) } } + }, error: { [weak self] error in + if let strongSelf = self { + switch error { + case let .inlineBotLocationRequest(peerId): + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_ShareInlineBotLocationConfirmation, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_Cancel, action: { + let _ = ApplicationSpecificNotice.setInlineBotLocationRequest(accountManager: strongSelf.context.sharedContext.accountManager, peerId: peerId, value: Int32(Date().timeIntervalSince1970 + 10 * 60)).start() + }), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + let _ = ApplicationSpecificNotice.setInlineBotLocationRequest(accountManager: strongSelf.context.sharedContext.accountManager, peerId: peerId, value: 0).start() + })]), in: .window(.root)) + } + } + })) + inScope = false + if let inScopeResult = inScopeResult { + updatedChatPresentationInterfaceState = updatedChatPresentationInterfaceState.updatedInputQueryResult(queryKind: kind, { previousResult in + return inScopeResult(previousResult) + }) + } + + if case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat { + if case .contextRequest = query { + let _ = (ApplicationSpecificNotice.getSecretChatInlineBotUsage(accountManager: self.context.sharedContext.accountManager) + |> deliverOnMainQueue).start(next: { [weak self] value in + if let strongSelf = self, !value { + let _ = ApplicationSpecificNotice.setSecretChatInlineBotUsage(accountManager: strongSelf.context.sharedContext.accountManager).start() + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_SecretChatContextBotAlert, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + } + }) + } + } } } @@ -4665,7 +4675,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.updateSlowmodeStatus() if self.isNodeLoaded { - self.chatDisplayNode.updateChatPresentationInterfaceState(updatedChatPresentationInterfaceState, transition: transition, interactive: interactive) + self.chatDisplayNode.updateChatPresentationInterfaceState(updatedChatPresentationInterfaceState, transition: transition, interactive: interactive, completion: completion) + } else { + completion(.immediate) } // if let selectionState = self.presentationInterfaceState.interfaceState.selectionState, !selectionState.selectedIds.isEmpty { @@ -4705,8 +4717,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let controllerInteraction = self.controllerInteraction { if updatedChatPresentationInterfaceState.interfaceState.selectionState != controllerInteraction.selectionState { controllerInteraction.selectionState = updatedChatPresentationInterfaceState.interfaceState.selectionState + let isBlackout = controllerInteraction.selectionState != nil + completion = { [weak self] transition in + completion(transition) + (self?.navigationController as? NavigationController)?.updateMasterDetailsBlackout(isBlackout ? .master : nil, transition: transition) + } self.updateItemNodesSelectionStates(animated: transition.isAnimated) - (self.navigationController as? NavigationController)?.updateMasterDetailsBlackout(controllerInteraction.selectionState != nil ? .master : nil, transition: transition) } } @@ -7481,7 +7497,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if canEdit, let message = self.chatDisplayNode.historyNode.firstMessageForEditInCurrentHistoryView() { inputShortcuts.append(KeyShortcut(input: UIKeyCommand.inputUpArrow, action: { [weak self] in if let strongSelf = self { - strongSelf.interfaceInteraction?.setupEditMessage(message.id) + strongSelf.interfaceInteraction?.setupEditMessage(message.id, { _ in }) } })) } diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 9fa8299821..a37570e606 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -183,14 +183,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { private var openStickersDisposable: Disposable? private var displayVideoUnmuteTipDisposable: Disposable? - /*override var accessibilityElements: [Any]? { - get { - var accessibilityElements: [Any] = [] - addAccessibilityChildren(of: self.historyNode, container: self.historyNode, to: &accessibilityElements) - return accessibilityElements - } set(value) { - } - }*/ + private var onLayoutCompletions: [(ContainedViewLayoutTransition) -> Void] = [] init(context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, chatPresentationInterfaceState: ChatPresentationInterfaceState, automaticMediaDownloadSettings: MediaAutoDownloadSettings, navigationBar: NavigationBar?, controller: ChatControllerImpl?) { self.context = context @@ -420,7 +413,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition protoTransition: ContainedViewLayoutTransition, listViewTransaction: - (ListViewUpdateSizeAndInsets, CGFloat, Bool) -> Void) { + (ListViewUpdateSizeAndInsets, CGFloat, Bool, @escaping () -> Void) -> Void) { let transition: ContainedViewLayoutTransition if let _ = self.scheduledAnimateInAsOverlayFromNode { transition = .immediate @@ -746,7 +739,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } else if let _ = accessoryPanelNode as? ForwardAccessoryPanelNode { strongSelf.requestUpdateChatInterfaceState(true, false, { $0.withUpdatedForwardMessageIds(nil) }) } else if let _ = accessoryPanelNode as? EditAccessoryPanelNode { - strongSelf.interfaceInteraction?.setupEditMessage(nil) + strongSelf.interfaceInteraction?.setupEditMessage(nil, { _ in }) } else if let _ = accessoryPanelNode as? WebpagePreviewAccessoryPanelNode { strongSelf.dismissUrlPreview() } @@ -1019,7 +1012,11 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { listInsets.top = listInsets.top + messageActionSheetControllerAdditionalInset } - listViewTransaction(ListViewUpdateSizeAndInsets(size: contentBounds.size, insets: listInsets, scrollIndicatorInsets: listScrollIndicatorInsets, duration: duration, curve: listViewCurve, ensureTopInsetForOverlayHighlightedItems: ensureTopInsetForOverlayHighlightedItems), additionalScrollDistance, scrollToTop) + listViewTransaction(ListViewUpdateSizeAndInsets(size: contentBounds.size, insets: listInsets, scrollIndicatorInsets: listScrollIndicatorInsets, duration: duration, curve: listViewCurve, ensureTopInsetForOverlayHighlightedItems: ensureTopInsetForOverlayHighlightedItems), additionalScrollDistance, scrollToTop, { [weak self] in + if let strongSelf = self { + strongSelf.notifyTransitionCompletionListeners(transition: transition) + } + }) let navigateButtonsSize = self.navigateButtons.updateLayout(transition: transition) var navigateButtonsFrame = CGRect(origin: CGPoint(x: layout.size.width - layout.safeInsets.right - navigateButtonsSize.width - 6.0, y: layout.size.height - containerInsets.bottom - inputPanelsHeight - navigateButtonsSize.height - 6.0 - bottomOverflowOffset), size: navigateButtonsSize) @@ -1285,6 +1282,16 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.derivedLayoutState = ChatControllerNodeDerivedLayoutState(inputContextPanelsFrame: inputContextPanelsFrame, inputContextPanelsOverMainPanelFrame: inputContextPanelsOverMainPanelFrame, inputNodeHeight: inputNodeHeightAndOverflow?.0, upperInputPositionBound: inputNodeHeightAndOverflow?.0 != nil ? self.upperInputPositionBound : nil) } + private func notifyTransitionCompletionListeners(transition: ContainedViewLayoutTransition) { + if !self.onLayoutCompletions.isEmpty { + let onLayoutCompletions = self.onLayoutCompletions + self.onLayoutCompletions = [] + for completion in onLayoutCompletions { + completion(transition) + } + } + } + private func chatPresentationInterfaceStateRequiresInputFocus(_ state: ChatPresentationInterfaceState) -> Bool { switch state.inputMode { case .text: @@ -1298,7 +1305,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } - func updateChatPresentationInterfaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, transition: ContainedViewLayoutTransition, interactive: Bool) { + func updateChatPresentationInterfaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, transition: ContainedViewLayoutTransition, interactive: Bool, completion: @escaping (ContainedViewLayoutTransition) -> Void) { self.selectedMessages = chatPresentationInterfaceState.interfaceState.selectionState?.selectedIds if let textInputPanelNode = self.textInputPanelNode { @@ -1306,6 +1313,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } if self.chatPresentationInterfaceState != chatPresentationInterfaceState { + self.onLayoutCompletions.append(completion) + let themeUpdated = self.chatPresentationInterfaceState.theme !== chatPresentationInterfaceState.theme if self.chatPresentationInterfaceState.chatWallpaper != chatPresentationInterfaceState.chatWallpaper { @@ -1445,6 +1454,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } } + } else { + completion(.immediate) } if self.reactionContainerNode.supernode == nil { @@ -1572,7 +1583,12 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } func frameForVisibleArea() -> CGRect { - return CGRect(origin: CGPoint(x: self.visibleAreaInset.left, y: self.visibleAreaInset.top), size: CGSize(width: self.bounds.size.width - self.visibleAreaInset.left - self.visibleAreaInset.right, height: self.bounds.size.height - self.visibleAreaInset.top - self.visibleAreaInset.bottom)) + let rect = CGRect(origin: CGPoint(x: self.visibleAreaInset.left, y: self.visibleAreaInset.top), size: CGSize(width: self.bounds.size.width - self.visibleAreaInset.left - self.visibleAreaInset.right, height: self.bounds.size.height - self.visibleAreaInset.top - self.visibleAreaInset.bottom)) + if let containerNode = self.containerNode { + return containerNode.view.convert(rect, to: self.view) + } else { + return rect + } } func frameForInputPanelAccessoryButton(_ item: ChatTextInputAccessoryItem) -> CGRect? { @@ -1841,8 +1857,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } } - self.containerLayoutUpdated(layout, navigationBarHeight: navigationBarHeight, transition: transition, listViewTransaction: { updateSizeAndInsets, additionalScrollDistance, scrollToTop in - self.historyNode.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: additionalScrollDistance, scrollToTop: scrollToTop) + self.containerLayoutUpdated(layout, navigationBarHeight: navigationBarHeight, transition: transition, listViewTransaction: { updateSizeAndInsets, additionalScrollDistance, scrollToTop, completion in + self.historyNode.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: additionalScrollDistance, scrollToTop: scrollToTop, completion: completion) }) if animateIn, let controller = self.messageActionSheetController?.0 { controller.controllerNode.animateIn(transition: transition) @@ -1926,8 +1942,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { private func updateLayoutInternal(transition: ContainedViewLayoutTransition) { if let (layout, navigationHeight) = self.validLayout { - self.containerLayoutUpdated(layout, navigationBarHeight: navigationHeight, transition: transition, listViewTransaction: { updateSizeAndInsets, additionalScrollDistance, scrollToTop in - self.historyNode.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: additionalScrollDistance, scrollToTop: scrollToTop) + self.containerLayoutUpdated(layout, navigationBarHeight: navigationHeight, transition: transition, listViewTransaction: { updateSizeAndInsets, additionalScrollDistance, scrollToTop, completion in + self.historyNode.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: additionalScrollDistance, scrollToTop: scrollToTop, completion: completion) }) } } @@ -2108,7 +2124,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } func animateOut(completion: (() -> Void)? = nil) { - self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false, completion: { [weak self] _ in + self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false, completion: { _ in completion?() }) } diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index 90d36c02c4..c69e4d0815 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -1364,15 +1364,17 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { } public func updateLayout(transition: ContainedViewLayoutTransition, updateSizeAndInsets: ListViewUpdateSizeAndInsets) { - self.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: 0.0, scrollToTop: false) + self.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: 0.0, scrollToTop: false, completion: {}) } - public func updateLayout(transition: ContainedViewLayoutTransition, updateSizeAndInsets: ListViewUpdateSizeAndInsets, additionalScrollDistance: CGFloat, scrollToTop: Bool) { + public func updateLayout(transition: ContainedViewLayoutTransition, updateSizeAndInsets: ListViewUpdateSizeAndInsets, additionalScrollDistance: CGFloat, scrollToTop: Bool, completion: @escaping () -> Void) { var scrollToItem: ListViewScrollToItem? if scrollToTop, case .known = self.visibleContentOffset() { scrollToItem = ListViewScrollToItem(index: 0, position: .top(0.0), animated: true, curve: .Spring(duration: updateSizeAndInsets.duration), directionHint: .Up) } - self.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: scrollToItem, additionalScrollDistance: scrollToTop ? 0.0 : additionalScrollDistance, updateSizeAndInsets: updateSizeAndInsets, stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) + self.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: scrollToItem, additionalScrollDistance: scrollToTop ? 0.0 : additionalScrollDistance, updateSizeAndInsets: updateSizeAndInsets, stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in + completion() + }) if !self.dequeuedInitialTransitionOnLayout { self.dequeuedInitialTransitionOnLayout = true diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift index d1e7c1b6cd..7b56e4f7a3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift @@ -365,7 +365,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: if let starStatus = data.starStatus { actions.append(.action(ContextMenuActionItem(text: starStatus ? chatPresentationInterfaceState.strings.Stickers_RemoveFromFavorites : chatPresentationInterfaceState.strings.Stickers_AddToFavorites, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Rate"), color: theme.actionSheet.primaryTextColor) + return generateTintedImage(image: starStatus ? UIImage(bundleImageName: "Chat/Context Menu/Unstar") : UIImage(bundleImageName: "Chat/Context Menu/Rate"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in interfaceInteraction.toggleMessageStickerStarred(messages[0].id) f(.default) @@ -376,8 +376,9 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_ContextMenuReply, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Reply"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in - interfaceInteraction.setupReplyMessage(messages[0].id) - f(.dismissWithoutContent) + interfaceInteraction.setupReplyMessage(messages[0].id, { transition in + f(.custom(transition)) + }) }))) } @@ -403,8 +404,9 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_MessageDialogEdit, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in - interfaceInteraction.setupEditMessage(messages[0].id) - f(.dismissWithoutContent) + interfaceInteraction.setupEditMessage(messages[0].id, { transition in + f(.custom(transition)) + }) }))) } @@ -551,13 +553,13 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: let presentationData = context.sharedContext.currentPresentationData.with { $0 } if channel.addressName == nil { - controllerInteraction.presentController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.Conversation_PrivateMessageLinkCopied, true)), nil) + controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.Conversation_PrivateMessageLinkCopied, true)), nil) } else { - controllerInteraction.presentController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.GroupInfo_InviteLink_CopyAlert_Success, false)), nil) + controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.GroupInfo_InviteLink_CopyAlert_Success, false)), nil) } } }) - f(.dismissWithoutContent) + f(.default) }))) } @@ -667,8 +669,9 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_ContextMenuMore, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/More"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in - interfaceInteraction.beginMessageSelection(selectAll ? messages.map { $0.id } : [message.id]) - f(.default) + interfaceInteraction.beginMessageSelection(selectAll ? messages.map { $0.id } : [message.id], { transition in + f(.custom(transition)) + }) }))) } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 400a5414fa..dce649cccd 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -977,12 +977,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DMakeTranslation(offset, 0.0, 0.0); if animated { - selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4) + selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2) if !incoming { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) + selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) } } } @@ -992,13 +992,13 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DIdentity if animated { - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4, completion: { [weak selectionNode]_ in + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2, completion: { [weak selectionNode]_ in selectionNode?.removeFromSupernode() }) - selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) + selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) if CGFloat(0.0).isLessThanOrEqualTo(selectionNode.frame.origin.x) { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false) } } else { selectionNode.removeFromSupernode() diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 8086c07788..0254aee299 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -2092,6 +2092,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode break } self.contextSourceNode.contentRect = backgroundFrame.offsetBy(dx: incomingOffset, dy: 0.0) + if !self.contextSourceNode.isExtractedToContextPreview { + if let (rect, size) = self.absoluteRect { + self.updateAbsoluteRect(rect, within: size) + } + } } self.messageAccessibilityArea.frame = backgroundFrame @@ -2615,12 +2620,12 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DMakeTranslation(offset, 0.0, 0.0); if animated { - selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4) + selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2) if !incoming { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) + selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) } } } @@ -2630,13 +2635,13 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DIdentity if animated { - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4, completion: { [weak selectionNode]_ in + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2, completion: { [weak selectionNode]_ in selectionNode?.removeFromSupernode() }) - selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) + selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) if CGFloat(0.0).isLessThanOrEqualTo(selectionNode.frame.origin.x) { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false) } } else { selectionNode.removeFromSupernode() diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift index f0763787e9..b49d6a8ec8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift @@ -773,12 +773,12 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DMakeTranslation(offset, 0.0, 0.0); if animated { - selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4) + selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2) if !incoming { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) + selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) } } } @@ -788,13 +788,13 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DIdentity if animated { - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4, completion: { [weak selectionNode]_ in + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2, completion: { [weak selectionNode]_ in selectionNode?.removeFromSupernode() }) - selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) + selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) if CGFloat(0.0).isLessThanOrEqualTo(selectionNode.frame.origin.x) { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false) } } else { selectionNode.removeFromSupernode() diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift index eeb2a51b28..b24d2612e6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift @@ -790,12 +790,12 @@ class ChatMessageStickerItemNode: ChatMessageItemView { let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DMakeTranslation(offset, 0.0, 0.0); if animated { - selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4) + selectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2) if !incoming { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) + selectionNode.layer.animatePosition(from: CGPoint(x: position.x - 42.0, y: position.y), to: position, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) } } } @@ -816,13 +816,13 @@ class ChatMessageStickerItemNode: ChatMessageItemView { let previousSubnodeTransform = self.subnodeTransform self.subnodeTransform = CATransform3DIdentity if animated { - self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.4, completion: { [weak selectionNode]_ in + self.layer.animate(from: NSValue(caTransform3D: previousSubnodeTransform), to: NSValue(caTransform3D: self.subnodeTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2, completion: { [weak selectionNode]_ in selectionNode?.removeFromSupernode() }) - selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) + selectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) if CGFloat(0.0).isLessThanOrEqualTo(selectionNode.frame.origin.x) { let position = selectionNode.layer.position - selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + selectionNode.layer.animatePosition(from: position, to: CGPoint(x: position.x - 42.0, y: position.y), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false) } } else { selectionNode.removeFromSupernode() diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 0573f6e787..3fec6bc3d9 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -522,7 +522,9 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { if !value { if let textSelectionNode = self.textSelectionNode { self.textSelectionNode = nil + textSelectionNode.highlightAreaNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) textSelectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak textSelectionNode] _ in + textSelectionNode?.highlightAreaNode.removeFromSupernode() textSelectionNode?.removeFromSupernode() }) } @@ -532,7 +534,17 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { override func updateIsExtractedToContextPreview(_ value: Bool) { if value { if self.textSelectionNode == nil, let item = self.item, let rootNode = item.controllerInteraction.chatControllerNode() { - let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: item.presentationData.theme.theme.list.itemAccentColor.withAlphaComponent(0.5), knob: item.presentationData.theme.theme.list.itemAccentColor), textNode: self.textNode, updateIsActive: { [weak self] value in + let selectionColor: UIColor + let knobColor: UIColor + if item.message.effectivelyIncoming(item.context.account.peerId) { + selectionColor = item.presentationData.theme.theme.chat.message.incoming.textSelectionColor + knobColor = item.presentationData.theme.theme.chat.message.incoming.textSelectionKnobColor + } else { + selectionColor = item.presentationData.theme.theme.chat.message.outgoing.textSelectionColor + knobColor = item.presentationData.theme.theme.chat.message.outgoing.textSelectionKnobColor + } + + let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: selectionColor, knob: knobColor), textNode: self.textNode, updateIsActive: { [weak self] value in self?.updateIsTextSelectionActive?(value) }, present: { [weak self] c, a in self?.item?.controllerInteraction.presentGlobalOverlayController(c, a) @@ -544,12 +556,16 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { }) self.textSelectionNode = textSelectionNode self.addSubnode(textSelectionNode) + self.insertSubnode(textSelectionNode.highlightAreaNode, belowSubnode: self.textNode) textSelectionNode.frame = self.textNode.frame + textSelectionNode.highlightAreaNode.frame = self.textNode.frame } } else if let textSelectionNode = self.textSelectionNode { self.textSelectionNode = nil self.updateIsTextSelectionActive?(false) + textSelectionNode.highlightAreaNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) textSelectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak textSelectionNode] _ in + textSelectionNode?.highlightAreaNode.removeFromSupernode() textSelectionNode?.removeFromSupernode() }) } diff --git a/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift index 701b926da3..cc9e6adde1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift @@ -45,9 +45,9 @@ enum ChatPanelRestrictionInfoDisplayType { } final class ChatPanelInterfaceInteraction { - let setupReplyMessage: (MessageId) -> Void - let setupEditMessage: (MessageId?) -> Void - let beginMessageSelection: ([MessageId]) -> Void + let setupReplyMessage: (MessageId, @escaping (ContainedViewLayoutTransition) -> Void) -> Void + let setupEditMessage: (MessageId?, @escaping (ContainedViewLayoutTransition) -> Void) -> Void + let beginMessageSelection: ([MessageId], @escaping (ContainedViewLayoutTransition) -> Void) -> Void let deleteSelectedMessages: () -> Void let reportSelectedMessages: () -> Void let reportMessages: ([Message], ContextController?) -> Void @@ -112,7 +112,7 @@ final class ChatPanelInterfaceInteraction { let openScheduledMessages: () -> Void let statuses: ChatPanelInterfaceInteractionStatuses? - init(setupReplyMessage: @escaping (MessageId) -> Void, setupEditMessage: @escaping (MessageId?) -> Void, beginMessageSelection: @escaping ([MessageId]) -> Void, deleteSelectedMessages: @escaping () -> Void, reportSelectedMessages: @escaping () -> Void, reportMessages: @escaping ([Message], ContextController?) -> Void, deleteMessages: @escaping ([Message], ContextController?, @escaping (ContextMenuActionResult) -> Void) -> Void, forwardSelectedMessages: @escaping () -> Void, forwardCurrentForwardMessages: @escaping () -> Void, forwardMessages: @escaping ([Message]) -> Void, shareSelectedMessages: @escaping () -> Void, updateTextInputStateAndMode: @escaping ((ChatTextInputState, ChatInputMode) -> (ChatTextInputState, ChatInputMode)) -> Void, updateInputModeAndDismissedButtonKeyboardMessageId: @escaping ((ChatPresentationInterfaceState) -> (ChatInputMode, MessageId?)) -> Void, openStickers: @escaping () -> Void, editMessage: @escaping () -> Void, beginMessageSearch: @escaping (ChatSearchDomain, String) -> Void, dismissMessageSearch: @escaping () -> Void, updateMessageSearch: @escaping (String) -> Void, navigateMessageSearch: @escaping (ChatPanelSearchNavigationAction) -> Void, openCalendarSearch: @escaping () -> Void, toggleMembersSearch: @escaping (Bool) -> Void, navigateToMessage: @escaping (MessageId) -> Void, navigateToChat: @escaping (PeerId) -> Void, openPeerInfo: @escaping () -> Void, togglePeerNotifications: @escaping () -> Void, sendContextResult: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, sendBotCommand: @escaping (Peer, String) -> Void, sendBotStart: @escaping (String?) -> Void, botSwitchChatWithPayload: @escaping (PeerId, String) -> Void, beginMediaRecording: @escaping (Bool) -> Void, finishMediaRecording: @escaping (ChatFinishMediaRecordingAction) -> Void, stopMediaRecording: @escaping () -> Void, lockMediaRecording: @escaping () -> Void, deleteRecordedMedia: @escaping () -> Void, sendRecordedMedia: @escaping () -> Void, displayRestrictedInfo: @escaping (ChatPanelRestrictionInfoSubject, ChatPanelRestrictionInfoDisplayType) -> Void, displayVideoUnmuteTip: @escaping (CGPoint?) -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, unblockPeer: @escaping () -> Void, pinMessage: @escaping (MessageId) -> Void, unpinMessage: @escaping () -> Void, shareAccountContact: @escaping () -> Void, reportPeer: @escaping () -> Void, presentPeerContact: @escaping () -> Void, dismissReportPeer: @escaping () -> Void, deleteChat: @escaping () -> Void, beginCall: @escaping () -> Void, toggleMessageStickerStarred: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, getNavigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, navigateFeed: @escaping () -> Void, openGrouping: @escaping () -> Void, toggleSilentPost: @escaping () -> Void, requestUnvoteInMessage: @escaping (MessageId) -> Void, requestStopPollInMessage: @escaping (MessageId) -> Void, updateInputLanguage: @escaping ((String?) -> String?) -> Void, unarchiveChat: @escaping () -> Void, openLinkEditing: @escaping () -> Void, reportPeerIrrelevantGeoLocation: @escaping () -> Void, displaySlowmodeTooltip: @escaping (ASDisplayNode, CGRect) -> Void, displaySendMessageOptions: @escaping () -> Void, openScheduledMessages: @escaping () -> Void, statuses: ChatPanelInterfaceInteractionStatuses?) { + init(setupReplyMessage: @escaping (MessageId, @escaping (ContainedViewLayoutTransition) -> Void) -> Void, setupEditMessage: @escaping (MessageId?, @escaping (ContainedViewLayoutTransition) -> Void) -> Void, beginMessageSelection: @escaping ([MessageId], @escaping (ContainedViewLayoutTransition) -> Void) -> Void, deleteSelectedMessages: @escaping () -> Void, reportSelectedMessages: @escaping () -> Void, reportMessages: @escaping ([Message], ContextController?) -> Void, deleteMessages: @escaping ([Message], ContextController?, @escaping (ContextMenuActionResult) -> Void) -> Void, forwardSelectedMessages: @escaping () -> Void, forwardCurrentForwardMessages: @escaping () -> Void, forwardMessages: @escaping ([Message]) -> Void, shareSelectedMessages: @escaping () -> Void, updateTextInputStateAndMode: @escaping ((ChatTextInputState, ChatInputMode) -> (ChatTextInputState, ChatInputMode)) -> Void, updateInputModeAndDismissedButtonKeyboardMessageId: @escaping ((ChatPresentationInterfaceState) -> (ChatInputMode, MessageId?)) -> Void, openStickers: @escaping () -> Void, editMessage: @escaping () -> Void, beginMessageSearch: @escaping (ChatSearchDomain, String) -> Void, dismissMessageSearch: @escaping () -> Void, updateMessageSearch: @escaping (String) -> Void, navigateMessageSearch: @escaping (ChatPanelSearchNavigationAction) -> Void, openCalendarSearch: @escaping () -> Void, toggleMembersSearch: @escaping (Bool) -> Void, navigateToMessage: @escaping (MessageId) -> Void, navigateToChat: @escaping (PeerId) -> Void, openPeerInfo: @escaping () -> Void, togglePeerNotifications: @escaping () -> Void, sendContextResult: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, sendBotCommand: @escaping (Peer, String) -> Void, sendBotStart: @escaping (String?) -> Void, botSwitchChatWithPayload: @escaping (PeerId, String) -> Void, beginMediaRecording: @escaping (Bool) -> Void, finishMediaRecording: @escaping (ChatFinishMediaRecordingAction) -> Void, stopMediaRecording: @escaping () -> Void, lockMediaRecording: @escaping () -> Void, deleteRecordedMedia: @escaping () -> Void, sendRecordedMedia: @escaping () -> Void, displayRestrictedInfo: @escaping (ChatPanelRestrictionInfoSubject, ChatPanelRestrictionInfoDisplayType) -> Void, displayVideoUnmuteTip: @escaping (CGPoint?) -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, unblockPeer: @escaping () -> Void, pinMessage: @escaping (MessageId) -> Void, unpinMessage: @escaping () -> Void, shareAccountContact: @escaping () -> Void, reportPeer: @escaping () -> Void, presentPeerContact: @escaping () -> Void, dismissReportPeer: @escaping () -> Void, deleteChat: @escaping () -> Void, beginCall: @escaping () -> Void, toggleMessageStickerStarred: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, getNavigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, navigateFeed: @escaping () -> Void, openGrouping: @escaping () -> Void, toggleSilentPost: @escaping () -> Void, requestUnvoteInMessage: @escaping (MessageId) -> Void, requestStopPollInMessage: @escaping (MessageId) -> Void, updateInputLanguage: @escaping ((String?) -> String?) -> Void, unarchiveChat: @escaping () -> Void, openLinkEditing: @escaping () -> Void, reportPeerIrrelevantGeoLocation: @escaping () -> Void, displaySlowmodeTooltip: @escaping (ASDisplayNode, CGRect) -> Void, displaySendMessageOptions: @escaping () -> Void, openScheduledMessages: @escaping () -> Void, statuses: ChatPanelInterfaceInteractionStatuses?) { self.setupReplyMessage = setupReplyMessage self.setupEditMessage = setupEditMessage self.beginMessageSelection = beginMessageSelection diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift index 5fb8c6cbab..daf1570a2f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift @@ -42,9 +42,9 @@ final class ChatRecentActionsController: TelegramBaseController { } }) - self.panelInteraction = ChatPanelInterfaceInteraction(setupReplyMessage: { _ in - }, setupEditMessage: { _ in - }, beginMessageSelection: { _ in + self.panelInteraction = ChatPanelInterfaceInteraction(setupReplyMessage: { _, _ in + }, setupEditMessage: { _, _ in + }, beginMessageSelection: { _, _ in }, deleteSelectedMessages: { }, reportSelectedMessages: { }, reportMessages: { _, _ in diff --git a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift index f68c8f7c9b..efb449495c 100644 --- a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift +++ b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift @@ -41,9 +41,9 @@ public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParam controller.activateInput() } if let botStart = params.botStart { - controller.updateChatPresentationInterfaceState(interactive: false) { state -> ChatPresentationInterfaceState in + controller.updateChatPresentationInterfaceState(interactive: false, { state -> ChatPresentationInterfaceState in return state.updatedBotStartPayload(botStart.payload) - } + }) } found = true break @@ -56,9 +56,9 @@ public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParam if let chatController = params.chatController as? ChatControllerImpl { controller = chatController if let botStart = params.botStart { - controller.updateChatPresentationInterfaceState(interactive: false) { state -> ChatPresentationInterfaceState in + controller.updateChatPresentationInterfaceState(interactive: false, { state -> ChatPresentationInterfaceState in return state.updatedBotStartPayload(botStart.payload) - } + }) } } else { controller = ChatControllerImpl(context: params.context, chatLocation: params.chatLocation, subject: params.subject, botStart: params.botStart) diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index 2e17002c98..ae18dd209a 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -296,9 +296,9 @@ public class PeerMediaCollectionController: TelegramBaseController { self.controllerInteraction = controllerInteraction - self.interfaceInteraction = ChatPanelInterfaceInteraction(setupReplyMessage: { _ in - }, setupEditMessage: { _ in - }, beginMessageSelection: { _ in + self.interfaceInteraction = ChatPanelInterfaceInteraction(setupReplyMessage: { _, _ in + }, setupEditMessage: { _, _ in + }, beginMessageSelection: { _, _ in }, deleteSelectedMessages: { [weak self] in if let strongSelf = self, let messageIds = strongSelf.interfaceState.selectionState?.selectedIds { strongSelf.deleteMessages(messageIds) diff --git a/submodules/TextSelectionNode/Sources/TextSelectionNode.swift b/submodules/TextSelectionNode/Sources/TextSelectionNode.swift index 858b521718..96fd26e427 100644 --- a/submodules/TextSelectionNode/Sources/TextSelectionNode.swift +++ b/submodules/TextSelectionNode/Sources/TextSelectionNode.swift @@ -197,6 +197,8 @@ public final class TextSelectionNode: ASDisplayNode { private var currentRange: (Int, Int)? private var currentRects: [CGRect]? + public let highlightAreaNode: ASDisplayNode + public init(theme: TextSelectionTheme, textNode: TextNode, updateIsActive: @escaping (Bool) -> Void, present: @escaping (ViewController, Any?) -> Void, rootNode: ASDisplayNode, performAction: @escaping (String, TextSelectionAction) -> Void) { self.theme = theme self.textNode = textNode @@ -217,6 +219,8 @@ public final class TextSelectionNode: ASDisplayNode { self.rightKnob.displayWithoutProcessing = true self.rightKnob.alpha = 0.0 + self.highlightAreaNode = ASDisplayNode() + super.init() self.setViewBlock({ @@ -262,7 +266,7 @@ public final class TextSelectionNode: ASDisplayNode { let updatedRange = NSRange(location: min(updatedMin, updatedMax), length: max(updatedMin, updatedMax) - min(updatedMin, updatedMax)) if strongSelf.currentRange?.0 != updatedMin || strongSelf.currentRange?.1 != updatedMax { strongSelf.currentRange = (updatedMin, updatedMax) - strongSelf.updateSelection(range: updatedRange) + strongSelf.updateSelection(range: updatedRange, animateIn: false) } if let scrollView = findScrollView(view: strongSelf.view) { @@ -311,7 +315,7 @@ public final class TextSelectionNode: ASDisplayNode { strongSelf.currentRange = resultRange.flatMap { ($0.lowerBound, $0.upperBound) } - strongSelf.updateSelection(range: resultRange) + strongSelf.updateSelection(range: resultRange, animateIn: true) strongSelf.displayMenu() strongSelf.updateIsActive(true) } @@ -322,7 +326,7 @@ public final class TextSelectionNode: ASDisplayNode { self.view.addGestureRecognizer(recognizer) } - private func updateSelection(range: NSRange?) { + private func updateSelection(range: NSRange?, animateIn: Bool) { var rects: [CGRect]? if let range = range { @@ -342,7 +346,7 @@ public final class TextSelectionNode: ASDisplayNode { highlightOverlay.outerRadius = 0.0 highlightOverlay.inset = 1.0 self.highlightOverlay = highlightOverlay - self.insertSubnode(highlightOverlay, at: 0) + self.highlightAreaNode.addSubnode(highlightOverlay) } highlightOverlay.frame = self.bounds highlightOverlay.updateRects(rects) @@ -351,11 +355,27 @@ public final class TextSelectionNode: ASDisplayNode { self.rightKnob.frame = CGRect(origin: CGPoint(x: floor(rects[rects.count - 1].maxX + 1.0 - image.size.width / 2.0), y: rects[rects.count - 1].maxY + 1.0 - (rects[0].height + 2.0)), size: CGSize(width: image.size.width, height: image.size.width + rects[0].height + 2.0)) } if self.leftKnob.alpha.isZero { - highlightOverlay.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.18) + highlightOverlay.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) self.leftKnob.alpha = 1.0 - self.leftKnob.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.18) + self.leftKnob.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.14, delay: 0.19) self.rightKnob.alpha = 1.0 - self.rightKnob.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.18) + self.rightKnob.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.14, delay: 0.19) + self.leftKnob.layer.animateSpring(from: 0.5 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.2, delay: 0.25, initialVelocity: 0.0, damping: 80.0) + self.rightKnob.layer.animateSpring(from: 0.5 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.2, delay: 0.25, initialVelocity: 0.0, damping: 80.0) + + if animateIn { + var result = CGRect() + for rect in rects { + if result.isEmpty { + result = rect + } else { + result = result.union(rect) + } + } + highlightOverlay.layer.animateScale(from: 2.0, to: 1.0, duration: 0.26) + let fromResult = CGRect(origin: CGPoint(x: result.minX - result.width / 2.0, y: result.minY - result.height / 2.0), size: CGSize(width: result.width * 2.0, height: result.height * 2.0)) + highlightOverlay.layer.animatePosition(from: CGPoint(x: (-fromResult.midX + highlightOverlay.bounds.midX) / 1.0, y: (-fromResult.midY + highlightOverlay.bounds.midY) / 1.0), to: CGPoint(), duration: 0.26, additive: true) + } } } else if let highlightOverlay = self.highlightOverlay { self.highlightOverlay = nil @@ -372,7 +392,7 @@ public final class TextSelectionNode: ASDisplayNode { private func dismissSelection() { self.currentRange = nil - self.updateSelection(range: nil) + self.updateSelection(range: nil, animateIn: false) } private func displayMenu() { From 4ac24e43698c7217f67176cf735121677593cca7 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 28 Aug 2019 21:56:21 +0300 Subject: [PATCH 56/86] Cloud themes improvements --- Telegram-iOS/en.lproj/Localizable.strings | 27 +- .../Sources/ChatListController.swift | 5 - .../GalleryUI/Sources/GalleryController.swift | 2 +- .../Sources/ChannelAdminsController.swift | 2 +- .../project.pbxproj | 8 +- ...roller.swift => EditThemeController.swift} | 75 +- .../Themes/ThemePreviewController.swift | 7 +- .../Themes/ThemePreviewControllerNode.swift | 9 +- .../Themes/ThemeSettingsController.swift | 97 +- .../Themes/ThemeSettingsThemeItem.swift | 79 +- .../TelegramCore/TelegramCore/Themes.swift | 8 +- .../ChatControllerBackgroundNode.swift | 2 - .../Sources/MakePresentationTheme.swift | 2 +- .../Sources/PresentationStrings.swift | 6962 +++++++++-------- .../TelegramUI/ChatController.swift | 8 +- .../ChatHistoryEntriesForView.swift | 2 +- .../TelegramUI/ChatMessageItem.swift | 2 +- .../ChatMessageNotificationItem.swift | 6 +- .../ChatRecentActionsControllerNode.swift | 2 +- .../ChatScheduleTimeControllerNode.swift | 81 +- .../TelegramUI/OpenResolvedUrl.swift | 44 +- .../Resources/PresentationStrings.mapping | Bin 125066 -> 125271 bytes .../WebpagePreviewAccessoryPanelNode.swift | 2 +- .../Sources/PresentationThemeSettings.swift | 4 +- .../Sources/WallpaperResources.swift | 38 +- 25 files changed, 3797 insertions(+), 3677 deletions(-) rename submodules/SettingsUI/Sources/Themes/{CreateThemeController.swift => EditThemeController.swift} (68%) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index a7885c8fcd..43c3394ecd 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4635,23 +4635,17 @@ Any member of this group will be able to see messages in the channel."; "Appearance.ThemePreview.ChatList.1.Name" = "Alicia Torreaux"; "Appearance.ThemePreview.ChatList.1.Text" = "Bob says hi."; - "Appearance.ThemePreview.ChatList.2.Name" = "Roberto"; "Appearance.ThemePreview.ChatList.2.Text" = "Say hello to Alice 👋"; - "Appearance.ThemePreview.ChatList.3.Name" = "Campus Public Chat"; "Appearance.ThemePreview.ChatList.3.AuthorName" = "Jennie Alpha"; "Appearance.ThemePreview.ChatList.3.Text" = "We just reached 2,500 members! WOO!"; - "Appearance.ThemePreview.ChatList.4.Name" = "Veronica"; "Appearance.ThemePreview.ChatList.4.Text" = "Table for four, 2PM. Be there."; - "Appearance.ThemePreview.ChatList.5.Name" = "Animal Videos"; "Appearance.ThemePreview.ChatList.5.Text" = "Vote now! Moar cat videos in this channel?"; - "Appearance.ThemePreview.ChatList.6.Name" = "Little Sister"; "Appearance.ThemePreview.ChatList.6.Text" = "Don't tell mom yet, but I got the job! I'm going to ROME!"; - "Appearance.ThemePreview.ChatList.7.Name" = "Jennie Alpha"; "Appearance.ThemePreview.ChatList.7.Text" = "🖼 Check these out"; @@ -4665,14 +4659,23 @@ Any member of this group will be able to see messages in the channel."; "Undo.ScheduledMessagesCleared" = "Scheduled messages cleared"; "Appearance.CreateTheme" = "Create New Theme"; +"Appearance.EditTheme" = "Edit Theme"; +"Appearance.RemoveTheme" = "Remove"; "Appearance.CreateThemeInfo" = "A new theme template has been created from your current theme and added to your Saved Messages."; -"Appearance.Publish" = "Publish"; "Conversation.Theme" = "Color Theme"; "Conversation.ViewTheme" = "VIEW THEME"; -"CreateTheme.Title" = "Publish Theme"; -"CreateTheme.Preview" = "PREVIEW"; -"CreateTheme.Title" = "Title"; -"CreateTheme.ShortLink" = "Short Link"; -"CreateTheme.ShortLinkInfo" = "Short Link"; +"Message.Theme" = "Color Theme"; + +"EditTheme.Title" = "Edit Theme"; +"EditTheme.Preview" = "PREVIEW"; +"EditTheme.Title" = "Title"; +"EditTheme.ShortLink" = "Short Link"; +"EditTheme.ShortLinkInfo" = "Short Link"; + +"Wallpaper.ErrorNotFound" = "Sorry, this chat background doesn't seem to exist."; +"Theme.ErrorNotFound" = "Sorry, this color theme doesn't seem to exist."; +"Theme.Unsupported" = "Sorry, this color theme doesn't support your device yet."; + +"Conversation.SendMessageErrorTooMuchScheduled" = "Sorry, you can not schedule more than 100 messages."; diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 8dad0a3b23..4efb5d9f71 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -741,13 +741,10 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, |> deliverOnMainQueue).start(next: { [weak strongSelf] actualPeerId in if let strongSelf = strongSelf { if let navigationController = strongSelf.navigationController as? NavigationController { - var scrollToEndIfExists = false if let layout = strongSelf.validLayout, case .regular = layout.metrics.widthClass { scrollToEndIfExists = true } - - strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(actualPeerId), subject: .message(messageId), purposefulAction: { self?.deactivateSearch(animated: false) }, scrollToEndIfExists: scrollToEndIfExists, options: strongSelf.groupId == PeerGroupId.root ? [.removeOnMasterDetails] : [])) @@ -772,12 +769,10 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, if dismissSearch { strongSelf.deactivateSearch(animated: true) } - var scrollToEndIfExists = false if let layout = strongSelf.validLayout, case .regular = layout.metrics.widthClass { scrollToEndIfExists = true } - if let navigationController = strongSelf.navigationController as? NavigationController { strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer.id), purposefulAction: { [weak self] in self?.deactivateSearch(animated: false) diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index 717ea2eaca..797ad65c42 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -643,7 +643,7 @@ public class GalleryController: ViewController { UIPasteboard.general.string = mention })) } - actionSheet.setItemGroups([ActionSheetItemGroup(items:items), ActionSheetItemGroup(items: [ + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() }) diff --git a/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift b/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift index a0d5d79081..ee244cfb3c 100644 --- a/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift @@ -380,7 +380,7 @@ private func channelAdminsControllerEntries(presentationData: PresentationData, switch participant.participant { case .creator: canEdit = false - canOpen = peer.flags.contains(.isCreator) + canOpen = false case let .member(id, _, adminInfo, _, _): if id == accountPeerId { canEdit = false diff --git a/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj index dd27f05c9a..ee56911597 100644 --- a/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/SettingsUI/SettingsUI_Xcode.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 09B4A9B823102B7A005C2E08 /* CreateThemeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B723102B7A005C2E08 /* CreateThemeController.swift */; }; + 09B4A9B823102B7A005C2E08 /* EditThemeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4A9B723102B7A005C2E08 /* EditThemeController.swift */; }; D03E465223075D930049C28B /* SettingsUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E465023075D930049C28B /* SettingsUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E466823075E660049C28B /* TabBarAccountSwitchControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465C23075E630049C28B /* TabBarAccountSwitchControllerNode.swift */; }; D03E466923075E660049C28B /* LogoutOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E465D23075E630049C28B /* LogoutOptionsController.swift */; }; @@ -191,7 +191,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 09B4A9B723102B7A005C2E08 /* CreateThemeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateThemeController.swift; sourceTree = ""; }; + 09B4A9B723102B7A005C2E08 /* EditThemeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditThemeController.swift; sourceTree = ""; }; D03E464D23075D930049C28B /* SettingsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SettingsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E465023075D930049C28B /* SettingsUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsUI.h; sourceTree = ""; }; D03E465123075D930049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -649,7 +649,7 @@ D03E46E523075FD40049C28B /* WallpaperGalleryToolbarNode.swift */, D03E46EB23075FD60049C28B /* WallpaperPatternPanelNode.swift */, D03E46EE23075FD60049C28B /* WallpaperSearchRecentQueries.swift */, - 09B4A9B723102B7A005C2E08 /* CreateThemeController.swift */, + 09B4A9B723102B7A005C2E08 /* EditThemeController.swift */, ); path = Themes; sourceTree = ""; @@ -931,7 +931,7 @@ D03E468E23075F010049C28B /* SettingsSearchRecentItem.swift in Sources */, D03E467223075E660049C28B /* ChangePhoneNumberCodeController.swift in Sources */, D03E466823075E660049C28B /* TabBarAccountSwitchControllerNode.swift in Sources */, - 09B4A9B823102B7A005C2E08 /* CreateThemeController.swift in Sources */, + 09B4A9B823102B7A005C2E08 /* EditThemeController.swift in Sources */, D03E471623075FE40049C28B /* WallpaperColorPanelNode.swift in Sources */, D03E470023075FE40049C28B /* ThemeColorsGridControllerItem.swift in Sources */, D03E468B23075F010049C28B /* SettingsSearchItem.swift in Sources */, diff --git a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift similarity index 68% rename from submodules/SettingsUI/Sources/Themes/CreateThemeController.swift rename to submodules/SettingsUI/Sources/Themes/EditThemeController.swift index 7b74f8abb8..f2db2b5e88 100644 --- a/submodules/SettingsUI/Sources/Themes/CreateThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift @@ -10,22 +10,22 @@ import ItemListUI import AlertUI import AccountContext -private final class CreateThemeControllerArguments { +private final class EditThemeControllerArguments { let context: AccountContext - let updateState: ((CreateThemeControllerState) -> CreateThemeControllerState) -> Void + let updateState: ((EditThemeControllerState) -> EditThemeControllerState) -> Void - init(context: AccountContext, updateState: @escaping ((CreateThemeControllerState) -> CreateThemeControllerState) -> Void) { + init(context: AccountContext, updateState: @escaping ((EditThemeControllerState) -> EditThemeControllerState) -> Void) { self.context = context self.updateState = updateState } } -private enum CreateThemeControllerSection: Int32 { +private enum EditThemeControllerSection: Int32 { case chatPreview case info } -private enum CreateThemeControllerEntry: ItemListNodeEntry { +private enum EditThemeControllerEntry: ItemListNodeEntry { case chatPreviewHeader(PresentationTheme, String) case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder) case title(PresentationTheme, PresentationStrings, String, String) @@ -35,9 +35,9 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { var section: ItemListSectionId { switch self { case .chatPreviewHeader, .chatPreview: - return CreateThemeControllerSection.chatPreview.rawValue + return EditThemeControllerSection.chatPreview.rawValue case .title, .slug, .slugInfo: - return CreateThemeControllerSection.info.rawValue + return EditThemeControllerSection.info.rawValue } } @@ -56,7 +56,7 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { } } - static func ==(lhs: CreateThemeControllerEntry, rhs: CreateThemeControllerEntry) -> Bool { + static func ==(lhs: EditThemeControllerEntry, rhs: EditThemeControllerEntry) -> Bool { switch lhs { case let .chatPreviewHeader(lhsTheme, lhsText): if case let .chatPreviewHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { @@ -91,11 +91,11 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { } } - static func <(lhs: CreateThemeControllerEntry, rhs: CreateThemeControllerEntry) -> Bool { + static func <(lhs: EditThemeControllerEntry, rhs: EditThemeControllerEntry) -> Bool { return lhs.stableId < rhs.stableId } - func item(_ arguments: CreateThemeControllerArguments) -> ListViewItem { + func item(_ arguments: EditThemeControllerArguments) -> ListViewItem { switch self { case let .chatPreviewHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) @@ -123,13 +123,7 @@ private enum CreateThemeControllerEntry: ItemListNodeEntry { } } -private enum CreateThemeControllerMode { - case create - case update -} - -private struct CreateThemeControllerState: Equatable { - var mode: CreateThemeControllerMode +private struct EditThemeControllerState: Equatable { var title: String var slug: String @@ -141,24 +135,32 @@ private struct CreateThemeControllerState: Equatable { } } -private func createThemeControllerEntries(presentationData: PresentationData, theme: PresentationTheme, state: CreateThemeControllerState) -> [CreateThemeControllerEntry] { - var entries: [CreateThemeControllerEntry] = [] +private func EditThemeControllerEntries(presentationData: PresentationData, theme: PresentationTheme?, state: EditThemeControllerState) -> [EditThemeControllerEntry] { + var entries: [EditThemeControllerEntry] = [] - entries.append(.chatPreviewHeader(presentationData.theme, presentationData.strings.CreateTheme_Preview.uppercased())) - entries.append(.chatPreview(presentationData.theme, theme, theme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) + if let theme = theme { + entries.append(.chatPreviewHeader(presentationData.theme, presentationData.strings.EditTheme_Preview.uppercased())) + entries.append(.chatPreview(presentationData.theme, theme, theme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) + } - entries.append(.title(presentationData.theme, presentationData.strings, presentationData.strings.CreateTheme_Title, state.title)) - entries.append(.slug(presentationData.theme, presentationData.strings, presentationData.strings.CreateTheme_ShortLink, state.slug, true)) - entries.append(.slugInfo(presentationData.theme, presentationData.strings.CreateTheme_ShortLinkInfo)) + entries.append(.title(presentationData.theme, presentationData.strings, presentationData.strings.EditTheme_Title, state.title)) + entries.append(.slug(presentationData.theme, presentationData.strings, presentationData.strings.EditTheme_ShortLink, state.slug, true)) + entries.append(.slugInfo(presentationData.theme, presentationData.strings.EditTheme_ShortLinkInfo)) return entries } -public func createThemeController(context: AccountContext, theme: PresentationTheme, resource: MediaResource) -> ViewController { - let initialState = CreateThemeControllerState(mode: .create, title: theme.name.string, slug: "") +public enum EditThemeControllerMode { + case createNew + case createForExisting(TelegramTheme) + case edit(TelegramTheme) +} + +public func editThemeController(context: AccountContext, theme: TelegramTheme) -> ViewController { + let initialState = EditThemeControllerState(title: theme.title, slug: theme.slug) let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) - let updateState: ((CreateThemeControllerState) -> CreateThemeControllerState) -> Void = { f in + let updateState: ((EditThemeControllerState) -> EditThemeControllerState) -> Void = { f in statePromise.set(stateValue.modify { f($0) }) } @@ -166,23 +168,28 @@ public func createThemeController(context: AccountContext, theme: PresentationTh var presentControllerImpl: ((ViewController, Any?) -> Void)? var dismissImpl: (() -> Void)? - let arguments = CreateThemeControllerArguments(context: context, updateState: { f in + let arguments = EditThemeControllerArguments(context: context, updateState: { f in updateState(f) }) + var previewTheme: PresentationTheme? + if let file = theme.file, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let theme = makePresentationTheme(data: data) { + previewTheme = theme + } + let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get()) - |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, CreateThemeControllerEntry.ItemGenerationArguments)) in + |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, EditThemeControllerEntry.ItemGenerationArguments)) in let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { dismissImpl?() }) let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: state.isComplete, action: { - let _ = (createTheme(account: context.account, resource: resource, title: state.title, slug: state.slug) |> deliverOnMainQueue).start(completed: { - dismissImpl?() - }) + //let _ = (updateTheme(account: context.account, resource: resource, title: state.title, slug: state.slug) |> deliverOnMainQueue).start(completed: { + // dismissImpl?() + //}) }) - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.CreateTheme_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) - let listState = ItemListNodeState(entries: createThemeControllerEntries(presentationData: presentationData, theme: theme, state: state), style: .blocks, emptyStateItem: nil, animateChanges: false) + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.EditTheme_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let listState = ItemListNodeState(entries: EditThemeControllerEntries(presentationData: presentationData, theme: previewTheme, state: state), style: .blocks, emptyStateItem: nil, animateChanges: false) return (controllerState, (listState, arguments)) } diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index 643d7c8043..d8e3de98b2 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -189,12 +189,7 @@ public final class ThemePreviewController: ViewController { preferredAction = .default case let .media(media): subject = .media(media) - preferredAction = .custom(action: ShareControllerAction(title: self.presentationData.strings.Appearance_Publish, action: { [weak self] in - if let strongSelf = self, let file = media.media as? TelegramMediaFile { - let controller = createThemeController(context: strongSelf.context, theme: strongSelf.previewTheme, resource: file.resource) - strongSelf.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet), blockInteraction: true) - } - })) + preferredAction = .default } let controller = ShareController(context: self.context, subject: subject, preferredAction: preferredAction) self.present(controller, in: .window(.root), blockInteraction: true) diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 23ee43dfd1..aa17e9fadb 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -40,7 +40,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { private var chatNodes: [ListViewItemNode]? private let maskNode: ASImageNode - private let chatBackgroundNode: ASDisplayNode + private let chatBackgroundNode: WallpaperBackgroundNode private var messageNodes: [ListViewItemNode]? private let toolbarNode: WallpaperGalleryToolbarNode @@ -70,7 +70,10 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.pageControlNode = PageControlNode(dotColor: previewTheme.chatList.unreadBadgeActiveBackgroundColor, inactiveDotColor: previewTheme.list.pageIndicatorInactiveColor) self.chatListBackgroundNode = ASDisplayNode() - self.chatBackgroundNode = ASDisplayNode() + self.chatBackgroundNode = WallpaperBackgroundNode() + self.chatBackgroundNode.displaysAsynchronously = false + self.chatBackgroundNode.image = chatControllerBackgroundImage(theme: previewTheme, wallpaper: previewTheme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) + self.chatBackgroundNode.motionEnabled = previewTheme.chat.defaultWallpaper.settings?.motion ?? false self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.previewTheme, strings: self.presentationData.strings) @@ -225,7 +228,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { }) itemNode!.isUserInteractionEnabled = false chatNodes.append(itemNode!) - self.chatListBackgroundNode.addSubnode(itemNode!) + self.chatListBackgroundNode.insertSubnode(itemNode!, belowSubnode: self.maskNode) } self.chatNodes = chatNodes } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index fe60e51a3f..3c98415932 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -10,6 +10,28 @@ import ItemListUI import AlertUI import AccountContext +func themeDisplayName(strings: PresentationStrings, reference: PresentationThemeReference) -> String { + let name: String + switch reference { + case let .builtin(theme): + switch theme { + case .dayClassic: + name = strings.Appearance_ThemeCarouselClassic + case .day: + name = strings.Appearance_ThemeCarouselDay + case .night: + name = strings.Appearance_ThemeCarouselNewNight + case .nightAccent: + name = strings.Appearance_ThemeCarouselTintedNight + } + case let .local(theme): + name = theme.title + case let .cloud(theme): + name = theme.title + } + return name +} + private final class ThemeSettingsControllerArguments { let context: AccountContext let selectTheme: (PresentationThemeReference) -> Void @@ -21,9 +43,9 @@ private final class ThemeSettingsControllerArguments { let toggleLargeEmoji: (Bool) -> Void let disableAnimations: (Bool) -> Void let selectAppIcon: (String) -> Void - let presentThemeMenu: (PresentationThemeReference) -> Void + let presentThemeMenu: (PresentationThemeReference, Bool) -> Void - init(context: AccountContext, selectTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void, presentThemeMenu: @escaping (PresentationThemeReference) -> Void) { + init(context: AccountContext, selectTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void, presentThemeMenu: @escaping (PresentationThemeReference, Bool) -> Void) { self.context = context self.selectTheme = selectTheme self.selectFontSize = selectFontSize @@ -268,7 +290,7 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { return ThemeSettingsThemeItem(context: arguments.context, theme: theme, strings: strings, sectionId: self.section, themes: themes, themeSpecificAccentColors: themeSpecificAccentColors, currentTheme: currentTheme, updatedTheme: { theme in arguments.selectTheme(theme) }, longTapped: { theme in - + arguments.presentThemeMenu(theme, theme == currentTheme) }) case let .iconHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) @@ -351,6 +373,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The var pushControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)? + var selectThemeImpl: ((PresentationThemeReference) -> Void)? var moreImpl: (() -> Void)? let _ = telegramWallpapers(postbox: context.account.postbox, network: context.account.network).start() @@ -367,6 +390,10 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The let currentAppIconName = ValuePromise() currentAppIconName.set(currentAppIcon?.name ?? "Blue") + let cloudThemes = Promise<[TelegramTheme]>() + let updatedCloudThemes = telegramThemes(postbox: context.account.postbox, network: context.account.network) + cloudThemes.set(updatedCloudThemes) + let arguments = ThemeSettingsControllerArguments(context: context, selectTheme: { theme in let _ = (context.sharedContext.accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in @@ -429,17 +456,52 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The currentAppIconName.set(name) context.sharedContext.applicationBindings.requestSetAlternateIconName(name, { _ in }) - }, presentThemeMenu: { theme in - + }, presentThemeMenu: { themeReference, isCurrent in + guard case let .cloud(theme) = themeReference else { + return + } + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) + var items: [ActionSheetItem] = [] + items.append(ActionSheetTextItem(title: theme.title)) + items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_EditTheme, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + let controller = editThemeController(context: context, theme: theme) + presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + })) + items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_RemoveTheme, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + + let _ = (cloudThemes.get() + |> take(1) + |> deliverOnMainQueue).start(next: { themes in + if isCurrent, let themeIndex = themes.firstIndex(where: { $0.id == theme.id }) { + let newTheme: PresentationThemeReference + if themeIndex > 0 { + newTheme = .cloud(themes[themeIndex - 1]) + } else { + newTheme = .builtin(.nightAccent) + } + selectThemeImpl?(newTheme) + } + + let updatedThemes = themes.filter { $0.id != theme.id } + cloudThemes.set(.single(updatedThemes) |> then(updatedCloudThemes)) + + let _ = (deleteTheme(account: context.account, theme: theme)).start() + }) + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + presentControllerImpl?(actionSheet, nil) }) - let savedThemes = telegramThemes(postbox: context.account.postbox, network: context.account.network) - |> map { themes -> [PresentationThemeReference] in - return themes.map { .cloud($0) } - } - - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]), savedThemes, availableAppIcons, currentAppIconName.get(), statePromise.get()) - |> map { presentationData, sharedData, savedThemes, availableAppIcons, currentAppIconName, state -> (ItemListControllerState, (ItemListNodeState, ThemeSettingsControllerEntry.ItemGenerationArguments)) in + let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]), cloudThemes.get(), availableAppIcons, currentAppIconName.get(), statePromise.get()) + |> map { presentationData, sharedData, cloudThemes, availableAppIcons, currentAppIconName, state -> (ItemListControllerState, (ItemListNodeState, ThemeSettingsControllerEntry.ItemGenerationArguments)) in let settings = (sharedData.entries[ApplicationSpecificSharedDataKeys.presentationThemeSettings] as? PresentationThemeSettings) ?? PresentationThemeSettings.defaultSettings let fontSize = settings.fontSize @@ -462,11 +524,13 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The }) let defaultThemes: [PresentationThemeReference] = [.builtin(.dayClassic), .builtin(.day), .builtin(.night), .builtin(.nightAccent)] + let cloudThemes: [PresentationThemeReference] = cloudThemes.map { .cloud($0) } + var availableThemes = defaultThemes - if !defaultThemes.contains(settings.theme) && !savedThemes.contains(settings.theme) { + if !defaultThemes.contains(settings.theme) && !cloudThemes.contains(settings.theme) { availableThemes.append(settings.theme) } - availableThemes.append(contentsOf: savedThemes) + availableThemes.append(contentsOf: cloudThemes) let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Appearance_Title), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) let listState = ItemListNodeState(entries: themeSettingsControllerEntries(presentationData: presentationData, theme: theme, themeReference: settings.theme, themeSpecificAccentColors: settings.themeSpecificAccentColors, availableThemes: availableThemes, autoNightSettings: settings.automaticThemeSwitchSetting, strings: presentationData.strings, wallpaper: wallpaper, fontSize: fontSize, dateTimeFormat: dateTimeFormat, largeEmoji: largeEmoji, disableAnimations: disableAnimations, availableAppIcons: availableAppIcons, currentAppIconName: currentAppIconName), style: .blocks, ensureVisibleItemTag: focusOnItemTag, animateChanges: false) @@ -482,6 +546,9 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The presentControllerImpl = { [weak controller] c, a in controller?.present(c, in: .window(.root), with: a) } + selectThemeImpl = { theme in + arguments.selectTheme(theme) + } moreImpl = { [weak controller] in let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) @@ -509,7 +576,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The } }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})], actionLayout: .vertical), nil) })) - actionSheet.setItemGroups([ActionSheetItemGroup(items:items), ActionSheetItemGroup(items: [ + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() }) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift index 614eb4b493..88810c8fd9 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift @@ -60,7 +60,7 @@ private func themeIconImage(context: AccountContext, theme: PresentationThemeRef if case let .local(theme) = theme { resource = theme.resource } else if case let .cloud(theme) = theme { - resource = theme.file.resource + resource = theme.file?.resource } if let resource = resource { signal = telegramThemeData(account: context.account, accountManager: context.sharedContext.accountManager, resource: resource, synchronousLoad: false) @@ -201,24 +201,44 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode { self.addSubnode(self.textNode) } - func setup(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?, currentTheme: PresentationTheme, title: NSAttributedString, bordered: Bool, selected: Bool, action: @escaping () -> Void) { + func setup(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?, currentTheme: PresentationTheme, title: NSAttributedString, bordered: Bool, selected: Bool, action: @escaping () -> Void, longTapAction: @escaping () -> Void) { self.imageNode.setSignal(themeIconImage(context: context, theme: theme, accentColor: accentColor)) self.textNode.attributedText = title self.overlayNode.image = generateBorderImage(theme: currentTheme, bordered: bordered, selected: selected) self.action = { action() } + self.longTapAction = { + longTapAction() + } } override func didLoad() { super.didLoad() - self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:)))) + let recognizer = TapLongTapOrDoubleTapGestureRecognizer(target: self, action: #selector(self.tapLongTapOrDoubleTapGesture(_:))) + recognizer.delaysTouchesBegan = false + recognizer.tapActionAtPoint = { point in + return .waitForSingleTap + } + self.view.addGestureRecognizer(recognizer) } - @objc func tapGesture(_ recognizer: UITapGestureRecognizer) { - if case .ended = recognizer.state { - self.action?() + @objc private func tapLongTapOrDoubleTapGesture(_ recognizer: TapLongTapOrDoubleTapGestureRecognizer) { + switch recognizer.state { + case .ended: + if let (gesture, _) = recognizer.lastRecognizedGestureAndLocation { + switch gesture { + case .tap: + self.action?() + case .longTap: + self.longTapAction?() + default: + break + } + } + default: + break } } @@ -368,40 +388,28 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { selectedNode = imageNode } - let name: String? - switch theme { - case let .builtin(theme): - switch theme { - case .dayClassic: - name = item.strings.Appearance_ThemeCarouselClassic - case .day: - name = item.strings.Appearance_ThemeCarouselDay - case .night: - name = item.strings.Appearance_ThemeCarouselNewNight - case .nightAccent: - name = item.strings.Appearance_ThemeCarouselTintedNight - } - case let .local(theme): - name = theme.title - case let .cloud(theme): - name = theme.title - } + let name = themeDisplayName(strings: item.strings, reference: theme) + imageNode.setup(context: item.context, theme: theme, accentColor: item.themeSpecificAccentColors[theme.index]?.color, currentTheme: item.theme, title: NSAttributedString(string: name, font: selected ? selectedTextFont : textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { [weak self, weak imageNode] in + item.updatedTheme(theme) + if let imageNode = imageNode { + self?.scrollToNode(imageNode, animated: true) + } + }, longTapAction: { + item.longTapped(theme) + }) - if let name = name { - imageNode.setup(context: item.context, theme: theme, accentColor: item.themeSpecificAccentColors[theme.index]?.color, currentTheme: item.theme, title: NSAttributedString(string: name, font: selected ? selectedTextFont : textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { [weak self, weak imageNode] in - item.updatedTheme(theme) - if let imageNode = imageNode { - self?.scrollToNode(imageNode, animated: true) - } - }) - - imageNode.frame = CGRect(origin: CGPoint(x: nodeOffset, y: 0.0), size: nodeSize) - nodeOffset += nodeSize.width + 2.0 - } + imageNode.frame = CGRect(origin: CGPoint(x: nodeOffset, y: 0.0), size: nodeSize) + nodeOffset += nodeSize.width + 2.0 i += 1 } + for k in (i ..< strongSelf.nodes.count).reversed() { + let node = strongSelf.nodes[k] + strongSelf.nodes.remove(at: k) + node.removeFromSupernode() + } + if let lastNode = strongSelf.nodes.last { let contentSize = CGSize(width: lastNode.frame.maxX + nodeInset, height: strongSelf.scrollNode.frame.height) if strongSelf.scrollNode.view.contentSize != contentSize { @@ -425,4 +433,3 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) } } - diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index 726bf75693..2edb021f17 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -82,11 +82,17 @@ public func telegramThemes(postbox: Postbox, network: Network, forceUpdate: Bool public enum GetThemeError { case generic + case unsupported } public func getTheme(account: Account, slug: String) -> Signal { return account.network.request(Api.functions.account.getTheme(format: themeFormat, theme: .inputThemeSlug(slug: slug), documentId: 0)) - |> mapError { _ -> GetThemeError in return .generic } + |> mapError { error -> GetThemeError in + if error.errorDescription == "THEME_FORMAT_INVALID" { + return .unsupported + } + return .generic + } |> mapToSignal { theme -> Signal in if let theme = TelegramTheme(apiTheme: theme) { return .single(theme) diff --git a/submodules/TelegramPresentationData/Sources/ChatControllerBackgroundNode.swift b/submodules/TelegramPresentationData/Sources/ChatControllerBackgroundNode.swift index 7177414d56..eedc9b666a 100644 --- a/submodules/TelegramPresentationData/Sources/ChatControllerBackgroundNode.swift +++ b/submodules/TelegramPresentationData/Sources/ChatControllerBackgroundNode.swift @@ -68,14 +68,12 @@ public func chatControllerBackgroundImage(theme: PresentationTheme, wallpaper in var image: UIImage? let _ = mediaBox.cachedResourceRepresentation(file.file.resource, representation: CachedBlurredWallpaperRepresentation(), complete: true, fetch: true, attemptSynchronously: true).start(next: { data in if data.complete { - print("background image: \(data.path)") image = UIImage(contentsOfFile: data.path)?.precomposed() } }) backgroundImage = image } if backgroundImage == nil, let path = mediaBox.completedResourcePath(file.file.resource) { - print("background image: \(path)") backgroundImage = UIImage(contentsOfFile: path)?.precomposed() } } diff --git a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift index 994c9fc1b1..48b5afefd2 100644 --- a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift @@ -30,7 +30,7 @@ public func makePresentationTheme(mediaBox: MediaBox, themeReference: Presentati theme = makeDefaultPresentationTheme(reference: .dayClassic, accentColor: nil, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, preview: preview) } case let .cloud(info): - if let path = mediaBox.completedResourcePath(info.file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let loadedTheme = makePresentationTheme(data: data) { + if let file = info.file, let path = mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let loadedTheme = makePresentationTheme(data: data) { theme = loadedTheme } else { theme = makeDefaultPresentationTheme(reference: .dayClassic, accentColor: nil, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, preview: preview) diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 1e4ffc844a..cbaee85e28 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -288,4413 +288,4419 @@ public final class PresentationStrings { public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[97]!, self._r[97]!, [_0]) } - public var Conversation_StopLiveLocation: String { return self._s[99]! } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[100]! } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[102]! } - public var Username_LinkCopied: String { return self._s[104]! } - public var GroupRemoved_Title: String { return self._s[105]! } - public var SecretVideo_Title: String { return self._s[106]! } + public var Appearance_RemoveTheme: String { return self._s[98]! } + public var Conversation_StopLiveLocation: String { return self._s[100]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[101]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[103]! } + public var Username_LinkCopied: String { return self._s[105]! } + public var GroupRemoved_Title: String { return self._s[106]! } + public var SecretVideo_Title: String { return self._s[107]! } public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[107]!, self._r[107]!, [_1]) + return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_1]) } - public var AccessDenied_PhotosAndVideos: String { return self._s[108]! } - public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[109]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[109]! } + public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[110]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[111]!, self._r[111]!, [_1]) + return formatWithArgumentRanges(self._s[112]!, self._r[112]!, [_1]) } - public var Map_OpenInGoogleMaps: String { return self._s[112]! } + public var Map_OpenInGoogleMaps: String { return self._s[113]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[113]!, self._r[113]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[114]!, self._r[114]!, [_1, _2, _3]) } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[114]!, self._r[114]!, [_1, _2]) + return formatWithArgumentRanges(self._s[115]!, self._r[115]!, [_1, _2]) } - public var Call_StatusRinging: String { return self._s[115]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[116]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[117]! } - public var UserInfo_NotificationsEnabled: String { return self._s[118]! } - public var Map_Search: String { return self._s[119]! } - public var Login_TermsOfServiceHeader: String { return self._s[121]! } + public var Call_StatusRinging: String { return self._s[116]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[117]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[118]! } + public var UserInfo_NotificationsEnabled: String { return self._s[119]! } + public var Map_Search: String { return self._s[120]! } + public var Login_TermsOfServiceHeader: String { return self._s[122]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[122]!, self._r[122]!, [_0]) - } - public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[123]!, self._r[123]!, [_0]) } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[124]! } - public var Weekday_Today: String { return self._s[125]! } + public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[124]!, self._r[124]!, [_0]) + } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[125]! } + public var Weekday_Today: String { return self._s[126]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[127]!, self._r[127]!, [_1, _2]) + return formatWithArgumentRanges(self._s[128]!, self._r[128]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[128]!, self._r[128]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[129]!, self._r[129]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[130]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[131]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[132]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[133]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[134]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[135]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[136]! } - public var Weekday_ShortMonday: String { return self._s[137]! } - public var Cache_KeepMedia: String { return self._s[138]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[139]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[131]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[132]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[133]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[134]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[135]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[136]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[137]! } + public var Weekday_ShortMonday: String { return self._s[138]! } + public var Cache_KeepMedia: String { return self._s[139]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[140]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[140]!, self._r[140]!, [_1, _2]) + return formatWithArgumentRanges(self._s[141]!, self._r[141]!, [_1, _2]) } public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[141]!, self._r[141]!, [_0]) + return formatWithArgumentRanges(self._s[142]!, self._r[142]!, [_0]) } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[142]! } - public var Passport_Language_ru: String { return self._s[143]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[143]! } + public var Passport_Language_ru: String { return self._s[144]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[144]!, self._r[144]!, [_0, _1]) + return formatWithArgumentRanges(self._s[145]!, self._r[145]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[145]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[146]! } - public var EnterPasscode_TouchId: String { return self._s[147]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[150]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[152]! } - public var Gif_NoGifsPlaceholder: String { return self._s[154]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[156]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[157]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[158]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[159]! } - public var AuthSessions_TerminateSession: String { return self._s[160]! } - public var Message_File: String { return self._s[161]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[162]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[163]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[164]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[165]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[146]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[147]! } + public var EnterPasscode_TouchId: String { return self._s[148]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[151]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[153]! } + public var Gif_NoGifsPlaceholder: String { return self._s[155]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[157]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[158]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[159]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[160]! } + public var AuthSessions_TerminateSession: String { return self._s[161]! } + public var Message_File: String { return self._s[162]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[163]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[164]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[165]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[166]! } public func TwoStepAuth_EnterPasswordHint(_ _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 Conversation_Moderate_Report: String { return self._s[168]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[169]! } - public var Passport_Language_ms: String { return self._s[170]! } - public var Channel_Edit_AboutItem: String { return self._s[172]! } - public var DialogList_SearchSectionGlobal: String { return self._s[176]! } - public var AttachmentMenu_WebSearch: String { return self._s[177]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[178]! } - public var Channel_BanUser_Title: String { return self._s[179]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[180]! } - public var ArchivedChats_IntroText2: String { return self._s[181]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[182]! } + public var Conversation_Moderate_Report: String { return self._s[169]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[170]! } + public var Passport_Language_ms: String { return self._s[171]! } + public var Channel_Edit_AboutItem: String { return self._s[173]! } + public var DialogList_SearchSectionGlobal: String { return self._s[177]! } + public var AttachmentMenu_WebSearch: String { return self._s[178]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[179]! } + public var Channel_BanUser_Title: String { return self._s[180]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[181]! } + public var ArchivedChats_IntroText2: String { return self._s[182]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[183]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[183]!, self._r[183]!, [_1, _2]) + return formatWithArgumentRanges(self._s[184]!, self._r[184]!, [_1, _2]) } - public var ChatSearch_SearchPlaceholder: String { return self._s[185]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[186]! } - public var NotificationsSound_Aurora: String { return self._s[187]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[186]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[187]! } + public var NotificationsSound_Aurora: String { return self._s[188]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[188]!, self._r[188]!, [_0]) + return formatWithArgumentRanges(self._s[189]!, self._r[189]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[191]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[192]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[192]!, self._r[192]!, [_0, _1]) + return formatWithArgumentRanges(self._s[193]!, self._r[193]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[193]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[194]! } - public var EmptyGroupInfo_Line2: String { return self._s[195]! } - public var VoiceOver_Chat_SeenByRecipients: String { return self._s[196]! } - public var Settings_FAQ_Intro: String { return self._s[198]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[200]! } - public var FeaturedStickerPacks_Title: String { return self._s[201]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[203]! } - public var Username_Title: String { return self._s[204]! } + public var Passport_PasswordNext: String { return self._s[194]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[195]! } + public var EmptyGroupInfo_Line2: String { return self._s[196]! } + public var VoiceOver_Chat_SeenByRecipients: String { return self._s[197]! } + public var Settings_FAQ_Intro: String { return self._s[199]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[201]! } + public var FeaturedStickerPacks_Title: String { return self._s[202]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[204]! } + public var Username_Title: String { return self._s[205]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[205]!, self._r[205]!, [_0]) + return formatWithArgumentRanges(self._s[206]!, self._r[206]!, [_0]) } - public var PasscodeSettings_AlphanumericCode: String { return self._s[206]! } - public var Localization_LanguageOther: String { return self._s[207]! } - public var Stickers_SuggestStickers: String { return self._s[208]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[207]! } + public var Localization_LanguageOther: String { return self._s[208]! } + public var Stickers_SuggestStickers: String { return self._s[209]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[209]!, self._r[209]!, [_0]) + return formatWithArgumentRanges(self._s[210]!, self._r[210]!, [_0]) } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[210]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[211]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[212]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[211]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[212]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[213]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[213]!, self._r[213]!, [_0]) + return formatWithArgumentRanges(self._s[214]!, self._r[214]!, [_0]) } - public var Group_UpgradeConfirmation: String { return self._s[215]! } - public var DialogList_Unpin: String { return self._s[216]! } - public var Passport_Identity_DateOfBirth: String { return self._s[217]! } - public var Month_ShortOctober: String { return self._s[218]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[219]! } - public var Notification_CallCanceledShort: String { return self._s[220]! } - public var Passport_Phone_Help: String { return self._s[221]! } - public var Passport_Language_az: String { return self._s[223]! } - public var CreatePoll_TextPlaceholder: String { return self._s[225]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[226]! } - public var Passport_Identity_DocumentNumber: String { return self._s[227]! } - public var PhotoEditor_CurvesRed: String { return self._s[228]! } - public var PhoneNumberHelp_Alert: String { return self._s[230]! } - public var SocksProxySetup_Port: String { return self._s[231]! } - public var Checkout_PayNone: String { return self._s[232]! } - public var AutoDownloadSettings_WiFi: String { return self._s[233]! } - public var GroupInfo_GroupType: String { return self._s[234]! } - public var StickerSettings_ContextHide: String { return self._s[235]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[236]! } - public var Group_Setup_HistoryTitle: String { return self._s[238]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[239]! } - public var PasscodeSettings_AutoLock: String { return self._s[240]! } - public var Passport_Title: String { return self._s[241]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[242]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[243]! } - public var GroupPermission_NoSendGifs: String { return self._s[244]! } - public var PrivacySettings_PasscodeOn: String { return self._s[245]! } + public var Group_UpgradeConfirmation: String { return self._s[216]! } + public var DialogList_Unpin: String { return self._s[217]! } + public var Passport_Identity_DateOfBirth: String { return self._s[218]! } + public var Month_ShortOctober: String { return self._s[219]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[220]! } + public var Notification_CallCanceledShort: String { return self._s[221]! } + public var Passport_Phone_Help: String { return self._s[222]! } + public var Passport_Language_az: String { return self._s[224]! } + public var CreatePoll_TextPlaceholder: String { return self._s[226]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[227]! } + public var Passport_Identity_DocumentNumber: String { return self._s[228]! } + public var PhotoEditor_CurvesRed: String { return self._s[229]! } + public var PhoneNumberHelp_Alert: String { return self._s[231]! } + public var SocksProxySetup_Port: String { return self._s[232]! } + public var Checkout_PayNone: String { return self._s[233]! } + public var AutoDownloadSettings_WiFi: String { return self._s[234]! } + public var GroupInfo_GroupType: String { return self._s[235]! } + public var StickerSettings_ContextHide: String { return self._s[236]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[237]! } + public var Group_Setup_HistoryTitle: String { return self._s[239]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[240]! } + public var PasscodeSettings_AutoLock: String { return self._s[241]! } + public var Passport_Title: String { return self._s[242]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[243]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[244]! } + public var GroupPermission_NoSendGifs: String { return self._s[245]! } + public var PrivacySettings_PasscodeOn: String { return self._s[246]! } public func Conversation_ScheduleMessage_SendTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[246]!, self._r[246]!, [_0]) + return formatWithArgumentRanges(self._s[247]!, self._r[247]!, [_0]) } - public var State_WaitingForNetwork: String { return self._s[248]! } + public var State_WaitingForNetwork: String { return self._s[249]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[249]!, self._r[249]!, [_0, _1]) + return formatWithArgumentRanges(self._s[250]!, self._r[250]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[251]! } + public var Calls_NotNow: String { return self._s[252]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[252]!, self._r[252]!, [_0]) + return formatWithArgumentRanges(self._s[253]!, self._r[253]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[253]! } - public var TwoStepAuth_PasswordSet: String { return self._s[254]! } - public var Passport_DeleteDocument: String { return self._s[255]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[256]! } + public var UserInfo_SendMessage: String { return self._s[254]! } + public var TwoStepAuth_PasswordSet: String { return self._s[255]! } + public var Passport_DeleteDocument: String { return self._s[256]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[257]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[257]!, self._r[257]!, [_1]) + return formatWithArgumentRanges(self._s[258]!, self._r[258]!, [_1]) } - public var GroupRemoved_Remove: String { return self._s[258]! } - public var Passport_FieldIdentity: String { return self._s[259]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[260]! } - public var Conversation_Processing: String { return self._s[263]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[265]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[268]! } - public var Month_GenFebruary: String { return self._s[269]! } + public var GroupRemoved_Remove: String { return self._s[259]! } + public var Passport_FieldIdentity: String { return self._s[260]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[261]! } + public var Conversation_Processing: String { return self._s[264]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[266]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[269]! } + public var Month_GenFebruary: String { return self._s[270]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[271]!, self._r[271]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[272]!, self._r[272]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[272]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[274]! } - public var GroupInfo_AddParticipant: String { return self._s[275]! } - public var KeyCommand_SendMessage: String { return self._s[276]! } - public var VoiceOver_Chat_YourContact: String { return self._s[278]! } - public var Map_LiveLocationShowAll: String { return self._s[279]! } - public var WallpaperSearch_ColorOrange: String { return self._s[281]! } - public var Appearance_AppIconDefaultX: String { return self._s[282]! } - public var Checkout_Receipt_Title: String { return self._s[283]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[284]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[285]! } - public var Message_Contact: String { return self._s[286]! } - public var Call_StatusIncoming: String { return self._s[287]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[273]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[275]! } + public var GroupInfo_AddParticipant: String { return self._s[276]! } + public var KeyCommand_SendMessage: String { return self._s[277]! } + public var VoiceOver_Chat_YourContact: String { return self._s[279]! } + public var Map_LiveLocationShowAll: String { return self._s[280]! } + public var WallpaperSearch_ColorOrange: String { return self._s[282]! } + public var Appearance_AppIconDefaultX: String { return self._s[283]! } + public var Checkout_Receipt_Title: String { return self._s[284]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[285]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[286]! } + public var Message_Contact: String { return self._s[287]! } + public var Call_StatusIncoming: String { return self._s[288]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[288]!, self._r[288]!, [_1]) + return formatWithArgumentRanges(self._s[289]!, self._r[289]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[290]!, self._r[290]!, [_1]) + return formatWithArgumentRanges(self._s[291]!, self._r[291]!, [_1]) } - public var VoiceOver_Media_PlaybackRate: String { return self._s[291]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[292]! } - public var Conversation_ViewChannel: String { return self._s[293]! } + public var VoiceOver_Media_PlaybackRate: String { return self._s[292]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[293]! } + public var Conversation_ViewChannel: String { return self._s[294]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[294]!, self._r[294]!, [_0]) + return formatWithArgumentRanges(self._s[295]!, self._r[295]!, [_0]) } - public var Passport_Language_nl: String { return self._s[296]! } - public var Camera_Retake: String { return self._s[297]! } + public var Passport_Language_nl: String { return self._s[297]! } + public var Camera_Retake: String { return self._s[298]! } public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[298]!, self._r[298]!, [_0]) + return formatWithArgumentRanges(self._s[299]!, self._r[299]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[299]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[300]! } - public var Tour_Title6: String { return self._s[301]! } - public var Map_ChooseAPlace: String { return self._s[302]! } - public var CallSettings_Never: String { return self._s[304]! } + public var AuthSessions_LogOutApplications: String { return self._s[300]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[301]! } + public var Tour_Title6: String { return self._s[302]! } + public var Map_ChooseAPlace: String { return self._s[303]! } + public var CallSettings_Never: String { return self._s[305]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[305]!, self._r[305]!, [_0]) + return formatWithArgumentRanges(self._s[306]!, self._r[306]!, [_0]) } - public var ChannelRemoved_RemoveInfo: String { return self._s[306]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[307]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[307]!, self._r[307]!, [_0]) + return formatWithArgumentRanges(self._s[308]!, self._r[308]!, [_0]) } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[308]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[309]! } public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[309]!, self._r[309]!, [_0]) + return formatWithArgumentRanges(self._s[310]!, self._r[310]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[310]! } + public var GroupInfo_InviteLink_Title: String { return self._s[311]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[311]!, self._r[311]!, [_1, _2]) + return formatWithArgumentRanges(self._s[312]!, self._r[312]!, [_1, _2]) } - public var KeyCommand_ScrollUp: String { return self._s[312]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[313]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[314]! } + public var KeyCommand_ScrollUp: String { return self._s[313]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[314]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[315]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[315]!, self._r[315]!, [_0]) - } - public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[316]!, self._r[316]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[317]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[318]! } - public var Weekday_Tuesday: String { return self._s[320]! } - public var ScheduledMessages_Delete: String { return self._s[322]! } - public var UserInfo_StartSecretChat: String { return self._s[323]! } - public var Passport_Identity_FilesTitle: String { return self._s[324]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[325]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[327]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[328]! } - public var AuthSessions_Sessions: String { return self._s[329]! } + public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[317]!, self._r[317]!, [_0]) + } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[318]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[319]! } + public var Weekday_Tuesday: String { return self._s[321]! } + public var ScheduledMessages_Delete: String { return self._s[323]! } + public var UserInfo_StartSecretChat: String { return self._s[324]! } + public var Passport_Identity_FilesTitle: String { return self._s[325]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[326]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[328]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[329]! } + public var AuthSessions_Sessions: String { return self._s[330]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[331]!, self._r[331]!, [_0]) + return formatWithArgumentRanges(self._s[332]!, self._r[332]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[332]! } - public var Call_StatusWaiting: String { return self._s[333]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[334]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[335]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[336]! } - public var LogoutOptions_AddAccountText: String { return self._s[337]! } - public var PasscodeSettings_6DigitCode: String { return self._s[338]! } - public var Settings_LogoutConfirmationText: String { return self._s[339]! } - public var Passport_Identity_TypePassport: String { return self._s[341]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[333]! } + public var Call_StatusWaiting: String { return self._s[334]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[335]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[336]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[337]! } + public var LogoutOptions_AddAccountText: String { return self._s[338]! } + public var PasscodeSettings_6DigitCode: String { return self._s[339]! } + public var Settings_LogoutConfirmationText: String { return self._s[340]! } + public var Passport_Identity_TypePassport: String { return self._s[342]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[344]!, self._r[344]!, [_1, _2]) + return formatWithArgumentRanges(self._s[345]!, self._r[345]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[345]! } - public var AccessDenied_SaveMedia: String { return self._s[346]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[348]! } - public var Settings_Title: String { return self._s[350]! } - public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[351]! } - public var Contacts_InviteSearchLabel: String { return self._s[353]! } - public var ConvertToSupergroup_Title: String { return self._s[354]! } + public var SocksProxySetup_SaveProxy: String { return self._s[346]! } + public var AccessDenied_SaveMedia: String { return self._s[347]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[349]! } + public var Settings_Title: String { return self._s[351]! } + public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[352]! } + public var Contacts_InviteSearchLabel: String { return self._s[354]! } + public var ConvertToSupergroup_Title: String { return self._s[355]! } public func Channel_AdminLog_CaptionEdited(_ _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 InfoPlist_NSSiriUsageDescription: String { return self._s[356]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[357]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[357]!, self._r[357]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[358]!, self._r[358]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[358]! } - public var UserInfo_BotHelp: String { return self._s[359]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[360]! } - public var Checkout_Name: String { return self._s[361]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[362]! } - public var Channel_BanUser_BlockFor: String { return self._s[363]! } - public var Checkout_ShippingAddress: String { return self._s[364]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[365]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[366]! } - public var Privacy_Forwards: String { return self._s[367]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[368]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[369]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[359]! } + public var UserInfo_BotHelp: String { return self._s[360]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[361]! } + public var Checkout_Name: String { return self._s[362]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[363]! } + public var Channel_BanUser_BlockFor: String { return self._s[364]! } + public var Checkout_ShippingAddress: String { return self._s[365]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[366]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[367]! } + public var Privacy_Forwards: String { return self._s[368]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[369]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[370]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[372]!, self._r[372]!, [_0]) + return formatWithArgumentRanges(self._s[373]!, self._r[373]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[373]! } - public var Group_OwnershipTransfer_Title: String { return self._s[374]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[375]! } - public var Group_LeaveGroup: String { return self._s[376]! } - public var Settings_UsernameEmpty: String { return self._s[377]! } + public var Contacts_SortedByName: String { return self._s[374]! } + public var Group_OwnershipTransfer_Title: String { return self._s[375]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[376]! } + public var Group_LeaveGroup: String { return self._s[377]! } + public var Settings_UsernameEmpty: String { return self._s[378]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[378]!, self._r[378]!, [_0]) + return formatWithArgumentRanges(self._s[379]!, self._r[379]!, [_0]) } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[379]!, self._r[379]!, [_1]) + return formatWithArgumentRanges(self._s[380]!, self._r[380]!, [_1]) } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[380]!, self._r[380]!, [_1, _2]) + return formatWithArgumentRanges(self._s[381]!, self._r[381]!, [_1, _2]) } - public var Message_ImageExpired: String { return self._s[381]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[383]! } - public var UserInfo_AddToExisting: String { return self._s[384]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[385]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[386]! } + public var Message_ImageExpired: String { return self._s[382]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[384]! } + public var UserInfo_AddToExisting: String { return self._s[385]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[386]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[387]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[387]!, self._r[387]!, [_1]) + return formatWithArgumentRanges(self._s[388]!, self._r[388]!, [_1]) } - public var Notifications_GroupNotificationsAlert: String { return self._s[388]! } - public var Passport_Language_km: String { return self._s[389]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[391]! } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[392]! } - public var Notification_CallMissedShort: String { return self._s[393]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[394]! } - public var Watch_Compose_Send: String { return self._s[395]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[398]! } - public var Conversation_HoldForVideo: String { return self._s[399]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[401]! } - public var Appearance_AutoNightThemeDisabled: String { return self._s[403]! } - public var Channel_LinkItem: String { return self._s[404]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[389]! } + public var Passport_Language_km: String { return self._s[390]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[392]! } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[393]! } + public var Notification_CallMissedShort: String { return self._s[394]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[395]! } + public var Watch_Compose_Send: String { return self._s[396]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[399]! } + public var Conversation_HoldForVideo: String { return self._s[400]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[402]! } + public var Appearance_AutoNightThemeDisabled: String { return self._s[404]! } + public var Channel_LinkItem: String { return self._s[405]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[405]!, self._r[405]!, [_0, _1]) + return formatWithArgumentRanges(self._s[406]!, self._r[406]!, [_0, _1]) } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[408]!, self._r[408]!, [_0]) + return formatWithArgumentRanges(self._s[409]!, self._r[409]!, [_0]) } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[409]! } - public var Passport_Language_dv: String { return self._s[410]! } - public var Undo_LeftChannel: String { return self._s[411]! } - public var Notifications_ExceptionsMuted: String { return self._s[412]! } - public var ChatList_UnhideAction: String { return self._s[413]! } - public var Conversation_ContextMenuShare: String { return self._s[414]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[415]! } - public var ShareFileTip_Title: String { return self._s[416]! } - public var NotificationsSound_Chord: String { return self._s[417]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[410]! } + public var Passport_Language_dv: String { return self._s[411]! } + public var Undo_LeftChannel: String { return self._s[412]! } + public var Notifications_ExceptionsMuted: String { return self._s[413]! } + public var ChatList_UnhideAction: String { return self._s[414]! } + public var Conversation_ContextMenuShare: String { return self._s[415]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[416]! } + public var ShareFileTip_Title: String { return self._s[417]! } + public var NotificationsSound_Chord: String { return self._s[418]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[418]!, self._r[418]!, [_1, _2]) + return formatWithArgumentRanges(self._s[419]!, self._r[419]!, [_1, _2]) } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[419]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[420]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[420]!, self._r[420]!, [_0]) + return formatWithArgumentRanges(self._s[421]!, self._r[421]!, [_0]) } - public var Notification_CallOutgoingShort: String { return self._s[422]! } + public var Wallpaper_ErrorNotFound: String { return self._s[422]! } + public var Notification_CallOutgoingShort: String { return self._s[424]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[423]!, self._r[423]!, [_1, _2]) + return formatWithArgumentRanges(self._s[425]!, self._r[425]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBill: String { return self._s[424]! } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[425]! } - public var ReportPeer_Report: String { return self._s[426]! } - public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[427]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[428]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[426]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[427]! } + public var ReportPeer_Report: String { return self._s[428]! } + public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[429]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[430]! } public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[429]!, self._r[429]!, [_1, _2]) + return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_1, _2]) } - public var StickerPack_Send: String { return self._s[430]! } - public var Login_CodeSentInternal: String { return self._s[431]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[432]! } + public var StickerPack_Send: String { return self._s[432]! } + public var Login_CodeSentInternal: String { return self._s[433]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[434]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[433]!, self._r[433]!, [_0]) - } - public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[435]!, self._r[435]!, [_0]) } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[436]! } - public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[437]!, self._r[437]!, [_1]) + public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[437]!, self._r[437]!, [_0]) } - public var ReportPeer_ReasonViolence: String { return self._s[439]! } - public var Map_Locating: String { return self._s[440]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[438]! } + public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[439]!, self._r[439]!, [_1]) + } + public var ReportPeer_ReasonViolence: String { return self._s[441]! } + public var Map_Locating: String { return self._s[442]! } public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[441]!, self._r[441]!, [_0]) + return formatWithArgumentRanges(self._s[443]!, self._r[443]!, [_0]) } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[442]!, self._r[442]!, [_1]) + return formatWithArgumentRanges(self._s[444]!, self._r[444]!, [_1]) } - public var AutoDownloadSettings_GroupChats: String { return self._s[444]! } - public var CheckoutInfo_SaveInfo: String { return self._s[445]! } - public var SharedMedia_EmptyLinksText: String { return self._s[447]! } - public var Passport_Address_CityPlaceholder: String { return self._s[448]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[449]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[450]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[452]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[446]! } + public var CheckoutInfo_SaveInfo: String { return self._s[447]! } + public var SharedMedia_EmptyLinksText: String { return self._s[449]! } + public var Passport_Address_CityPlaceholder: String { return self._s[450]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[451]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[452]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[454]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[453]!, self._r[453]!, [_1]) + return formatWithArgumentRanges(self._s[455]!, self._r[455]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[454]!, self._r[454]!, [_0]) + return formatWithArgumentRanges(self._s[456]!, self._r[456]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[455]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[456]! } - public var ChangePhoneNumberCode_Code: String { return self._s[457]! } - public var Appearance_CreateTheme: String { return self._s[458]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[457]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[458]! } + public var ChangePhoneNumberCode_Code: String { return self._s[459]! } + public var Appearance_CreateTheme: String { return self._s[460]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[459]!, self._r[459]!, [_0]) + return formatWithArgumentRanges(self._s[461]!, self._r[461]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[460]! } - public var HashtagSearch_AllChats: String { return self._s[461]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[463]! } + public var TwoStepAuth_SetupEmail: String { return self._s[462]! } + public var HashtagSearch_AllChats: String { return self._s[463]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[465]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[464]!, self._r[464]!, [_0]) + return formatWithArgumentRanges(self._s[466]!, self._r[466]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[466]! } + public var PhotoEditor_QualityHigh: String { return self._s[468]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[467]!, self._r[467]!, [_0]) + return formatWithArgumentRanges(self._s[469]!, self._r[469]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[468]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[469]! } - public var Message_LiveLocation: String { return self._s[470]! } - public var Cache_LowDiskSpaceText: String { return self._s[471]! } - public var Conversation_SendMessage: String { return self._s[472]! } - public var AuthSessions_EmptyTitle: String { return self._s[473]! } - public var Privacy_PhoneNumber: String { return self._s[474]! } - public var PeopleNearby_CreateGroup: String { return self._s[475]! } - public var CallSettings_UseLessData: String { return self._s[476]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[477]! } - public var Stickers_AddToFavorites: String { return self._s[478]! } - public var PhotoEditor_QualityLow: String { return self._s[479]! } - public var Watch_UserInfo_Unblock: String { return self._s[480]! } - public var Settings_Logout: String { return self._s[481]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[470]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[471]! } + public var Message_LiveLocation: String { return self._s[472]! } + public var Cache_LowDiskSpaceText: String { return self._s[473]! } + public var Conversation_SendMessage: String { return self._s[474]! } + public var AuthSessions_EmptyTitle: String { return self._s[475]! } + public var Privacy_PhoneNumber: String { return self._s[476]! } + public var PeopleNearby_CreateGroup: String { return self._s[477]! } + public var CallSettings_UseLessData: String { return self._s[478]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[479]! } + public var Stickers_AddToFavorites: String { return self._s[480]! } + public var PhotoEditor_QualityLow: String { return self._s[481]! } + public var Watch_UserInfo_Unblock: String { return self._s[482]! } + public var Settings_Logout: String { return self._s[483]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[482]!, self._r[482]!, [_1]) + return formatWithArgumentRanges(self._s[484]!, self._r[484]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[483]! } - public var ChannelInfo_Stats: String { return self._s[484]! } - public var TextFormat_Link: String { return self._s[485]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[485]! } + public var ChannelInfo_Stats: String { return self._s[486]! } + public var TextFormat_Link: String { return self._s[487]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[486]!, self._r[486]!, [_1, _2]) + return formatWithArgumentRanges(self._s[488]!, self._r[488]!, [_1, _2]) } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[487]!, self._r[487]!, [_0]) + return formatWithArgumentRanges(self._s[489]!, self._r[489]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[488]! } - public var Group_Setup_TypePublicHelp: String { return self._s[489]! } - public var Passport_Scans_UploadNew: String { return self._s[490]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[491]! } - public var DialogList_Title: String { return self._s[494]! } - public var NotificationSettings_ContactJoined: String { return self._s[495]! } - public var GroupInfo_LabelAdmin: String { return self._s[496]! } - public var KeyCommand_ChatInfo: String { return self._s[497]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[498]! } - public var Call_ReportIncludeLog: String { return self._s[499]! } + public var Watch_Notification_Joined: String { return self._s[490]! } + public var Group_Setup_TypePublicHelp: String { return self._s[491]! } + public var Passport_Scans_UploadNew: String { return self._s[492]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[493]! } + public var DialogList_Title: String { return self._s[496]! } + public var NotificationSettings_ContactJoined: String { return self._s[497]! } + public var GroupInfo_LabelAdmin: String { return self._s[498]! } + public var KeyCommand_ChatInfo: String { return self._s[499]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[500]! } + public var Call_ReportIncludeLog: String { return self._s[501]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[502]!, self._r[502]!, [_0]) + return formatWithArgumentRanges(self._s[504]!, self._r[504]!, [_0]) } - public var LocalGroup_IrrelevantWarning: String { return self._s[503]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[504]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[505]! } - public var Message_Sticker: String { return self._s[506]! } - public var LastSeen_JustNow: String { return self._s[508]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[510]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[511]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[512]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[513]! } - public var TwoStepAuth_Email: String { return self._s[514]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[515]! } - public var PhotoEditor_BlurToolOff: String { return self._s[516]! } - public var Message_PinnedStickerMessage: String { return self._s[517]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[518]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[519]! } - public var Passport_DiscardMessageTitle: String { return self._s[520]! } - public var Privacy_PaymentsTitle: String { return self._s[521]! } - public var Channel_DiscussionGroup_Header: String { return self._s[523]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[524]! } - public var Appearance_ColorTheme: String { return self._s[525]! } - public var UserInfo_ShareContact: String { return self._s[526]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[527]! } - public var Common_More: String { return self._s[528]! } - public var Watch_Message_Call: String { return self._s[529]! } - public var Profile_EncryptionKey: String { return self._s[532]! } - public var Privacy_TopPeers: String { return self._s[533]! } - public var Conversation_StopPollConfirmation: String { return self._s[534]! } - public var Privacy_TopPeersWarning: String { return self._s[536]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[537]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[538]! } - public var DialogList_SearchSectionMessages: String { return self._s[541]! } - public var Notifications_ChannelNotifications: String { return self._s[542]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[543]! } - public var Passport_Language_sk: String { return self._s[544]! } - public var Notification_MessageLifetime1h: String { return self._s[545]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[546]! } - public var Call_ReportSkip: String { return self._s[548]! } - public var Cache_ServiceFiles: String { return self._s[549]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[550]! } - public var VoiceOver_Chat_YourFile: String { return self._s[551]! } - public var Map_Hybrid: String { return self._s[552]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[554]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[556]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[557]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[558]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[561]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[505]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[506]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[507]! } + public var Message_Sticker: String { return self._s[508]! } + public var LastSeen_JustNow: String { return self._s[510]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[512]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[513]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[514]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[515]! } + public var TwoStepAuth_Email: String { return self._s[516]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[517]! } + public var PhotoEditor_BlurToolOff: String { return self._s[518]! } + public var Message_PinnedStickerMessage: String { return self._s[519]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[520]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[521]! } + public var Passport_DiscardMessageTitle: String { return self._s[522]! } + public var Privacy_PaymentsTitle: String { return self._s[523]! } + public var Channel_DiscussionGroup_Header: String { return self._s[525]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[526]! } + public var Appearance_ColorTheme: String { return self._s[527]! } + public var UserInfo_ShareContact: String { return self._s[528]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[529]! } + public var Common_More: String { return self._s[530]! } + public var Watch_Message_Call: String { return self._s[531]! } + public var Profile_EncryptionKey: String { return self._s[534]! } + public var Privacy_TopPeers: String { return self._s[535]! } + public var Conversation_StopPollConfirmation: String { return self._s[536]! } + public var Privacy_TopPeersWarning: String { return self._s[538]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[539]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[540]! } + public var DialogList_SearchSectionMessages: String { return self._s[543]! } + public var Notifications_ChannelNotifications: String { return self._s[544]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[545]! } + public var Passport_Language_sk: String { return self._s[546]! } + public var Notification_MessageLifetime1h: String { return self._s[547]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[548]! } + public var Call_ReportSkip: String { return self._s[550]! } + public var Cache_ServiceFiles: String { return self._s[551]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[552]! } + public var VoiceOver_Chat_YourFile: String { return self._s[553]! } + public var Map_Hybrid: String { return self._s[554]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[556]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[558]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[559]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[560]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[563]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[562]!, self._r[562]!, [_1]) + return formatWithArgumentRanges(self._s[564]!, self._r[564]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[564]! } - public var ScheduledMessages_ScheduledToday: String { return self._s[565]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[566]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[567]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[566]!, self._r[566]!, [_1, _2]) + return formatWithArgumentRanges(self._s[568]!, self._r[568]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[567]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[568]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[569]! } - public var UserInfo_ShareBot: String { return self._s[572]! } + public var Conversation_LiveLocationYou: String { return self._s[569]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[570]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[571]! } + public var UserInfo_ShareBot: String { return self._s[574]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[573]!, self._r[573]!, [_1, _2]) + return formatWithArgumentRanges(self._s[575]!, self._r[575]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[574]! } - public var Message_Audio: String { return self._s[575]! } - public var Passport_Language_lt: String { return self._s[576]! } + public var PhotoEditor_ShadowsTint: String { return self._s[576]! } + public var Message_Audio: String { return self._s[577]! } + public var Passport_Language_lt: String { return self._s[578]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[577]!, self._r[577]!, [_0]) + return formatWithArgumentRanges(self._s[579]!, self._r[579]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[578]! } - public var Conversation_FileICloudDrive: String { return self._s[579]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[580]! } + public var Permissions_SiriText_v0: String { return self._s[580]! } + public var Conversation_FileICloudDrive: String { return self._s[581]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[582]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[581]!, self._r[581]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[582]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[584]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_0]) + return formatWithArgumentRanges(self._s[585]!, self._r[585]!, [_0]) } - public var Channel_SignMessages: String { return self._s[584]! } + public var Channel_SignMessages: String { return self._s[586]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[585]!, self._r[585]!, [_1]) + return formatWithArgumentRanges(self._s[587]!, self._r[587]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[586]! } - public var Passport_ScanPassport: String { return self._s[587]! } - public var Watch_Suggestion_Thanks: String { return self._s[588]! } - public var BlockedUsers_AddNew: String { return self._s[589]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[588]! } + public var Passport_ScanPassport: String { return self._s[589]! } + public var Watch_Suggestion_Thanks: String { return self._s[590]! } + public var BlockedUsers_AddNew: String { return self._s[591]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[590]!, self._r[590]!, [_1, _2]) + return formatWithArgumentRanges(self._s[592]!, self._r[592]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[591]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[592]! } - public var Month_GenJuly: String { return self._s[593]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[594]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[596]! } - public var Notification_ChannelInviterSelf: String { return self._s[597]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[598]! } + public var Watch_Message_Invoice: String { return self._s[593]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[594]! } + public var Month_GenJuly: String { return self._s[595]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[596]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[598]! } + public var Notification_ChannelInviterSelf: String { return self._s[599]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[600]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_1, _2]) + return formatWithArgumentRanges(self._s[601]!, self._r[601]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[600]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[601]! } + public var CheckoutInfo_Title: String { return self._s[602]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[603]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[602]!, self._r[602]!, [_0]) + return formatWithArgumentRanges(self._s[604]!, self._r[604]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[603]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[604]! } - public var Passport_Language_de: String { return self._s[605]! } - public var Update_Title: String { return self._s[606]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[607]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[608]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[609]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[610]! } - public var NotificationsSound_Telegraph: String { return self._s[611]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[612]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[613]! } + public var Passport_Identity_MainPage: String { return self._s[605]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[606]! } + public var Passport_Language_de: String { return self._s[607]! } + public var Update_Title: String { return self._s[608]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[609]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[610]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[611]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[612]! } + public var NotificationsSound_Telegraph: String { return self._s[613]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[614]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[615]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[614]!, self._r[614]!, [_0]) + return formatWithArgumentRanges(self._s[616]!, self._r[616]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[615]! } - public var Conversation_ForwardTitle: String { return self._s[616]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[617]! } + public var Stickers_SuggestAll: String { return self._s[617]! } + public var Conversation_ForwardTitle: String { return self._s[618]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[619]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_0]) + return formatWithArgumentRanges(self._s[620]!, self._r[620]!, [_0]) } - public var Calls_NewCall: String { return self._s[619]! } - public var Call_StatusEnded: String { return self._s[620]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[621]! } - public var Settings_ProxyConnected: String { return self._s[622]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[623]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[624]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[625]! } - public var Passport_PasswordPlaceholder: String { return self._s[626]! } - public var Message_PinnedInvoice: String { return self._s[627]! } - public var Passport_Identity_IssueDate: String { return self._s[628]! } - public var Passport_Language_pl: String { return self._s[629]! } + public var Calls_NewCall: String { return self._s[621]! } + public var Call_StatusEnded: String { return self._s[622]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[623]! } + public var Settings_ProxyConnected: String { return self._s[624]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[625]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[626]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[627]! } + public var Passport_PasswordPlaceholder: String { return self._s[628]! } + public var Message_PinnedInvoice: String { return self._s[629]! } + public var Passport_Identity_IssueDate: String { return self._s[630]! } + public var Passport_Language_pl: String { return self._s[631]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[630]!, self._r[630]!, [_0]) + return formatWithArgumentRanges(self._s[632]!, self._r[632]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[631]! } - public var Call_StatusConnecting: String { return self._s[632]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[633]! } + public var Call_StatusConnecting: String { return self._s[634]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[633]!, self._r[633]!, [_0]) + return formatWithArgumentRanges(self._s[635]!, self._r[635]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[635]! } - public var Common_Edit: String { return self._s[636]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[637]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[637]! } + public var Common_Edit: String { return self._s[638]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[639]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[638]!, self._r[638]!, [_0]) + return formatWithArgumentRanges(self._s[640]!, self._r[640]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[639]! } - public var PrivateDataSettings_Title: String { return self._s[640]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[641]! } - public var ChatList_Read: String { return self._s[642]! } - public var Undo_ChatClearedForBothSides: String { return self._s[643]! } - public var GroupPermission_SectionTitle: String { return self._s[644]! } + public var GroupInfo_ChatAdmins: String { return self._s[641]! } + public var PrivateDataSettings_Title: String { return self._s[642]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[643]! } + public var ChatList_Read: String { return self._s[644]! } + public var Undo_ChatClearedForBothSides: String { return self._s[645]! } + public var GroupPermission_SectionTitle: String { return self._s[646]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_1, _2]) + return formatWithArgumentRanges(self._s[648]!, self._r[648]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[647]! } - public var Update_UpdateApp: String { return self._s[648]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[649]! } - public var Settings_Appearance: String { return self._s[650]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[653]! } - public var Watch_Location_Access: String { return self._s[654]! } - public var ShareMenu_CopyShareLink: String { return self._s[656]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[657]! } - public var Conversation_Theme: String { return self._s[659]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[649]! } + public var Update_UpdateApp: String { return self._s[650]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[651]! } + public var Settings_Appearance: String { return self._s[652]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[655]! } + public var Watch_Location_Access: String { return self._s[656]! } + public var ShareMenu_CopyShareLink: String { return self._s[658]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[659]! } + public var Conversation_Theme: String { return self._s[661]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[660]!, self._r[660]!, [_0]) + return formatWithArgumentRanges(self._s[662]!, self._r[662]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[661]! } - public var Weekday_ShortWednesday: String { return self._s[662]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[663]! } - public var Undo_LeftGroup: String { return self._s[666]! } - public var Conversation_LinkDialogCopy: String { return self._s[667]! } - public var KeyCommand_FocusOnInputField: String { return self._s[669]! } - public var Contacts_SelectAll: String { return self._s[670]! } - public var Preview_SaveToCameraRoll: String { return self._s[671]! } - public var PrivacySettings_PasscodeOff: String { return self._s[672]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[673]! } - public var Wallpaper_Title: String { return self._s[674]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[675]! } - public var AccessDenied_Camera: String { return self._s[676]! } - public var Watch_Compose_CurrentLocation: String { return self._s[677]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[679]! } + public var Notifications_ClassicTones: String { return self._s[663]! } + public var Weekday_ShortWednesday: String { return self._s[664]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[665]! } + public var Undo_LeftGroup: String { return self._s[668]! } + public var Conversation_LinkDialogCopy: String { return self._s[669]! } + public var KeyCommand_FocusOnInputField: String { return self._s[671]! } + public var Contacts_SelectAll: String { return self._s[672]! } + public var Preview_SaveToCameraRoll: String { return self._s[673]! } + public var PrivacySettings_PasscodeOff: String { return self._s[674]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[675]! } + public var Wallpaper_Title: String { return self._s[676]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[677]! } + public var AccessDenied_Camera: String { return self._s[678]! } + public var Watch_Compose_CurrentLocation: String { return self._s[679]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[681]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[680]!, self._r[680]!, [_0]) + return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[681]! } - public var Passport_Language_ro: String { return self._s[682]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[683]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[683]! } + public var Passport_Language_ro: String { return self._s[684]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[685]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[684]!, self._r[684]!, [_0]) + return formatWithArgumentRanges(self._s[686]!, self._r[686]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[685]! } - public var State_ConnectingToProxy: String { return self._s[686]! } - public var Calls_RatingTitle: String { return self._s[687]! } - public var Generic_ErrorMoreInfo: String { return self._s[688]! } - public var Appearance_PreviewReplyText: String { return self._s[689]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[690]! } - public var SharedMedia_CategoryLinks: String { return self._s[691]! } - public var Calls_Missed: String { return self._s[692]! } - public var Cache_Photos: String { return self._s[696]! } - public var GroupPermission_NoAddMembers: String { return self._s[697]! } - public var ScheduledMessages_Title: String { return self._s[698]! } + public var Login_CancelPhoneVerification: String { return self._s[687]! } + public var State_ConnectingToProxy: String { return self._s[688]! } + public var Calls_RatingTitle: String { return self._s[689]! } + public var Generic_ErrorMoreInfo: String { return self._s[690]! } + public var Appearance_PreviewReplyText: String { return self._s[691]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[692]! } + public var SharedMedia_CategoryLinks: String { return self._s[693]! } + public var Calls_Missed: String { return self._s[694]! } + public var Cache_Photos: String { return self._s[698]! } + public var GroupPermission_NoAddMembers: String { return self._s[699]! } + public var ScheduledMessages_Title: String { return self._s[700]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_0]) + return formatWithArgumentRanges(self._s[701]!, self._r[701]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[700]! } - public var Settings_ProxyDisabled: String { return self._s[701]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[702]! } + public var Settings_ProxyDisabled: String { return self._s[703]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[703]!, self._r[703]!, [_0]) + return formatWithArgumentRanges(self._s[705]!, self._r[705]!, [_0]) } - public var Appearance_Title: String { return self._s[705]! } + public var Appearance_Title: String { return self._s[707]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[707]!, self._r[707]!, [_0]) + return formatWithArgumentRanges(self._s[709]!, self._r[709]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[708]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[709]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[710]! } - public var Preview_DeletePhoto: String { return self._s[711]! } - public var Appearance_AppIconFilledX: String { return self._s[712]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[713]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[710]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[711]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[712]! } + public var Preview_DeletePhoto: String { return self._s[713]! } + public var Appearance_AppIconFilledX: String { return self._s[714]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[715]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[714]!, self._r[714]!, [_0]) + return formatWithArgumentRanges(self._s[716]!, self._r[716]!, [_0]) } - public var Coub_TapForSound: String { return self._s[716]! } - public var Map_LocatingError: String { return self._s[717]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[719]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[720]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[721]! } - public var Passport_ForgottenPassword: String { return self._s[722]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[723]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[724]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[726]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[727]! } - public var Message_Location: String { return self._s[728]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[729]! } - public var Channel_Management_Title: String { return self._s[730]! } - public var DialogList_SearchSectionDialogs: String { return self._s[732]! } - public var Compose_NewChannel_Members: String { return self._s[733]! } + public var Coub_TapForSound: String { return self._s[718]! } + public var Map_LocatingError: String { return self._s[719]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[721]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[722]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[723]! } + public var Passport_ForgottenPassword: String { return self._s[724]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[725]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[726]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[728]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[729]! } + public var Message_Location: String { return self._s[730]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[731]! } + public var Channel_Management_Title: String { return self._s[732]! } + public var DialogList_SearchSectionDialogs: String { return self._s[734]! } + public var Compose_NewChannel_Members: String { return self._s[735]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[734]!, self._r[734]!, [_0]) + return formatWithArgumentRanges(self._s[736]!, self._r[736]!, [_0]) } - public var GroupInfo_Location: String { return self._s[735]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[736]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[737]! } - public var PhotoEditor_WarmthTool: String { return self._s[738]! } - public var Passport_Language_tr: String { return self._s[739]! } + public var GroupInfo_Location: String { return self._s[737]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[738]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[739]! } + public var PhotoEditor_WarmthTool: String { return self._s[740]! } + public var Passport_Language_tr: String { return self._s[741]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[740]!, self._r[740]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[742]!, self._r[742]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[742]! } - public var Watch_PhotoView_Title: String { return self._s[743]! } - public var Passport_Phone_Delete: String { return self._s[744]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[745]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[746]! } - public var GroupInfo_Permissions: String { return self._s[747]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[748]! } - public var Profile_ShareContactButton: String { return self._s[749]! } - public var ChatSettings_Other: String { return self._s[750]! } - public var UserInfo_NotificationsDisabled: String { return self._s[751]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[752]! } - public var LastSeen_WithinAMonth: String { return self._s[753]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[754]! } - public var Conversation_ReportGroupLocation: String { return self._s[755]! } - public var Conversation_EncryptionCanceled: String { return self._s[756]! } - public var MediaPicker_GroupDescription: String { return self._s[757]! } - public var WebSearch_Images: String { return self._s[758]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[744]! } + public var Watch_PhotoView_Title: String { return self._s[745]! } + public var Passport_Phone_Delete: String { return self._s[746]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[747]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[748]! } + public var GroupInfo_Permissions: String { return self._s[749]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[750]! } + public var Profile_ShareContactButton: String { return self._s[751]! } + public var ChatSettings_Other: String { return self._s[752]! } + public var UserInfo_NotificationsDisabled: String { return self._s[753]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[754]! } + public var LastSeen_WithinAMonth: String { return self._s[755]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[756]! } + public var Conversation_ReportGroupLocation: String { return self._s[757]! } + public var Conversation_EncryptionCanceled: String { return self._s[758]! } + public var MediaPicker_GroupDescription: String { return self._s[759]! } + public var WebSearch_Images: String { return self._s[760]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[759]!, self._r[759]!, [_0]) + return formatWithArgumentRanges(self._s[761]!, self._r[761]!, [_0]) } - public var Message_Photo: String { return self._s[760]! } - public var PasscodeSettings_HelpBottom: String { return self._s[761]! } - public var CreateTheme_ShortLink: String { return self._s[762]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[763]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[764]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[765]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[766]! } - public var NotificationsSound_Calypso: String { return self._s[767]! } - public var Map_Map: String { return self._s[768]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[770]! } - public var ChatSettings_TextSizeUnits: String { return self._s[771]! } + public var Message_Photo: String { return self._s[762]! } + public var PasscodeSettings_HelpBottom: String { return self._s[763]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[764]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[765]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[766]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[767]! } + public var NotificationsSound_Calypso: String { return self._s[768]! } + public var Map_Map: String { return self._s[769]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[771]! } + public var ChatSettings_TextSizeUnits: String { return self._s[772]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[772]!, self._r[772]!, [_0]) + return formatWithArgumentRanges(self._s[773]!, self._r[773]!, [_0]) } - public var Common_of: String { return self._s[773]! } - public var Conversation_ForwardContacts: String { return self._s[776]! } + public var Common_of: String { return self._s[774]! } + public var Conversation_ForwardContacts: String { return self._s[777]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[778]!, self._r[778]!, [_0]) + return formatWithArgumentRanges(self._s[779]!, self._r[779]!, [_0]) } - public var Passport_Language_hy: String { return self._s[779]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[780]! } - public var AutoDownloadSettings_Reset: String { return self._s[781]! } - public var Paint_ClearConfirm: String { return self._s[782]! } - public var Camera_VideoMode: String { return self._s[783]! } + public var Passport_Language_hy: String { return self._s[780]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[781]! } + public var AutoDownloadSettings_Reset: String { return self._s[782]! } + public var Paint_ClearConfirm: String { return self._s[783]! } + public var Camera_VideoMode: String { return self._s[784]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[784]!, self._r[784]!, [_0]) + return formatWithArgumentRanges(self._s[785]!, self._r[785]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[785]! } - public var Conversation_ViewBackground: String { return self._s[786]! } - public var Passport_Language_el: String { return self._s[787]! } - public var PhotoEditor_Original: String { return self._s[788]! } - public var Settings_FAQ_Button: String { return self._s[790]! } - public var Channel_Setup_PublicNoLink: String { return self._s[792]! } - public var Conversation_UnsupportedMedia: String { return self._s[793]! } - public var Conversation_SlideToCancel: String { return self._s[794]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[795]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[796]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[797]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[798]! } - public var AutoNightTheme_NotAvailable: String { return self._s[799]! } - public var Conversation_Owner: String { return self._s[800]! } - public var Common_Create: String { return self._s[801]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[802]! } - public var Localization_ChooseLanguage: String { return self._s[804]! } - public var Settings_Proxy: String { return self._s[807]! } - public var Privacy_TopPeersHelp: String { return self._s[808]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[809]! } - public var Chat_UnsendMyMessages: String { return self._s[810]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[786]! } + public var Conversation_ViewBackground: String { return self._s[787]! } + public var Passport_Language_el: String { return self._s[788]! } + public var PhotoEditor_Original: String { return self._s[789]! } + public var Settings_FAQ_Button: String { return self._s[791]! } + public var Channel_Setup_PublicNoLink: String { return self._s[793]! } + public var Conversation_UnsupportedMedia: String { return self._s[794]! } + public var Conversation_SlideToCancel: String { return self._s[795]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[796]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[797]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[798]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[799]! } + public var AutoNightTheme_NotAvailable: String { return self._s[800]! } + public var Conversation_Owner: String { return self._s[801]! } + public var Common_Create: String { return self._s[802]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[803]! } + public var Localization_ChooseLanguage: String { return self._s[805]! } + public var Settings_Proxy: String { return self._s[808]! } + public var Privacy_TopPeersHelp: String { return self._s[809]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[810]! } + public var Chat_UnsendMyMessages: String { return self._s[811]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[811]!, self._r[811]!, [_0]) + return formatWithArgumentRanges(self._s[812]!, self._r[812]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[812]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[813]! } public func Contacts_AccessDeniedHelpPortrait(_ _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 Contacts_SortedByPresence: String { return self._s[815]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[816]! } - public var Cache_Title: String { return self._s[817]! } + public var Contacts_SortedByPresence: String { return self._s[816]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[817]! } + public var Cache_Title: String { return self._s[818]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[818]!, self._r[818]!, [_0]) + return formatWithArgumentRanges(self._s[819]!, self._r[819]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[819]! } - public var Channel_Moderator_Title: String { return self._s[820]! } - public var InstantPage_AutoNightTheme: String { return self._s[822]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[820]! } + public var Channel_Moderator_Title: String { return self._s[821]! } + public var InstantPage_AutoNightTheme: String { return self._s[823]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[825]!, self._r[825]!, [_1]) + return formatWithArgumentRanges(self._s[826]!, self._r[826]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[826]! } - public var Undo_Undo: String { return self._s[828]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[829]! } - public var TwoStepAuth_RemovePassword: String { return self._s[830]! } - public var Common_Delete: String { return self._s[831]! } - public var Contacts_AddPeopleNearby: String { return self._s[833]! } - public var Conversation_ContextMenuDelete: String { return self._s[834]! } - public var SocksProxySetup_Credentials: String { return self._s[835]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[837]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[840]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[841]! } - public var Passport_Language_id: String { return self._s[843]! } - public var WallpaperSearch_ColorTeal: String { return self._s[844]! } - public var ChannelIntro_Title: String { return self._s[845]! } + public var Passport_Scans_Upload: String { return self._s[827]! } + public var Undo_Undo: String { return self._s[829]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[830]! } + public var TwoStepAuth_RemovePassword: String { return self._s[831]! } + public var Common_Delete: String { return self._s[832]! } + public var Contacts_AddPeopleNearby: String { return self._s[834]! } + public var Conversation_ContextMenuDelete: String { return self._s[835]! } + public var SocksProxySetup_Credentials: String { return self._s[836]! } + public var Appearance_EditTheme: String { return self._s[838]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[839]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[842]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[843]! } + public var Passport_Language_id: String { return self._s[845]! } + public var WallpaperSearch_ColorTeal: String { return self._s[846]! } + public var ChannelIntro_Title: String { return self._s[847]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[846]!, self._r[846]!, [_0]) + return formatWithArgumentRanges(self._s[848]!, self._r[848]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[848]! } - public var VoiceOver_Chat_Reply: String { return self._s[849]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[850]! } - public var Channel_Info_Description: String { return self._s[851]! } - public var Stickers_FavoriteStickers: String { return self._s[852]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[853]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[854]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[855]! } - public var Group_PublicLink_Placeholder: String { return self._s[856]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[857]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[850]! } + public var VoiceOver_Chat_Reply: String { return self._s[851]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[852]! } + public var Channel_Info_Description: String { return self._s[853]! } + public var Stickers_FavoriteStickers: String { return self._s[854]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[855]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[856]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[857]! } + public var Group_PublicLink_Placeholder: String { return self._s[858]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[859]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_1]) + return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1]) } - public var TextFormat_Underline: String { return self._s[859]! } + public var TextFormat_Underline: String { return self._s[861]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1, _2]) + return formatWithArgumentRanges(self._s[862]!, self._r[862]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_0]) + return formatWithArgumentRanges(self._s[863]!, self._r[863]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[862]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[864]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[863]!, self._r[863]!, [_1, _2]) + return formatWithArgumentRanges(self._s[865]!, self._r[865]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[864]! } - public var Passport_Language_uk: String { return self._s[865]! } - public var StickerPack_HideStickers: String { return self._s[867]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[868]! } + public var GroupPermission_Delete: String { return self._s[866]! } + public var Passport_Language_uk: String { return self._s[867]! } + public var StickerPack_HideStickers: String { return self._s[869]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[870]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[869]!, self._r[869]!, [_1, _2]) + return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[870]! } + public var Activity_UploadingVideoMessage: String { return self._s[872]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_0]) + return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[872]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[873]! } - public var Settings_CallSettings: String { return self._s[874]! } - public var Camera_SquareMode: String { return self._s[875]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[876]! } - public var GroupInfo_SharedMediaNone: String { return self._s[877]! } + public var Channel_TitleInfo: String { return self._s[874]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[875]! } + public var Settings_CallSettings: String { return self._s[876]! } + public var Camera_SquareMode: String { return self._s[877]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[878]! } + public var GroupInfo_SharedMediaNone: String { return self._s[879]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[878]!, self._r[878]!, [_1]) + return formatWithArgumentRanges(self._s[880]!, self._r[880]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[879]! } - public var Application_Update: String { return self._s[881]! } - public var Month_ShortJanuary: String { return self._s[882]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[883]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[884]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[885]! } - public var Passport_Address_Street2Placeholder: String { return self._s[886]! } + public var Bot_GenericBotStatus: String { return self._s[881]! } + public var Application_Update: String { return self._s[883]! } + public var Month_ShortJanuary: String { return self._s[884]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[885]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[886]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[887]! } + public var Passport_Address_Street2Placeholder: String { return self._s[888]! } public func Map_LiveLocationShortHour(_ _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 NetworkUsageSettings_Cellular: String { return self._s[888]! } - public var Appearance_PreviewOutgoingText: String { return self._s[889]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[890]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[892]! } - public var Map_Directions: String { return self._s[893]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[895]! } - public var Appearance_ThemeDay: String { return self._s[896]! } - public var LogoutOptions_LogOut: String { return self._s[897]! } - public var Group_PublicLink_Title: String { return self._s[899]! } - public var Channel_AddBotErrorNoRights: String { return self._s[900]! } - public var Passport_Identity_AddPassport: String { return self._s[901]! } - public var LocalGroup_ButtonTitle: String { return self._s[902]! } - public var Call_Message: String { return self._s[903]! } - public var PhotoEditor_ExposureTool: String { return self._s[904]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[906]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[908]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[909]! } - public var Appearance_Preview: String { return self._s[910]! } - public var Compose_ChannelMembers: String { return self._s[911]! } - public var Conversation_DeleteManyMessages: String { return self._s[912]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[913]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[914]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[915]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[918]! } - public var Conversation_UpdateTelegram: String { return self._s[919]! } + public var NetworkUsageSettings_Cellular: String { return self._s[890]! } + public var Appearance_PreviewOutgoingText: String { return self._s[891]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[892]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[894]! } + public var Map_Directions: String { return self._s[895]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[897]! } + public var Appearance_ThemeDay: String { return self._s[898]! } + public var LogoutOptions_LogOut: String { return self._s[899]! } + public var Group_PublicLink_Title: String { return self._s[901]! } + public var Channel_AddBotErrorNoRights: String { return self._s[902]! } + public var Passport_Identity_AddPassport: String { return self._s[903]! } + public var LocalGroup_ButtonTitle: String { return self._s[904]! } + public var Call_Message: String { return self._s[905]! } + public var PhotoEditor_ExposureTool: String { return self._s[906]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[908]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[910]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[911]! } + public var Appearance_Preview: String { return self._s[912]! } + public var Compose_ChannelMembers: String { return self._s[913]! } + public var Conversation_DeleteManyMessages: String { return self._s[914]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[915]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[916]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[917]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[920]! } + public var Conversation_UpdateTelegram: String { return self._s[921]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_0]) + return formatWithArgumentRanges(self._s[922]!, self._r[922]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_1]) + return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[922]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[923]! } + public var GroupInfo_Administrators_Title: String { return self._s[924]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[925]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) + return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_0]) } - public var Tour_Title3: String { return self._s[925]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[926]! } - public var Clipboard_SendPhoto: String { return self._s[930]! } - public var MediaPicker_Videos: String { return self._s[931]! } - public var Passport_Email_Title: String { return self._s[932]! } + public var Tour_Title3: String { return self._s[927]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[928]! } + public var Clipboard_SendPhoto: String { return self._s[932]! } + public var MediaPicker_Videos: String { return self._s[933]! } + public var Passport_Email_Title: String { return self._s[934]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[933]!, self._r[933]!, [_0]) + return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[934]! } - public var Conversation_MessageDialogDelete: String { return self._s[935]! } - public var Privacy_Calls_CustomHelp: String { return self._s[937]! } - public var Message_Wallpaper: String { return self._s[938]! } - public var MemberSearch_BotSection: String { return self._s[939]! } - public var GroupInfo_SetSound: String { return self._s[940]! } - public var Core_ServiceUserStatus: String { return self._s[941]! } - public var LiveLocationUpdated_JustNow: String { return self._s[942]! } - public var Call_StatusFailed: String { return self._s[943]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[944]! } - public var TwoStepAuth_SetPassword: String { return self._s[945]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[946]! } + public var StickerPacksSettings_Title: String { return self._s[936]! } + public var Conversation_MessageDialogDelete: String { return self._s[937]! } + public var Privacy_Calls_CustomHelp: String { return self._s[939]! } + public var Message_Wallpaper: String { return self._s[940]! } + public var MemberSearch_BotSection: String { return self._s[941]! } + public var GroupInfo_SetSound: String { return self._s[942]! } + public var Core_ServiceUserStatus: String { return self._s[943]! } + public var LiveLocationUpdated_JustNow: String { return self._s[944]! } + public var Call_StatusFailed: String { return self._s[945]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[946]! } + public var TwoStepAuth_SetPassword: String { return self._s[947]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[948]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[948]!, self._r[948]!, [_0]) + return formatWithArgumentRanges(self._s[950]!, self._r[950]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[949]! } - public var Profile_Username: String { return self._s[950]! } - public var Bot_DescriptionTitle: String { return self._s[951]! } - public var MaskStickerSettings_Title: String { return self._s[952]! } - public var SharedMedia_CategoryOther: String { return self._s[953]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[954]! } - public var Common_NotNow: String { return self._s[955]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[956]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[957]! } - public var Map_Location: String { return self._s[958]! } - public var Invitation_JoinGroup: String { return self._s[959]! } - public var AutoDownloadSettings_Title: String { return self._s[961]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[962]! } - public var Channel_ErrorAddBlocked: String { return self._s[963]! } - public var Conversation_UnblockUser: String { return self._s[964]! } - public var Watch_Bot_Restart: String { return self._s[965]! } - public var TwoStepAuth_Title: String { return self._s[966]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[967]! } - public var Checkout_ShippingMethod: String { return self._s[968]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[969]! } + public var Calls_SubmitRating: String { return self._s[951]! } + public var Profile_Username: String { return self._s[952]! } + public var Bot_DescriptionTitle: String { return self._s[953]! } + public var MaskStickerSettings_Title: String { return self._s[954]! } + public var SharedMedia_CategoryOther: String { return self._s[955]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[956]! } + public var Common_NotNow: String { return self._s[957]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[958]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[959]! } + public var Map_Location: String { return self._s[960]! } + public var Invitation_JoinGroup: String { return self._s[961]! } + public var AutoDownloadSettings_Title: String { return self._s[963]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[964]! } + public var Channel_ErrorAddBlocked: String { return self._s[965]! } + public var Conversation_UnblockUser: String { return self._s[966]! } + public var Watch_Bot_Restart: String { return self._s[967]! } + public var TwoStepAuth_Title: String { return self._s[968]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[969]! } + public var Checkout_ShippingMethod: String { return self._s[970]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[971]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[970]!, self._r[970]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) + return formatWithArgumentRanges(self._s[974]!, self._r[974]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[973]!, self._r[973]!, [_0]) + return formatWithArgumentRanges(self._s[975]!, self._r[975]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[974]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[975]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[976]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[977]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[978]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[979]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[980]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[981]! } - public var Checkout_PaymentMethod_Title: String { return self._s[982]! } - public var SocksProxySetup_Connection: String { return self._s[983]! } - public var Group_MessagePhotoRemoved: String { return self._s[984]! } - public var Channel_Stickers_NotFound: String { return self._s[986]! } - public var Group_About_Help: String { return self._s[987]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[988]! } - public var PeopleNearby_Title: String { return self._s[990]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[976]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[977]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[978]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[979]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[980]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[981]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[982]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[983]! } + public var Checkout_PaymentMethod_Title: String { return self._s[984]! } + public var SocksProxySetup_Connection: String { return self._s[985]! } + public var Group_MessagePhotoRemoved: String { return self._s[986]! } + public var Channel_Stickers_NotFound: String { return self._s[988]! } + public var Group_About_Help: String { return self._s[989]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[990]! } + public var PeopleNearby_Title: String { return self._s[992]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[991]!, self._r[991]!, [_1]) + return formatWithArgumentRanges(self._s[993]!, self._r[993]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[993]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[994]! } - public var SocksProxySetup_Password: String { return self._s[995]! } - public var Notifications_PermissionsEnable: String { return self._s[996]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[998]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[995]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[996]! } + public var SocksProxySetup_Password: String { return self._s[997]! } + public var Notifications_PermissionsEnable: String { return self._s[998]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1000]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[999]!, self._r[999]!, [_1]) + return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_1]) } + public var EditTheme_ShortLinkInfo: String { return self._s[1002]! } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_0]) + return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1002]! } - public var ArchivedPacksAlert_Title: String { return self._s[1003]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1005]! } + public var ArchivedPacksAlert_Title: String { return self._s[1006]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1007]!, self._r[1007]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1005]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1007]! } - public var Conversation_StatusTyping: String { return self._s[1008]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1009]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1010]! } - public var UserInfo_CreateNewContact: String { return self._s[1011]! } - public var Passport_Identity_FrontSide: String { return self._s[1012]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1013]! } - public var Calls_CallTabTitle: String { return self._s[1014]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1015]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1008]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1010]! } + public var Conversation_StatusTyping: String { return self._s[1011]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1012]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1013]! } + public var UserInfo_CreateNewContact: String { return self._s[1014]! } + public var Passport_Identity_FrontSide: String { return self._s[1015]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1016]! } + public var Calls_CallTabTitle: String { return self._s[1017]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1018]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_0]) + return formatWithArgumentRanges(self._s[1020]!, self._r[1020]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1018]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1019]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1020]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1021]! } - public var Paint_Stickers: String { return self._s[1022]! } - public var Privacy_GroupsAndChannels: String { return self._s[1023]! } - public var UserInfo_AddContact: String { return self._s[1025]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1021]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1022]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1023]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1024]! } + public var Paint_Stickers: String { return self._s[1025]! } + public var Privacy_GroupsAndChannels: String { return self._s[1026]! } + public var UserInfo_AddContact: String { return self._s[1028]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_0]) + return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1028]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1031]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1030]!, self._r[1030]!, [_0]) + return formatWithArgumentRanges(self._s[1033]!, self._r[1033]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1031]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1032]! } - public var BlockedUsers_BlockUser: String { return self._s[1033]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1034]! } - public var MediaPicker_UngroupDescription: String { return self._s[1035]! } - public var Watch_NoConnection: String { return self._s[1036]! } - public var Month_GenSeptember: String { return self._s[1037]! } - public var Conversation_ViewGroup: String { return self._s[1038]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1041]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1042]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1043]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1044]! } - public var MediaPicker_CameraRoll: String { return self._s[1046]! } - public var Month_GenAugust: String { return self._s[1047]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1048]! } - public var SharedMedia_EmptyText: String { return self._s[1049]! } - public var Map_ShareLiveLocation: String { return self._s[1050]! } - public var Calls_All: String { return self._s[1051]! } - public var Appearance_ThemeNight: String { return self._s[1054]! } - public var Conversation_HoldForAudio: String { return self._s[1055]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1058]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1059]! } - public var SocksProxySetup_Secret: String { return self._s[1060]! } + public var DialogList_NoMessagesTitle: String { return self._s[1034]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1035]! } + public var BlockedUsers_BlockUser: String { return self._s[1036]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1037]! } + public var MediaPicker_UngroupDescription: String { return self._s[1038]! } + public var Watch_NoConnection: String { return self._s[1039]! } + public var Month_GenSeptember: String { return self._s[1040]! } + public var Conversation_ViewGroup: String { return self._s[1041]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1044]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1045]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1046]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1047]! } + public var MediaPicker_CameraRoll: String { return self._s[1049]! } + public var Month_GenAugust: String { return self._s[1050]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1051]! } + public var SharedMedia_EmptyText: String { return self._s[1052]! } + public var Map_ShareLiveLocation: String { return self._s[1053]! } + public var Calls_All: String { return self._s[1054]! } + public var Appearance_ThemeNight: String { return self._s[1057]! } + public var Conversation_HoldForAudio: String { return self._s[1058]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1061]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1062]! } + public var SocksProxySetup_Secret: String { return self._s[1063]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_0]) + return formatWithArgumentRanges(self._s[1064]!, self._r[1064]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1063]! } - public var Conversation_Location: String { return self._s[1064]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1066]! } + public var Conversation_Location: String { return self._s[1067]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1065]!, self._r[1065]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1068]!, self._r[1068]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1067]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1068]! } - public var Notifications_PermissionsText: String { return self._s[1069]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1070]! } - public var Call_Flip: String { return self._s[1071]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1073]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1074]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1076]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1078]! } - public var Channel_TooMuchBots: String { return self._s[1080]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1081]! } - public var Login_InvalidCodeError: String { return self._s[1082]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1083]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1070]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1071]! } + public var Notifications_PermissionsText: String { return self._s[1072]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1073]! } + public var Call_Flip: String { return self._s[1074]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1076]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1077]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1079]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1081]! } + public var Channel_TooMuchBots: String { return self._s[1083]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1084]! } + public var Login_InvalidCodeError: String { return self._s[1085]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1086]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1084]!, self._r[1084]!, [_0]) + return formatWithArgumentRanges(self._s[1087]!, self._r[1087]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0]) + return formatWithArgumentRanges(self._s[1088]!, self._r[1088]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1086]! } - public var Call_CallInProgressTitle: String { return self._s[1087]! } - public var Month_ShortSeptember: String { return self._s[1088]! } - public var Watch_ChannelInfo_Title: String { return self._s[1089]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1092]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1093]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1094]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1095]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1096]! } - public var PhotoEditor_CropReset: String { return self._s[1097]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1099]! } - public var Channel_Management_LabelEditor: String { return self._s[1100]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1102]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1103]! } - public var UserInfo_Title: String { return self._s[1104]! } - public var ChatList_HideAction: String { return self._s[1105]! } - public var AccessDenied_Title: String { return self._s[1106]! } - public var DialogList_SearchLabel: String { return self._s[1107]! } - public var Group_Setup_HistoryHidden: String { return self._s[1108]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1109]! } - public var State_Updating: String { return self._s[1111]! } - public var Contacts_TabTitle: String { return self._s[1112]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1114]! } - public var GroupInfo_GroupHistory: String { return self._s[1115]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1116]! } - public var Wallpaper_SetColor: String { return self._s[1117]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1118]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1119]! } - public var Chat_AttachmentLimitReached: String { return self._s[1120]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1121]! } - public var Contacts_NotRegisteredSection: String { return self._s[1122]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1089]! } + public var Call_CallInProgressTitle: String { return self._s[1090]! } + public var Month_ShortSeptember: String { return self._s[1091]! } + public var Watch_ChannelInfo_Title: String { return self._s[1092]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1095]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1096]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1097]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1098]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1099]! } + public var PhotoEditor_CropReset: String { return self._s[1100]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1102]! } + public var Channel_Management_LabelEditor: String { return self._s[1103]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1105]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1106]! } + public var UserInfo_Title: String { return self._s[1107]! } + public var ChatList_HideAction: String { return self._s[1108]! } + public var AccessDenied_Title: String { return self._s[1109]! } + public var DialogList_SearchLabel: String { return self._s[1110]! } + public var Group_Setup_HistoryHidden: String { return self._s[1111]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1112]! } + public var State_Updating: String { return self._s[1114]! } + public var Contacts_TabTitle: String { return self._s[1115]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1117]! } + public var GroupInfo_GroupHistory: String { return self._s[1118]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1119]! } + public var Wallpaper_SetColor: String { return self._s[1120]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1121]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1122]! } + public var Chat_AttachmentLimitReached: String { return self._s[1123]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1124]! } + public var Contacts_NotRegisteredSection: String { return self._s[1125]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1123]!, self._r[1123]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1126]!, self._r[1126]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1124]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1125]! } - public var SocksProxySetup_Connecting: String { return self._s[1126]! } - public var ExplicitContent_AlertChannel: String { return self._s[1127]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1128]! } - public var Conversation_Contact: String { return self._s[1129]! } - public var Login_CodeExpired: String { return self._s[1130]! } - public var Passport_DiscardMessageAction: String { return self._s[1131]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1132]! } + public var Paint_Clear: String { return self._s[1127]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1128]! } + public var SocksProxySetup_Connecting: String { return self._s[1129]! } + public var ExplicitContent_AlertChannel: String { return self._s[1130]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1131]! } + public var Conversation_Contact: String { return self._s[1132]! } + public var Login_CodeExpired: String { return self._s[1133]! } + public var Passport_DiscardMessageAction: String { return self._s[1134]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1135]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1133]!, self._r[1133]!, [_0]) - } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1134]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1135]! } - public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1136]!, self._r[1136]!, [_0]) } - public var Month_ShortApril: String { return self._s[1137]! } - public var AuthSessions_CurrentSession: String { return self._s[1138]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1141]! } - public var WallpaperPreview_CropTopText: String { return self._s[1143]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1144]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1145]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1137]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1138]! } + public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1139]!, self._r[1139]!, [_0]) + } + public var Month_ShortApril: String { return self._s[1140]! } + public var AuthSessions_CurrentSession: String { return self._s[1141]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1144]! } + public var WallpaperPreview_CropTopText: String { return self._s[1146]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1147]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1148]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1146]!, self._r[1146]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1149]!, self._r[1149]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1147]! } - public var Channel_Setup_TypePrivate: String { return self._s[1149]! } - public var Forward_ChannelReadOnly: String { return self._s[1152]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1153]! } - public var AddContact_SharedContactException: String { return self._s[1154]! } - public var UserInfo_BotPrivacy: String { return self._s[1156]! } - public var Notification_PassportValueEmail: String { return self._s[1157]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1158]! } - public var GroupPermission_NewTitle: String { return self._s[1159]! } - public var CallFeedback_ReasonDropped: String { return self._s[1160]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1161]! } - public var Channel_SignMessages_Help: String { return self._s[1163]! } - public var Undo_ChatDeleted: String { return self._s[1165]! } - public var Conversation_ChatBackground: String { return self._s[1166]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1167]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1168]! } - public var Passport_Language_pt: String { return self._s[1169]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1170]! } - public var NotificationsSound_Popcorn: String { return self._s[1173]! } - public var AutoNightTheme_Disabled: String { return self._s[1174]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1175]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1176]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1177]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1178]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1150]! } + public var Channel_Setup_TypePrivate: String { return self._s[1152]! } + public var Forward_ChannelReadOnly: String { return self._s[1155]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1156]! } + public var AddContact_SharedContactException: String { return self._s[1157]! } + public var UserInfo_BotPrivacy: String { return self._s[1159]! } + public var Notification_PassportValueEmail: String { return self._s[1160]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1161]! } + public var GroupPermission_NewTitle: String { return self._s[1162]! } + public var CallFeedback_ReasonDropped: String { return self._s[1163]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1164]! } + public var Channel_SignMessages_Help: String { return self._s[1166]! } + public var Undo_ChatDeleted: String { return self._s[1168]! } + public var Conversation_ChatBackground: String { return self._s[1169]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1170]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1171]! } + public var Passport_Language_pt: String { return self._s[1172]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1173]! } + public var NotificationsSound_Popcorn: String { return self._s[1176]! } + public var AutoNightTheme_Disabled: String { return self._s[1177]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1178]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1179]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1180]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1181]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1179]!, self._r[1179]!, [_0]) + return formatWithArgumentRanges(self._s[1182]!, self._r[1182]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1180]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1181]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1183]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1183]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1184]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1186]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1184]!, self._r[1184]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1187]!, self._r[1187]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1187]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1188]! } - public var Compose_NewEncryptedChat: String { return self._s[1189]! } - public var Login_CodeFloodError: String { return self._s[1190]! } - public var Calls_TabTitle: String { return self._s[1191]! } - public var Privacy_ProfilePhoto: String { return self._s[1192]! } - public var Passport_Language_he: String { return self._s[1193]! } + public var SocksProxySetup_Hostname: String { return self._s[1190]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1191]! } + public var Compose_NewEncryptedChat: String { return self._s[1192]! } + public var Login_CodeFloodError: String { return self._s[1193]! } + public var Calls_TabTitle: String { return self._s[1194]! } + public var Privacy_ProfilePhoto: String { return self._s[1195]! } + public var Passport_Language_he: String { return self._s[1196]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1194]!, self._r[1194]!, [_0]) + return formatWithArgumentRanges(self._s[1197]!, self._r[1197]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1195]! } + public var GroupPermission_Title: String { return self._s[1198]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1196]!, self._r[1196]!, [_0]) + return formatWithArgumentRanges(self._s[1199]!, self._r[1199]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1197]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1198]! } - public var Tour_Text1: String { return self._s[1199]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1200]! } - public var Month_ShortFebruary: String { return self._s[1201]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1202]! } - public var NotificationsSound_Glass: String { return self._s[1203]! } - public var Appearance_ThemeNightBlue: String { return self._s[1204]! } - public var CheckoutInfo_Pay: String { return self._s[1205]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1207]! } - public var Call_CallAgain: String { return self._s[1209]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1210]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1211]! } - public var Passport_InvalidPasswordError: String { return self._s[1212]! } - public var Watch_Message_Game: String { return self._s[1213]! } - public var Stickers_Install: String { return self._s[1214]! } - public var VoiceOver_Chat_Message: String { return self._s[1215]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1216]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1218]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1219]! } - public var AuthSessions_OtherSessions: String { return self._s[1220]! } - public var Channel_Username_Help: String { return self._s[1221]! } - public var Camera_Title: String { return self._s[1222]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1224]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1225]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1226]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1227]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1228]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1229]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1230]! } - public var Conversation_RestrictedStickers: String { return self._s[1231]! } - public var CreateTheme_Preview: String { return self._s[1232]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1234]! } - public var UserInfo_TelegramCall: String { return self._s[1236]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1237]! } - public var CreatePoll_OptionsHeader: String { return self._s[1238]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1239]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1240]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1241]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1242]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1200]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1201]! } + public var Tour_Text1: String { return self._s[1202]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1203]! } + public var Month_ShortFebruary: String { return self._s[1204]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1205]! } + public var NotificationsSound_Glass: String { return self._s[1206]! } + public var Appearance_ThemeNightBlue: String { return self._s[1207]! } + public var CheckoutInfo_Pay: String { return self._s[1208]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1210]! } + public var Call_CallAgain: String { return self._s[1212]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1213]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1214]! } + public var Passport_InvalidPasswordError: String { return self._s[1215]! } + public var Watch_Message_Game: String { return self._s[1216]! } + public var Stickers_Install: String { return self._s[1217]! } + public var VoiceOver_Chat_Message: String { return self._s[1218]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1219]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1221]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1222]! } + public var AuthSessions_OtherSessions: String { return self._s[1223]! } + public var Channel_Username_Help: String { return self._s[1224]! } + public var Camera_Title: String { return self._s[1225]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1227]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1228]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1229]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1230]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1231]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1232]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1233]! } + public var Conversation_RestrictedStickers: String { return self._s[1234]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1236]! } + public var UserInfo_TelegramCall: String { return self._s[1238]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1239]! } + public var CreatePoll_OptionsHeader: String { return self._s[1240]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1241]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1242]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1243]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1244]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1243]!, self._r[1243]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1245]!, self._r[1245]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1244]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1245]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1246]! } - public var Conversation_MessageDialogRetry: String { return self._s[1247]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1248]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1249]! } - public var Group_Setup_TypeHeader: String { return self._s[1250]! } - public var Paint_RecentStickers: String { return self._s[1251]! } - public var PhotoEditor_GrainTool: String { return self._s[1252]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1253]! } - public var EmptyGroupInfo_Line4: String { return self._s[1254]! } - public var Watch_AuthRequired: String { return self._s[1256]! } + public var Settings_SaveEditedPhotos: String { return self._s[1246]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1247]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1248]! } + public var Conversation_MessageDialogRetry: String { return self._s[1249]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1250]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1251]! } + public var Group_Setup_TypeHeader: String { return self._s[1252]! } + public var Paint_RecentStickers: String { return self._s[1253]! } + public var PhotoEditor_GrainTool: String { return self._s[1254]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1255]! } + public var EmptyGroupInfo_Line4: String { return self._s[1256]! } + public var Watch_AuthRequired: String { return self._s[1258]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1257]!, self._r[1257]!, [_0]) + return formatWithArgumentRanges(self._s[1259]!, self._r[1259]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1258]! } - public var ChannelIntro_Text: String { return self._s[1259]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1260]! } - public var GroupPermission_NoSendMedia: String { return self._s[1261]! } - public var Calls_AddTab: String { return self._s[1262]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1263]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1264]! } - public var Notification_MessageLifetime1d: String { return self._s[1265]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1266]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1267]! } - public var Passport_Identity_GenderFemale: String { return self._s[1268]! } - public var BlockedUsers_BlockTitle: String { return self._s[1269]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1260]! } + public var ChannelIntro_Text: String { return self._s[1261]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1262]! } + public var GroupPermission_NoSendMedia: String { return self._s[1263]! } + public var Calls_AddTab: String { return self._s[1264]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1265]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1266]! } + public var Notification_MessageLifetime1d: String { return self._s[1267]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1268]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1269]! } + public var Passport_Identity_GenderFemale: String { return self._s[1270]! } + public var BlockedUsers_BlockTitle: String { return self._s[1271]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_1]) + return formatWithArgumentRanges(self._s[1272]!, self._r[1272]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1271]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1272]! } - public var ChatList_ArchiveAction: String { return self._s[1273]! } - public var AutoNightTheme_Scheduled: String { return self._s[1274]! } + public var Weekday_Yesterday: String { return self._s[1273]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1274]! } + public var ChatList_ArchiveAction: String { return self._s[1275]! } + public var AutoNightTheme_Scheduled: String { return self._s[1276]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1275]!, self._r[1275]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1276]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1278]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1278]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1279]! } + public var CreatePoll_Create: String { return self._s[1280]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1281]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1281]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1282]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1284]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1283]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1284]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1286]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1]) + return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1286]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1287]! } + public var Preview_OpenInInstagram: String { return self._s[1288]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1289]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1288]!, self._r[1288]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1290]!, self._r[1290]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1289]!, self._r[1289]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1291]!, self._r[1291]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1290]! } - public var ArchivedChats_IntroText3: String { return self._s[1291]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1292]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1293]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1294]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1292]! } + public var ArchivedChats_IntroText3: String { return self._s[1293]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1294]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1295]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1296]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1295]!, self._r[1295]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1297]!, self._r[1297]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1297]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1298]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1299]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1300]! } - public var Gif_NoGifsFound: String { return self._s[1301]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1302]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1303]! } - public var GroupInfo_ActionPromote: String { return self._s[1304]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1305]! } - public var GroupInfo_Permissions_Title: String { return self._s[1306]! } - public var Permissions_ContactsText_v0: String { return self._s[1307]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1308]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1309]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1312]! } - public var Passport_FieldEmailHelp: String { return self._s[1313]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1299]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1300]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1301]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1302]! } + public var Gif_NoGifsFound: String { return self._s[1303]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1304]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1305]! } + public var EditTheme_Preview: String { return self._s[1306]! } + public var GroupInfo_ActionPromote: String { return self._s[1307]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1308]! } + public var GroupInfo_Permissions_Title: String { return self._s[1309]! } + public var Permissions_ContactsText_v0: String { return self._s[1310]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1311]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1312]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1315]! } + public var Passport_FieldEmailHelp: String { return self._s[1316]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_0]) + return formatWithArgumentRanges(self._s[1317]!, self._r[1317]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1315]! } - public var Weekday_ShortSaturday: String { return self._s[1316]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1317]! } - public var Watch_Conversation_UserInfo: String { return self._s[1318]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1319]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1320]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1321]! } - public var PhotoEditor_VignetteTool: String { return self._s[1322]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1323]! } - public var Passport_Language_et: String { return self._s[1324]! } - public var AppUpgrade_Running: String { return self._s[1325]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1327]! } - public var Passport_Language_bg: String { return self._s[1328]! } - public var Stickers_NoStickersFound: String { return self._s[1330]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1318]! } + public var Weekday_ShortSaturday: String { return self._s[1319]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1320]! } + public var Watch_Conversation_UserInfo: String { return self._s[1321]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1322]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1323]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1324]! } + public var PhotoEditor_VignetteTool: String { return self._s[1325]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1326]! } + public var Passport_Language_et: String { return self._s[1327]! } + public var AppUpgrade_Running: String { return self._s[1328]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1330]! } + public var Passport_Language_bg: String { return self._s[1331]! } + public var Stickers_NoStickersFound: String { return self._s[1333]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1335]!, self._r[1335]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_0]) + return formatWithArgumentRanges(self._s[1336]!, self._r[1336]!, [_0]) } - public var Settings_About: String { return self._s[1334]! } + public var Settings_About: String { return self._s[1337]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1335]!, self._r[1335]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1338]!, self._r[1338]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1337]! } - public var Group_ErrorAddBlocked: String { return self._s[1338]! } + public var KeyCommand_NewMessage: String { return self._s[1340]! } + public var Group_ErrorAddBlocked: String { return self._s[1341]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1339]!, self._r[1339]!, [_0]) + return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1340]! } - public var ReportGroupLocation_Title: String { return self._s[1341]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1342]! } - public var Cache_ClearProgress: String { return self._s[1343]! } + public var Map_LocationTitle: String { return self._s[1343]! } + public var ReportGroupLocation_Title: String { return self._s[1344]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1345]! } + public var Cache_ClearProgress: String { return self._s[1346]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_0]) + return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1345]! } - public var Passport_UpdateRequiredError: String { return self._s[1346]! } + public var GroupRemoved_AddToGroup: String { return self._s[1348]! } + public var Passport_UpdateRequiredError: String { return self._s[1349]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_1]) + return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1349]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1350]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1351]! } - public var Passport_Language_ka: String { return self._s[1352]! } - public var Call_Decline: String { return self._s[1353]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1354]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1352]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1353]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1354]! } + public var Passport_Language_ka: String { return self._s[1355]! } + public var Call_Decline: String { return self._s[1356]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1357]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_0]) + return formatWithArgumentRanges(self._s[1360]!, self._r[1360]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1358]! } + public var CallFeedback_Send: String { return self._s[1361]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1360]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1362]! } - public var Passport_DeletePassport: String { return self._s[1363]! } - public var Appearance_AppIconFilled: String { return self._s[1364]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1365]! } - public var Month_ShortDecember: String { return self._s[1366]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1368]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1363]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1365]! } + public var Passport_DeletePassport: String { return self._s[1366]! } + public var Appearance_AppIconFilled: String { return self._s[1367]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1368]! } + public var Month_ShortDecember: String { return self._s[1369]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1371]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_0]) + return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1370]! } - public var Conversation_EncryptedDescription1: String { return self._s[1371]! } - public var Conversation_EncryptedDescription2: String { return self._s[1372]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1373]! } - public var Conversation_EncryptedDescription3: String { return self._s[1374]! } - public var PhotoEditor_SharpenTool: String { return self._s[1375]! } + public var Channel_Stickers_Searching: String { return self._s[1373]! } + public var Conversation_EncryptedDescription1: String { return self._s[1374]! } + public var Conversation_EncryptedDescription2: String { return self._s[1375]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1376]! } + public var Conversation_EncryptedDescription3: String { return self._s[1377]! } + public var PhotoEditor_SharpenTool: String { return self._s[1378]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_0]) + return formatWithArgumentRanges(self._s[1379]!, self._r[1379]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1378]! } - public var Channel_Members_AddMembers: String { return self._s[1379]! } - public var Wallpaper_Search: String { return self._s[1380]! } - public var Weekday_Friday: String { return self._s[1381]! } - public var Privacy_ContactsSync: String { return self._s[1382]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1383]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1384]! } + public var Conversation_EncryptedDescription4: String { return self._s[1381]! } + public var Channel_Members_AddMembers: String { return self._s[1382]! } + public var Wallpaper_Search: String { return self._s[1383]! } + public var Weekday_Friday: String { return self._s[1384]! } + public var Privacy_ContactsSync: String { return self._s[1385]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1386]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1387]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_0]) - } - public var GroupInfo_Permissions_Removed: String { return self._s[1386]! } - public var Passport_Identity_GenderMale: String { return self._s[1387]! } - public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1388]!, self._r[1388]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1389]! } - public var Conversation_JumpToDate: String { return self._s[1390]! } - public var Contacts_GlobalSearch: String { return self._s[1391]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1392]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1393]! } - public var Profile_MessageLifetime1d: String { return self._s[1394]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1389]! } + public var Passport_Identity_GenderMale: String { return self._s[1390]! } + public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1391]!, self._r[1391]!, [_0]) + } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1392]! } + public var Conversation_JumpToDate: String { return self._s[1393]! } + public var Contacts_GlobalSearch: String { return self._s[1394]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1395]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1396]! } + public var Profile_MessageLifetime1d: String { return self._s[1397]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1395]!, self._r[1395]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1398]! } + public var StickerPack_BuiltinPackName: String { return self._s[1401]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1400]! } - public var Passport_InfoTitle: String { return self._s[1402]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1403]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1403]! } + public var Passport_InfoTitle: String { return self._s[1405]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1406]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_0]) + return formatWithArgumentRanges(self._s[1410]!, self._r[1410]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1411]!, self._r[1411]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1409]! } - public var Profile_BotInfo: String { return self._s[1410]! } - public var Watch_Compose_CreateMessage: String { return self._s[1411]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1412]! } - public var Month_ShortNovember: String { return self._s[1413]! } - public var Conversation_ScamWarning: String { return self._s[1414]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1415]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1416]! } - public var NotificationsSound_Chime: String { return self._s[1417]! } - public var Passport_Language_ko: String { return self._s[1419]! } - public var InviteText_URL: String { return self._s[1420]! } - public var TextFormat_Monospace: String { return self._s[1421]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1412]! } + public var Profile_BotInfo: String { return self._s[1413]! } + public var Watch_Compose_CreateMessage: String { return self._s[1414]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1415]! } + public var Month_ShortNovember: String { return self._s[1416]! } + public var Conversation_ScamWarning: String { return self._s[1417]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1418]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1419]! } + public var NotificationsSound_Chime: String { return self._s[1420]! } + public var Passport_Language_ko: String { return self._s[1422]! } + public var InviteText_URL: String { return self._s[1423]! } + public var TextFormat_Monospace: String { return self._s[1424]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1425]!, self._r[1425]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0]) + return formatWithArgumentRanges(self._s[1426]!, self._r[1426]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1426]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1427]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1428]! } - public var Your_card_has_expired: String { return self._s[1429]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1430]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1431]! } - public var Conversation_Report: String { return self._s[1435]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1436]! } - public var Notification_MessageLifetime1m: String { return self._s[1437]! } - public var Privacy_ContactsTitle: String { return self._s[1438]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1439]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1440]! } - public var Channel_Members_Title: String { return self._s[1441]! } - public var Map_OpenInWaze: String { return self._s[1442]! } - public var Login_PhoneBannedError: String { return self._s[1443]! } + public var Passport_InfoLearnMore: String { return self._s[1429]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1430]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1431]! } + public var Your_card_has_expired: String { return self._s[1432]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1433]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1434]! } + public var Conversation_Report: String { return self._s[1438]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1439]! } + public var Notification_MessageLifetime1m: String { return self._s[1440]! } + public var Privacy_ContactsTitle: String { return self._s[1441]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1442]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1443]! } + public var Channel_Members_Title: String { return self._s[1444]! } + public var Map_OpenInWaze: String { return self._s[1445]! } + public var Login_PhoneBannedError: String { return self._s[1446]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1444]!, self._r[1444]!, [_0]) + return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1445]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1446]! } - public var Common_OK: String { return self._s[1447]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1448]! } - public var Cache_Music: String { return self._s[1449]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1450]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1451]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1452]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1448]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1449]! } + public var Common_OK: String { return self._s[1450]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1451]! } + public var Cache_Music: String { return self._s[1452]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1453]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1454]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1455]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1]) + return formatWithArgumentRanges(self._s[1456]!, self._r[1456]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1454]!, self._r[1454]!, [_0]) + return formatWithArgumentRanges(self._s[1457]!, self._r[1457]!, [_0]) } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1455]!, self._r[1455]!, [_0]) + return formatWithArgumentRanges(self._s[1458]!, self._r[1458]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1457]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1458]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1460]! } - public var State_ConnectingToProxyInfo: String { return self._s[1461]! } - public var Message_VideoMessage: String { return self._s[1463]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1464]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1465]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1466]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1467]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1468]! } - public var Activity_RecordingAudio: String { return self._s[1469]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1470]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1471]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1460]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1461]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1463]! } + public var State_ConnectingToProxyInfo: String { return self._s[1464]! } + public var Message_VideoMessage: String { return self._s[1466]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1467]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1468]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1469]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1470]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1471]! } + public var Activity_RecordingAudio: String { return self._s[1472]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1473]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1474]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1477]!, self._r[1477]!, [_0]) + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1478]! } - public var UserInfo_AddPhone: String { return self._s[1479]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1480]! } + public var Conversation_ApplyLocalization: String { return self._s[1481]! } + public var UserInfo_AddPhone: String { return self._s[1482]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1483]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1481]!, self._r[1481]!, [_0]) + return formatWithArgumentRanges(self._s[1484]!, self._r[1484]!, [_0]) } - public var Passport_Scans: String { return self._s[1483]! } - public var BlockedUsers_Unblock: String { return self._s[1484]! } + public var Passport_Scans: String { return self._s[1486]! } + public var BlockedUsers_Unblock: String { return self._s[1487]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1485]!, self._r[1485]!, [_1]) + return formatWithArgumentRanges(self._s[1488]!, self._r[1488]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1486]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1487]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1488]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1489]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1490]! } + public var Channel_Management_LabelCreator: String { return self._s[1489]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1490]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1491]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1492]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1493]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1491]!, self._r[1491]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1494]!, self._r[1494]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1492]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1493]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1494]! } - public var ChannelIntro_CreateChannel: String { return self._s[1495]! } - public var Conversation_UnreadMessages: String { return self._s[1496]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1497]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1498]! } - public var Notification_GroupActivated: String { return self._s[1499]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1500]! } + public var Login_PhoneNumberHelp: String { return self._s[1495]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1496]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1497]! } + public var ChannelIntro_CreateChannel: String { return self._s[1498]! } + public var Conversation_UnreadMessages: String { return self._s[1499]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1500]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1501]! } + public var Notification_GroupActivated: String { return self._s[1502]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1503]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0]) + return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1504]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1507]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0]) - } - public var Undo_DeletedChannel: String { return self._s[1506]! } - public var CallFeedback_AddComment: String { return self._s[1507]! } - public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1509]! } + public var Undo_DeletedChannel: String { return self._s[1509]! } + public var CallFeedback_AddComment: String { return self._s[1510]! } + public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_0]) + } + public var Document_TargetConfirmationFormat: String { return self._s[1512]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1510]!, self._r[1510]!, [_0]) + return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1511]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1514]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1512]!, self._r[1512]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1513]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1514]! } + public var Theme_ErrorNotFound: String { return self._s[1516]! } + public var Contacts_SortByName: String { return self._s[1517]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1518]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1517]! } - public var ScheduledMessages_EditTime: String { return self._s[1518]! } - public var Conversation_ClearSelfHistory: String { return self._s[1519]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1520]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1521]! } - public var Stickers_SuggestNone: String { return self._s[1522]! } - public var ChatSettings_Cache: String { return self._s[1523]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1524]! } - public var Media_ShareThisPhoto: String { return self._s[1525]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1526]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1527]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1528]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1529]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1530]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1531]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1532]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1534]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1535]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1536]! } - public var Map_OpenIn: String { return self._s[1537]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1521]! } + public var ScheduledMessages_EditTime: String { return self._s[1522]! } + public var Conversation_ClearSelfHistory: String { return self._s[1523]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1524]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1525]! } + public var Stickers_SuggestNone: String { return self._s[1526]! } + public var ChatSettings_Cache: String { return self._s[1527]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1528]! } + public var Media_ShareThisPhoto: String { return self._s[1529]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1530]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1531]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1532]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1533]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1534]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1535]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1536]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1538]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1539]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1540]! } + public var Map_OpenIn: String { return self._s[1541]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_1]) + return formatWithArgumentRanges(self._s[1544]!, self._r[1544]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1541]!, self._r[1541]!, [_0]) + return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1542]! } - public var MessagePoll_LabelClosed: String { return self._s[1543]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1545]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1546]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1547]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1548]! } - public var Login_SelectCountry_Title: String { return self._s[1549]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1550]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1546]! } + public var MessagePoll_LabelClosed: String { return self._s[1547]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1549]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1550]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1551]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1552]! } + public var Login_SelectCountry_Title: String { return self._s[1553]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1554]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1552]! } - public var Watch_Suggestion_BRB: String { return self._s[1553]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1554]! } - public var Contacts_PermissionsTitle: String { return self._s[1555]! } - public var Conversation_RestrictedInline: String { return self._s[1556]! } - public var StickerPack_ViewPack: String { return self._s[1558]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1556]! } + public var Watch_Suggestion_BRB: String { return self._s[1557]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1558]! } + public var Contacts_PermissionsTitle: String { return self._s[1559]! } + public var Conversation_RestrictedInline: String { return self._s[1560]! } + public var StickerPack_ViewPack: String { return self._s[1562]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_0]) + return formatWithArgumentRanges(self._s[1563]!, self._r[1563]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1561]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1564]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1566]! } - public var Channel_Info_Stickers: String { return self._s[1567]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1568]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1569]! } - public var Passport_DeletePersonalDetails: String { return self._s[1570]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1571]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1572]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1573]! } - public var Conversation_SearchNoResults: String { return self._s[1575]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1576]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1577]! } - public var Login_Code: String { return self._s[1578]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1579]! } - public var Weekday_ShortThursday: String { return self._s[1580]! } - public var Resolve_ErrorNotFound: String { return self._s[1582]! } - public var LastSeen_Offline: String { return self._s[1583]! } - public var PeopleNearby_NoMembers: String { return self._s[1584]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1585]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1586]! } - public var GroupInfo_Title: String { return self._s[1588]! } - public var NotificationsSound_Note: String { return self._s[1589]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1590]! } - public var Watch_Message_Poll: String { return self._s[1591]! } - public var Privacy_Calls: String { return self._s[1592]! } + public var Compose_NewChannel: String { return self._s[1565]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1568]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1570]! } + public var Channel_Info_Stickers: String { return self._s[1571]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1572]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1573]! } + public var Passport_DeletePersonalDetails: String { return self._s[1574]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1575]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1576]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1577]! } + public var Conversation_SearchNoResults: String { return self._s[1579]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1580]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1581]! } + public var Login_Code: String { return self._s[1582]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1583]! } + public var Weekday_ShortThursday: String { return self._s[1584]! } + public var Resolve_ErrorNotFound: String { return self._s[1586]! } + public var LastSeen_Offline: String { return self._s[1587]! } + public var PeopleNearby_NoMembers: String { return self._s[1588]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1589]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1590]! } + public var GroupInfo_Title: String { return self._s[1592]! } + public var NotificationsSound_Note: String { return self._s[1593]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1594]! } + public var Watch_Message_Poll: String { return self._s[1595]! } + public var Privacy_Calls: String { return self._s[1596]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1593]!, self._r[1593]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1597]!, self._r[1597]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1594]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1595]! } - public var Notifications_Reset: String { return self._s[1596]! } - public var Conversation_Pin: String { return self._s[1597]! } - public var Passport_Language_lv: String { return self._s[1598]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1599]! } - public var BlockedUsers_Info: String { return self._s[1600]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1602]! } - public var Watch_Conversation_Unblock: String { return self._s[1604]! } + public var Month_ShortAugust: String { return self._s[1598]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1599]! } + public var Notifications_Reset: String { return self._s[1600]! } + public var Conversation_Pin: String { return self._s[1601]! } + public var Passport_Language_lv: String { return self._s[1602]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1603]! } + public var BlockedUsers_Info: String { return self._s[1604]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1606]! } + public var Watch_Conversation_Unblock: String { return self._s[1608]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_0]) + return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1606]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1607]! } + public var CloudStorage_Title: String { return self._s[1610]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1611]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_0]) + return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1609]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1610]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1611]! } - public var Passport_Address_EditBankStatement: String { return self._s[1612]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1613]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1614]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1615]! } + public var Passport_Address_EditBankStatement: String { return self._s[1616]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1617]!, self._r[1617]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1614]! } - public var ShareMenu_Comment: String { return self._s[1615]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1616]! } - public var Notifications_PermissionsTitle: String { return self._s[1617]! } - public var GroupPermission_NoSendLinks: String { return self._s[1618]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1619]! } - public var Settings_Support: String { return self._s[1620]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1621]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1622]! } - public var Privacy_Forwards_Preview: String { return self._s[1623]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1624]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1625]! } - public var Common_Select: String { return self._s[1627]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1628]! } - public var WallpaperSearch_ColorGray: String { return self._s[1630]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1631]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1632]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1633]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1634]! } - public var Widget_AuthRequired: String { return self._s[1635]! } - public var Camera_FlashOn: String { return self._s[1636]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1637]! } - public var Watch_Suggestion_OK: String { return self._s[1638]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1618]! } + public var ShareMenu_Comment: String { return self._s[1619]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1620]! } + public var Notifications_PermissionsTitle: String { return self._s[1621]! } + public var GroupPermission_NoSendLinks: String { return self._s[1622]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1623]! } + public var Settings_Support: String { return self._s[1624]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1625]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1626]! } + public var Privacy_Forwards_Preview: String { return self._s[1627]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1628]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1629]! } + public var Common_Select: String { return self._s[1631]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1632]! } + public var WallpaperSearch_ColorGray: String { return self._s[1634]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1635]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1636]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1637]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1638]! } + public var Widget_AuthRequired: String { return self._s[1639]! } + public var Camera_FlashOn: String { return self._s[1640]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1641]! } + public var Watch_Suggestion_OK: String { return self._s[1642]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_0]) + return formatWithArgumentRanges(self._s[1644]!, self._r[1644]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1642]!, self._r[1642]!, [_0]) + return formatWithArgumentRanges(self._s[1646]!, self._r[1646]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1643]! } - public var DialogList_AdLabel: String { return self._s[1644]! } - public var WatchRemote_NotificationText: String { return self._s[1645]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1646]! } - public var Conversation_ReportSpam: String { return self._s[1647]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1648]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1650]! } - public var PhoneLabel_Title: String { return self._s[1651]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1652]! } - public var Settings_ChangePhoneNumber: String { return self._s[1653]! } - public var Notifications_ExceptionsTitle: String { return self._s[1654]! } - public var Notifications_AlertTones: String { return self._s[1655]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1656]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1657]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1658]! } - public var VoiceOver_Chat_Photo: String { return self._s[1660]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1661]! } - public var ReportPeer_ReasonOther: String { return self._s[1662]! } - public var KeyCommand_ScrollDown: String { return self._s[1664]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1665]! } + public var TextFormat_Strikethrough: String { return self._s[1647]! } + public var DialogList_AdLabel: String { return self._s[1648]! } + public var WatchRemote_NotificationText: String { return self._s[1649]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1650]! } + public var Conversation_ReportSpam: String { return self._s[1651]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1652]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1654]! } + public var PhoneLabel_Title: String { return self._s[1655]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1656]! } + public var Settings_ChangePhoneNumber: String { return self._s[1657]! } + public var Notifications_ExceptionsTitle: String { return self._s[1658]! } + public var Notifications_AlertTones: String { return self._s[1659]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1660]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1661]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1662]! } + public var VoiceOver_Chat_Photo: String { return self._s[1664]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1665]! } + public var ReportPeer_ReasonOther: String { return self._s[1666]! } + public var KeyCommand_ScrollDown: String { return self._s[1668]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1669]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_0]) + return formatWithArgumentRanges(self._s[1670]!, self._r[1670]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1667]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1668]! } - public var AuthSessions_LogOut: String { return self._s[1669]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1670]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1671]! } - public var Passport_Phone_Title: String { return self._s[1672]! } - public var Settings_PhoneNumber: String { return self._s[1673]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1671]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1672]! } + public var AuthSessions_LogOut: String { return self._s[1673]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1674]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1675]! } + public var Passport_Phone_Title: String { return self._s[1676]! } + public var Settings_PhoneNumber: String { return self._s[1677]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0]) + return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1675]! } - public var WebSearch_SearchNoResults: String { return self._s[1676]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1678]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1679]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1680]! } - public var PhotoEditor_CurvesTool: String { return self._s[1681]! } - public var Checkout_PaymentMethod: String { return self._s[1683]! } + public var NotificationsSound_Alert: String { return self._s[1679]! } + public var WebSearch_SearchNoResults: String { return self._s[1680]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1682]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1683]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1684]! } + public var PhotoEditor_CurvesTool: String { return self._s[1685]! } + public var Checkout_PaymentMethod: String { return self._s[1687]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1685]! } - public var Camera_PhotoMode: String { return self._s[1688]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1690]! } - public var CallSettings_OnMobile: String { return self._s[1691]! } - public var Tour_Text2: String { return self._s[1692]! } + public var Contacts_AccessDeniedError: String { return self._s[1689]! } + public var Camera_PhotoMode: String { return self._s[1692]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1694]! } + public var CallSettings_OnMobile: String { return self._s[1695]! } + public var Tour_Text2: String { return self._s[1696]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1697]!, self._r[1697]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1695]! } - public var Permissions_Skip: String { return self._s[1696]! } - public var SecretImage_Title: String { return self._s[1697]! } - public var Watch_MessageView_Title: String { return self._s[1698]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1699]! } - public var AttachmentMenu_Poll: String { return self._s[1700]! } + public var DialogList_EncryptionProcessing: String { return self._s[1699]! } + public var Permissions_Skip: String { return self._s[1700]! } + public var SecretImage_Title: String { return self._s[1701]! } + public var Watch_MessageView_Title: String { return self._s[1702]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1703]! } + public var AttachmentMenu_Poll: String { return self._s[1704]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_0]) + return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1702]!, self._r[1702]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1703]! } - public var WallpaperPreview_Title: String { return self._s[1704]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1705]! } - public var Settings_ProxyConnecting: String { return self._s[1706]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1708]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1709]! } - public var Profile_MessageLifetime5s: String { return self._s[1710]! } - public var Username_InvalidCharacters: String { return self._s[1711]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1712]! } - public var ScheduledMessages_ClearAll: String { return self._s[1713]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1714]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1715]! } - public var Settings_AddAccount: String { return self._s[1716]! } - public var Notification_CreatedChannel: String { return self._s[1719]! } + public var Notification_CallCanceled: String { return self._s[1707]! } + public var WallpaperPreview_Title: String { return self._s[1708]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1709]! } + public var Settings_ProxyConnecting: String { return self._s[1710]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1712]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1713]! } + public var Profile_MessageLifetime5s: String { return self._s[1714]! } + public var Username_InvalidCharacters: String { return self._s[1715]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1716]! } + public var ScheduledMessages_ClearAll: String { return self._s[1717]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1718]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1719]! } + public var Settings_AddAccount: String { return self._s[1720]! } + public var Notification_CreatedChannel: String { return self._s[1723]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1724]!, self._r[1724]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1722]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1723]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1724]! } - public var Contacts_TopSection: String { return self._s[1725]! } + public var Passcode_AppLockedAlert: String { return self._s[1726]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1727]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1728]! } + public var Contacts_TopSection: String { return self._s[1729]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1726]!, self._r[1726]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1730]!, self._r[1730]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1727]!, self._r[1727]!, [_0]) + return formatWithArgumentRanges(self._s[1731]!, self._r[1731]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1728]! } - public var UserInfo_TapToCall: String { return self._s[1729]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1731]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1732]! } - public var Common_Search: String { return self._s[1733]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1734]! } + public var ReportPeer_ReasonSpam: String { return self._s[1732]! } + public var UserInfo_TapToCall: String { return self._s[1733]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1735]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1736]! } + public var Common_Search: String { return self._s[1737]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1738]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) + return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1736]! } - public var Message_InvoiceLabel: String { return self._s[1737]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1738]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1739]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1740]! } + public var Message_InvoiceLabel: String { return self._s[1741]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1742]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1743]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1740]!, self._r[1740]!, [_0]) + return formatWithArgumentRanges(self._s[1744]!, self._r[1744]!, [_0]) } - public var Conversation_Info: String { return self._s[1741]! } - public var Login_InfoDeletePhoto: String { return self._s[1742]! } - public var Passport_Language_vi: String { return self._s[1744]! } - public var UserInfo_ScamUserWarning: String { return self._s[1745]! } - public var Conversation_Search: String { return self._s[1746]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1747]! } - public var ReportPeer_ReasonPornography: String { return self._s[1748]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1749]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1750]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1751]! } - public var Channel_Setup_TypeHeader: String { return self._s[1752]! } - public var AuthSessions_LoggedIn: String { return self._s[1753]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1754]! } - public var Login_SmsRequestState3: String { return self._s[1755]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1756]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1757]! } - public var Join_ChannelsTooMuch: String { return self._s[1758]! } - public var Channel_Edit_LinkItem: String { return self._s[1759]! } - public var Privacy_Calls_P2PNever: String { return self._s[1760]! } - public var Conversation_AddToReadingList: String { return self._s[1762]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1763]! } - public var Message_Animation: String { return self._s[1764]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1765]! } - public var Map_Unknown: String { return self._s[1766]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1767]! } + public var Conversation_Info: String { return self._s[1745]! } + public var Login_InfoDeletePhoto: String { return self._s[1746]! } + public var Passport_Language_vi: String { return self._s[1748]! } + public var UserInfo_ScamUserWarning: String { return self._s[1749]! } + public var Conversation_Search: String { return self._s[1750]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1751]! } + public var ReportPeer_ReasonPornography: String { return self._s[1752]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1753]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1754]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1755]! } + public var Channel_Setup_TypeHeader: String { return self._s[1756]! } + public var AuthSessions_LoggedIn: String { return self._s[1757]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1758]! } + public var Login_SmsRequestState3: String { return self._s[1759]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1760]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1761]! } + public var Join_ChannelsTooMuch: String { return self._s[1762]! } + public var Channel_Edit_LinkItem: String { return self._s[1763]! } + public var Privacy_Calls_P2PNever: String { return self._s[1764]! } + public var Conversation_AddToReadingList: String { return self._s[1766]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1767]! } + public var Message_Animation: String { return self._s[1768]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1769]! } + public var Map_Unknown: String { return self._s[1770]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1771]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_1, _2]) - } - public var Call_StatusRequesting: String { return self._s[1770]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1771]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1772]! } - public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_1, _2]) } + public var Call_StatusRequesting: String { return self._s[1774]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1775]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1776]! } + public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_1, _2]) + } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_0]) + return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_0]) } - public var Update_Skip: String { return self._s[1775]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1776]! } - public var Message_PinnedPollMessage: String { return self._s[1777]! } - public var BlockedUsers_Title: String { return self._s[1778]! } + public var Update_Skip: String { return self._s[1779]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1780]! } + public var Message_PinnedPollMessage: String { return self._s[1781]! } + public var BlockedUsers_Title: String { return self._s[1782]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1779]!, self._r[1779]!, [_1]) + return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1780]! } - public var NotificationsSound_Bell: String { return self._s[1781]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1782]! } - public var Weekday_Monday: String { return self._s[1783]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1784]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1785]! } - public var ChatSettings_Groups: String { return self._s[1786]! } + public var Username_CheckingUsername: String { return self._s[1784]! } + public var NotificationsSound_Bell: String { return self._s[1785]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1786]! } + public var Weekday_Monday: String { return self._s[1787]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1788]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1789]! } + public var ChatSettings_Groups: String { return self._s[1790]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1787]!, self._r[1787]!, [_0]) + return formatWithArgumentRanges(self._s[1791]!, self._r[1791]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1788]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1790]! } - public var ChatList_Unmute: String { return self._s[1791]! } - public var PhotoEditor_CurvesAll: String { return self._s[1792]! } - public var Weekday_ShortTuesday: String { return self._s[1793]! } - public var DialogList_Read: String { return self._s[1794]! } - public var Appearance_AppIconClassic: String { return self._s[1795]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1796]! } - public var Passport_Identity_Gender: String { return self._s[1797]! } + public var Your_card_was_declined: String { return self._s[1792]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1794]! } + public var ChatList_Unmute: String { return self._s[1795]! } + public var PhotoEditor_CurvesAll: String { return self._s[1796]! } + public var Weekday_ShortTuesday: String { return self._s[1797]! } + public var DialogList_Read: String { return self._s[1798]! } + public var Appearance_AppIconClassic: String { return self._s[1799]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1800]! } + public var Passport_Identity_Gender: String { return self._s[1801]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0]) + return formatWithArgumentRanges(self._s[1802]!, self._r[1802]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1799]! } + public var Target_SelectGroup: String { return self._s[1803]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1801]!, self._r[1801]!, [_0]) + return formatWithArgumentRanges(self._s[1805]!, self._r[1805]!, [_0]) } - public var Passport_Language_en: String { return self._s[1802]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1803]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1804]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1805]! } - public var ScheduledMessages_SendNow: String { return self._s[1806]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1808]! } - public var Login_InfoHelp: String { return self._s[1809]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1810]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1811]! } + public var Passport_Language_en: String { return self._s[1806]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1807]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1808]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1809]! } + public var ScheduledMessages_SendNow: String { return self._s[1810]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1812]! } + public var Login_InfoHelp: String { return self._s[1813]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1814]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1815]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1812]!, self._r[1812]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1816]!, self._r[1816]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1815]! } - public var CreatePoll_Title: String { return self._s[1816]! } - public var Conversation_ViewTheme: String { return self._s[1817]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1818]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1819]! } - public var UserInfo_GroupsInCommon: String { return self._s[1820]! } - public var Call_AudioRouteHide: String { return self._s[1821]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1823]! } + public var SocksProxySetup_AddProxy: String { return self._s[1819]! } + public var CreatePoll_Title: String { return self._s[1820]! } + public var Conversation_ViewTheme: String { return self._s[1821]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1822]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1823]! } + public var UserInfo_GroupsInCommon: String { return self._s[1824]! } + public var Call_AudioRouteHide: String { return self._s[1825]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1827]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_0]) + return formatWithArgumentRanges(self._s[1828]!, self._r[1828]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1825]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1826]! } - public var Notifications_Title: String { return self._s[1827]! } - public var Group_Username_InvalidTooShort: String { return self._s[1828]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1829]! } + public var TextFormat_Bold: String { return self._s[1829]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1830]! } + public var Notifications_Title: String { return self._s[1831]! } + public var Group_Username_InvalidTooShort: String { return self._s[1832]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1833]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1830]!, self._r[1830]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1834]!, self._r[1834]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1832]! } - public var Stickers_SuggestAdded: String { return self._s[1833]! } - public var Login_CountryCode: String { return self._s[1834]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1835]! } - public var Map_GetDirections: String { return self._s[1836]! } - public var Login_PhoneFloodError: String { return self._s[1837]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1836]! } + public var Stickers_SuggestAdded: String { return self._s[1837]! } + public var Login_CountryCode: String { return self._s[1838]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1839]! } + public var Map_GetDirections: String { return self._s[1840]! } + public var Login_PhoneFloodError: String { return self._s[1841]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_0]) + return formatWithArgumentRanges(self._s[1842]!, self._r[1842]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1840]! } - public var Group_Location_ChangeLocation: String { return self._s[1841]! } - public var Notification_GroupInviterSelf: String { return self._s[1842]! } - public var InstantPage_TapToOpenLink: String { return self._s[1843]! } + public var Settings_SetUsername: String { return self._s[1844]! } + public var Group_Location_ChangeLocation: String { return self._s[1845]! } + public var Notification_GroupInviterSelf: String { return self._s[1846]! } + public var InstantPage_TapToOpenLink: String { return self._s[1847]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1844]!, self._r[1844]!, [_0]) + return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1845]! } - public var SecretChat_Title: String { return self._s[1846]! } - public var Group_UpgradeNoticeText1: String { return self._s[1847]! } - public var AuthSessions_Title: String { return self._s[1848]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1849]! } + public var SecretChat_Title: String { return self._s[1850]! } + public var Group_UpgradeNoticeText1: String { return self._s[1851]! } + public var AuthSessions_Title: String { return self._s[1852]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1849]!, self._r[1849]!, [_0]) + return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1850]! } - public var Channel_About_Title: String { return self._s[1851]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1852]! } + public var PhotoEditor_CropAuto: String { return self._s[1854]! } + public var Channel_About_Title: String { return self._s[1855]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1856]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1854]!, self._r[1854]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1855]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1857]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1858]! } + public var VoiceOver_MessageContextReport: String { return self._s[1859]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1861]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1862]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_1]) + return formatWithArgumentRanges(self._s[1863]!, self._r[1863]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_0]) + return formatWithArgumentRanges(self._s[1865]!, self._r[1865]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, [_0]) + return formatWithArgumentRanges(self._s[1866]!, self._r[1866]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1863]! } - public var Presence_online: String { return self._s[1865]! } - public var PasscodeSettings_Title: String { return self._s[1866]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1867]! } - public var Web_OpenExternal: String { return self._s[1868]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1870]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1871]! } - public var LocalGroup_Title: String { return self._s[1872]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1867]! } + public var Presence_online: String { return self._s[1869]! } + public var PasscodeSettings_Title: String { return self._s[1870]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1871]! } + public var Web_OpenExternal: String { return self._s[1872]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1874]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1875]! } + public var LocalGroup_Title: String { return self._s[1876]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1873]!, self._r[1873]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1874]! } - public var Map_YouAreHere: String { return self._s[1875]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1878]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1879]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1878]! } + public var Map_YouAreHere: String { return self._s[1879]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1880]!, self._r[1880]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1882]! } - public var Bot_Start: String { return self._s[1883]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1882]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1883]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1886]! } - public var AccentColor_Title: String { return self._s[1888]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1889]! } + public var SocksProxySetup_Username: String { return self._s[1886]! } + public var Bot_Start: String { return self._s[1887]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1888]!, self._r[1888]!, [_0]) + } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[1890]! } + public var AccentColor_Title: String { return self._s[1892]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1893]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1894]!, self._r[1894]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1891]!, self._r[1891]!, [_0]) + return formatWithArgumentRanges(self._s[1895]!, self._r[1895]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1892]!, self._r[1892]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1896]!, self._r[1896]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1893]! } - public var Login_InfoAvatarPhoto: String { return self._s[1894]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1895]! } - public var Tour_Title4: String { return self._s[1896]! } - public var Passport_Identity_Translation: String { return self._s[1897]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1898]! } - public var Login_TermsOfServiceLabel: String { return self._s[1900]! } - public var Passport_Language_it: String { return self._s[1901]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1902]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1903]! } - public var Conversation_ClearAll: String { return self._s[1905]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1907]! } - public var TwoStepAuth_FloodError: String { return self._s[1908]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1897]! } + public var Login_InfoAvatarPhoto: String { return self._s[1898]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1899]! } + public var Tour_Title4: String { return self._s[1900]! } + public var Passport_Identity_Translation: String { return self._s[1901]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1902]! } + public var Login_TermsOfServiceLabel: String { return self._s[1904]! } + public var Passport_Language_it: String { return self._s[1905]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1906]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1907]! } + public var Conversation_ClearAll: String { return self._s[1909]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1911]! } + public var TwoStepAuth_FloodError: String { return self._s[1912]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1909]!, self._r[1909]!, [_1]) + return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_1]) } - public var Paint_Delete: String { return self._s[1910]! } - public var Privacy_AddNewPeer: String { return self._s[1911]! } + public var Paint_Delete: String { return self._s[1914]! } + public var Privacy_AddNewPeer: String { return self._s[1915]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1]) + return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1913]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1917]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1918]!, self._r[1918]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1915]! } + public var Message_PinnedAudioMessage: String { return self._s[1919]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_0]) + return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1917]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1918]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1919]! } - public var Conversation_MessageEditedLabel: String { return self._s[1920]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1921]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1922]! } + public var Notification_Mute1hMin: String { return self._s[1921]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1922]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1923]! } + public var Conversation_MessageEditedLabel: String { return self._s[1924]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1925]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1926]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1923]!, self._r[1923]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1927]!, self._r[1927]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1924]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1928]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1925]!, self._r[1925]!, [_1]) + return formatWithArgumentRanges(self._s[1929]!, self._r[1929]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1926]! } - public var Month_GenOctober: String { return self._s[1927]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1928]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1929]! } - public var MediaPicker_TimerTooltip: String { return self._s[1931]! } - public var SharedMedia_TitleAll: String { return self._s[1932]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1935]! } - public var Conversation_RestrictedMedia: String { return self._s[1936]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1937]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1939]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1940]! } + public var AccessDenied_LocationTracking: String { return self._s[1930]! } + public var Month_GenOctober: String { return self._s[1931]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1932]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1933]! } + public var MediaPicker_TimerTooltip: String { return self._s[1935]! } + public var SharedMedia_TitleAll: String { return self._s[1936]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1939]! } + public var Conversation_RestrictedMedia: String { return self._s[1940]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1941]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1943]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1944]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1941]!, self._r[1941]!, [_0]) + return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1944]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1946]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1947]! } + public var Conversation_SavedMessages: String { return self._s[1948]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1950]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1951]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_0]) + return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1950]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1954]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_0]) + return formatWithArgumentRanges(self._s[1955]!, self._r[1955]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1952]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1953]! } + public var ReportPeer_AlertSuccess: String { return self._s[1956]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1957]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1954]!, self._r[1954]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1958]!, self._r[1958]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1955]! } - public var PhotoEditor_FadeTool: String { return self._s[1956]! } - public var Privacy_ContactsReset: String { return self._s[1957]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1959]! } + public var PhotoEditor_FadeTool: String { return self._s[1960]! } + public var Privacy_ContactsReset: String { return self._s[1961]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0]) + return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1960]! } - public var ChatList_Mute: String { return self._s[1961]! } - public var Permissions_CellularDataText_v0: String { return self._s[1962]! } - public var ShareMenu_SelectChats: String { return self._s[1964]! } - public var MusicPlayer_VoiceNote: String { return self._s[1965]! } - public var Conversation_RestrictedText: String { return self._s[1966]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1967]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1968]! } - public var Cache_Videos: String { return self._s[1969]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1970]! } - public var FeatureDisabled_Oops: String { return self._s[1972]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1973]! } + public var Message_PinnedVideoMessage: String { return self._s[1964]! } + public var ChatList_Mute: String { return self._s[1965]! } + public var Permissions_CellularDataText_v0: String { return self._s[1966]! } + public var ShareMenu_SelectChats: String { return self._s[1968]! } + public var MusicPlayer_VoiceNote: String { return self._s[1969]! } + public var Conversation_RestrictedText: String { return self._s[1970]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1971]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1972]! } + public var Cache_Videos: String { return self._s[1973]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1974]! } + public var FeatureDisabled_Oops: String { return self._s[1976]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1977]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1974]!, self._r[1974]!, [_0]) + return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1975]! } - public var GroupPermission_NoSendPolls: String { return self._s[1976]! } - public var Message_VideoExpired: String { return self._s[1978]! } - public var Notifications_Badge: String { return self._s[1979]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1980]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1981]! } - public var Username_InvalidTooShort: String { return self._s[1982]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1983]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1984]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1985]! } + public var Stickers_GroupStickersHelp: String { return self._s[1979]! } + public var GroupPermission_NoSendPolls: String { return self._s[1980]! } + public var Message_VideoExpired: String { return self._s[1982]! } + public var Notifications_Badge: String { return self._s[1983]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1984]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1985]! } + public var Username_InvalidTooShort: String { return self._s[1986]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1987]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1988]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1989]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_1]) + return formatWithArgumentRanges(self._s[1990]!, self._r[1990]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1987]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1988]! } - public var SharedMedia_CategoryDocs: String { return self._s[1991]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1991]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1992]! } + public var SharedMedia_CategoryDocs: String { return self._s[1995]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_1]) + return formatWithArgumentRanges(self._s[1996]!, self._r[1996]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[1994]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1998]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_1]) + return formatWithArgumentRanges(self._s[1999]!, self._r[1999]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1996]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2000]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1997]!, self._r[1997]!, [_0]) + return formatWithArgumentRanges(self._s[2001]!, self._r[2001]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1998]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1999]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2000]! } - public var Channel_UpdatePhotoItem: String { return self._s[2001]! } - public var GroupInfo_LeftStatus: String { return self._s[2002]! } - public var Watch_MessageView_Forward: String { return self._s[2004]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2005]! } - public var Cache_ClearEmpty: String { return self._s[2007]! } - public var Localization_LanguageName: String { return self._s[2008]! } - public var WebSearch_GIFs: String { return self._s[2009]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2010]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2011]! } - public var Common_Back: String { return self._s[2012]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2013]! } + public var ChatSettings_PrivateChats: String { return self._s[2002]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2003]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2004]! } + public var Channel_UpdatePhotoItem: String { return self._s[2005]! } + public var GroupInfo_LeftStatus: String { return self._s[2006]! } + public var Watch_MessageView_Forward: String { return self._s[2008]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2009]! } + public var Cache_ClearEmpty: String { return self._s[2011]! } + public var Localization_LanguageName: String { return self._s[2012]! } + public var WebSearch_GIFs: String { return self._s[2013]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2014]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2015]! } + public var Common_Back: String { return self._s[2016]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2017]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2018]!, self._r[2018]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2015]! } - public var Watch_Conversation_Reply: String { return self._s[2017]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2019]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2020]! } - public var Channel_BanUser_Unban: String { return self._s[2022]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2023]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2024]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2026]! } - public var Passport_Identity_Name: String { return self._s[2027]! } + public var Passport_Email_Help: String { return self._s[2019]! } + public var Watch_Conversation_Reply: String { return self._s[2021]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2023]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2024]! } + public var Channel_BanUser_Unban: String { return self._s[2026]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2027]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2028]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2030]! } + public var Passport_Identity_Name: String { return self._s[2031]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) + return formatWithArgumentRanges(self._s[2032]!, self._r[2032]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2029]! } - public var Conversation_BlockUser: String { return self._s[2030]! } - public var Month_GenJanuary: String { return self._s[2031]! } - public var ChatSettings_TextSize: String { return self._s[2032]! } - public var Notification_PassportValuePhone: String { return self._s[2033]! } - public var Passport_Language_ne: String { return self._s[2034]! } - public var Notification_CallBack: String { return self._s[2035]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2036]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2033]! } + public var Conversation_BlockUser: String { return self._s[2034]! } + public var Month_GenJanuary: String { return self._s[2035]! } + public var ChatSettings_TextSize: String { return self._s[2036]! } + public var Notification_PassportValuePhone: String { return self._s[2037]! } + public var Passport_Language_ne: String { return self._s[2038]! } + public var Notification_CallBack: String { return self._s[2039]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2040]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2037]!, self._r[2037]!, [_0]) + return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2038]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2039]! } - public var Stickers_FrequentlyUsed: String { return self._s[2040]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2041]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2043]! } + public var Channel_Info_Management: String { return self._s[2042]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2043]! } + public var Stickers_FrequentlyUsed: String { return self._s[2044]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2045]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2047]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2044]!, self._r[2044]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2045]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2046]! } - public var CreatePoll_TextHeader: String { return self._s[2047]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2049]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2050]! } + public var CreatePoll_TextHeader: String { return self._s[2051]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_0]) + return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2049]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2050]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2052]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2053]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2054]! } + public var PhotoEditor_QualityMedium: String { return self._s[2053]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2054]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2056]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2057]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2058]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_0]) + return formatWithArgumentRanges(self._s[2059]!, self._r[2059]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_1]) + return formatWithArgumentRanges(self._s[2060]!, self._r[2060]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2058]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2059]! } - public var Settings_Username: String { return self._s[2061]! } - public var Conversation_Block: String { return self._s[2063]! } - public var Wallpaper_Wallpaper: String { return self._s[2064]! } - public var SocksProxySetup_UseProxy: String { return self._s[2066]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2067]! } - public var MessageTimer_Forever: String { return self._s[2068]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2069]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2070]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2071]! } - public var Passport_Language_da: String { return self._s[2072]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2073]! } + public var Conversation_LinkDialogOpen: String { return self._s[2062]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2063]! } + public var Settings_Username: String { return self._s[2065]! } + public var Conversation_Block: String { return self._s[2067]! } + public var Wallpaper_Wallpaper: String { return self._s[2068]! } + public var SocksProxySetup_UseProxy: String { return self._s[2070]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2071]! } + public var MessageTimer_Forever: String { return self._s[2072]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2073]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2074]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2075]! } + public var Passport_Language_da: String { return self._s[2076]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2077]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) + return formatWithArgumentRanges(self._s[2078]!, self._r[2078]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2075]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2079]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_0]) + return formatWithArgumentRanges(self._s[2081]!, self._r[2081]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2079]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2080]! } - public var Conversation_PinnedPoll: String { return self._s[2081]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2082]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2083]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2084]! } + public var Conversation_PinnedPoll: String { return self._s[2085]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2086]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_1]) + return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2084]! } - public var Cache_ByPeerHeader: String { return self._s[2085]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2088]! } + public var Cache_ByPeerHeader: String { return self._s[2089]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0]) + return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2087]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2090]! } - public var Notification_PinnedMessage: String { return self._s[2091]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2093]! } - public var Contacts_SortBy: String { return self._s[2094]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2091]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2094]! } + public var Notification_PinnedMessage: String { return self._s[2095]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2097]! } + public var Contacts_SortBy: String { return self._s[2098]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_1]) + return formatWithArgumentRanges(self._s[2099]!, self._r[2099]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2097]!, self._r[2097]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2101]!, self._r[2101]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2098]! } - public var Watch_UserInfo_Service: String { return self._s[2099]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2101]! } - public var Conversation_Unpin: String { return self._s[2103]! } - public var CancelResetAccount_Title: String { return self._s[2104]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2105]! } + public var Call_EncryptionKey_Title: String { return self._s[2102]! } + public var Watch_UserInfo_Service: String { return self._s[2103]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2105]! } + public var Conversation_Unpin: String { return self._s[2107]! } + public var CancelResetAccount_Title: String { return self._s[2108]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2109]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2107]!, self._r[2107]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2108]! } - public var CallSettings_Title: String { return self._s[2109]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2110]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2112]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2113]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2112]! } + public var CallSettings_Title: String { return self._s[2113]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2114]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2116]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2117]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2118]!, self._r[2118]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2115]! } - public var LoginPassword_PasswordHelp: String { return self._s[2116]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2117]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2118]! } - public var Checkout_TotalPaidAmount: String { return self._s[2119]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2119]! } + public var LoginPassword_PasswordHelp: String { return self._s[2120]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2121]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2122]! } + public var Checkout_TotalPaidAmount: String { return self._s[2123]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_0]) + return formatWithArgumentRanges(self._s[2124]!, self._r[2124]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2121]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2123]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2124]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2125]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2127]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2128]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2125]!, self._r[2125]!, [_1]) + return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2126]! } - public var Contacts_InviteFriends: String { return self._s[2128]! } - public var Map_ChooseLocationTitle: String { return self._s[2129]! } - public var Conversation_StopPoll: String { return self._s[2131]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2130]! } + public var Contacts_InviteFriends: String { return self._s[2132]! } + public var Map_ChooseLocationTitle: String { return self._s[2133]! } + public var Conversation_StopPoll: String { return self._s[2135]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_0]) + return formatWithArgumentRanges(self._s[2136]!, self._r[2136]!, [_0]) } - public var Call_Camera: String { return self._s[2133]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2134]! } - public var Calls_RatingFeedback: String { return self._s[2135]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2136]! } - public var NotificationsSound_Pulse: String { return self._s[2137]! } - public var Watch_LastSeen_Lately: String { return self._s[2138]! } - public var ReportGroupLocation_Report: String { return self._s[2141]! } - public var Widget_NoUsers: String { return self._s[2142]! } - public var Conversation_UnvotePoll: String { return self._s[2143]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2145]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2146]! } - public var NotificationsSound_Circles: String { return self._s[2147]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2149]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2150]! } - public var Proxy_TooltipUnavailable: String { return self._s[2151]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2153]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2155]! } - public var Conversation_FileDropbox: String { return self._s[2156]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2157]! } - public var Tour_Text3: String { return self._s[2159]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2161]! } - public var GroupPermission_NoSendMessages: String { return self._s[2162]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2163]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2164]! } + public var Call_Camera: String { return self._s[2137]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2138]! } + public var Calls_RatingFeedback: String { return self._s[2139]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2140]! } + public var NotificationsSound_Pulse: String { return self._s[2141]! } + public var Watch_LastSeen_Lately: String { return self._s[2142]! } + public var ReportGroupLocation_Report: String { return self._s[2145]! } + public var Widget_NoUsers: String { return self._s[2146]! } + public var Conversation_UnvotePoll: String { return self._s[2147]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2149]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2150]! } + public var NotificationsSound_Circles: String { return self._s[2151]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2153]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2154]! } + public var Proxy_TooltipUnavailable: String { return self._s[2155]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2157]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2159]! } + public var Conversation_FileDropbox: String { return self._s[2160]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2161]! } + public var Tour_Text3: String { return self._s[2163]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2165]! } + public var GroupPermission_NoSendMessages: String { return self._s[2166]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2167]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2168]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2166]!, self._r[2166]!, [_0]) - } - public var GroupInfo_AddParticipantTitle: String { return self._s[2167]! } - public var Checkout_ShippingOption_Title: String { return self._s[2168]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2169]! } - public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) } + public var GroupInfo_AddParticipantTitle: String { return self._s[2171]! } + public var Checkout_ShippingOption_Title: String { return self._s[2172]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2173]! } + public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2174]!, self._r[2174]!, [_0]) + } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2171]!, self._r[2171]!, [_0]) + return formatWithArgumentRanges(self._s[2175]!, self._r[2175]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2172]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2173]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2174]! } - public var AutoDownloadSettings_Photos: String { return self._s[2176]! } - public var Appearance_PreviewIncomingText: String { return self._s[2177]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2178]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2179]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2180]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2181]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2182]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2183]! } - public var Notification_SecretChatScreenshot: String { return self._s[2184]! } - public var AccessDenied_Wallpapers: String { return self._s[2185]! } - public var Passport_Address_City: String { return self._s[2187]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2188]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2189]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2190]! } - public var AccessDenied_LocationDisabled: String { return self._s[2191]! } - public var Group_Location_Title: String { return self._s[2192]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2194]! } - public var GroupInfo_Sound: String { return self._s[2195]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2196]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2197]! } - public var Contacts_Title: String { return self._s[2198]! } - public var Passport_Language_fr: String { return self._s[2199]! } - public var Notifications_ResetAllNotifications: String { return self._s[2200]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2203]! } - public var Checkout_NewCard_Title: String { return self._s[2204]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2205]! } - public var Conversation_ForwardChats: String { return self._s[2206]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2208]! } - public var Settings_FAQ: String { return self._s[2210]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2211]! } - public var Conversation_ContextMenuForward: String { return self._s[2212]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2215]! } - public var PrivacyPolicy_Title: String { return self._s[2218]! } - public var Notifications_TextTone: String { return self._s[2219]! } - public var Profile_CreateNewContact: String { return self._s[2220]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2221]! } - public var Call_Speaker: String { return self._s[2223]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2224]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2226]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2227]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2176]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2177]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2178]! } + public var AutoDownloadSettings_Photos: String { return self._s[2180]! } + public var Appearance_PreviewIncomingText: String { return self._s[2181]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2182]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2183]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2184]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2185]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2186]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2187]! } + public var Notification_SecretChatScreenshot: String { return self._s[2188]! } + public var AccessDenied_Wallpapers: String { return self._s[2189]! } + public var Passport_Address_City: String { return self._s[2191]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2192]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2193]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2194]! } + public var AccessDenied_LocationDisabled: String { return self._s[2195]! } + public var Group_Location_Title: String { return self._s[2196]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2198]! } + public var GroupInfo_Sound: String { return self._s[2199]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2200]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2201]! } + public var Contacts_Title: String { return self._s[2202]! } + public var Passport_Language_fr: String { return self._s[2203]! } + public var Notifications_ResetAllNotifications: String { return self._s[2204]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2207]! } + public var Checkout_NewCard_Title: String { return self._s[2208]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2209]! } + public var Conversation_ForwardChats: String { return self._s[2210]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2212]! } + public var Settings_FAQ: String { return self._s[2214]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2215]! } + public var Conversation_ContextMenuForward: String { return self._s[2216]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2219]! } + public var PrivacyPolicy_Title: String { return self._s[2222]! } + public var Notifications_TextTone: String { return self._s[2223]! } + public var Profile_CreateNewContact: String { return self._s[2224]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2225]! } + public var Call_Speaker: String { return self._s[2227]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2228]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2230]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2231]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2228]!, self._r[2228]!, [_0]) + return formatWithArgumentRanges(self._s[2232]!, self._r[2232]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2229]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2230]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2231]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2232]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2233]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2234]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2235]! } - public var Bot_Unblock: String { return self._s[2236]! } - public var TextFormat_Italic: String { return self._s[2237]! } - public var WallpaperSearch_ColorPink: String { return self._s[2238]! } - public var Settings_About_Help: String { return self._s[2239]! } - public var SearchImages_Title: String { return self._s[2240]! } - public var Weekday_Wednesday: String { return self._s[2241]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2242]! } - public var ExplicitContent_AlertTitle: String { return self._s[2243]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2233]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2234]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2235]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2236]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2237]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2238]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2239]! } + public var Bot_Unblock: String { return self._s[2240]! } + public var TextFormat_Italic: String { return self._s[2241]! } + public var WallpaperSearch_ColorPink: String { return self._s[2242]! } + public var Settings_About_Help: String { return self._s[2243]! } + public var SearchImages_Title: String { return self._s[2244]! } + public var Weekday_Wednesday: String { return self._s[2245]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2246]! } + public var ExplicitContent_AlertTitle: String { return self._s[2247]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2244]!, self._r[2244]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2248]!, self._r[2248]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2245]! } - public var Weekday_Thursday: String { return self._s[2246]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2247]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2248]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2249]! } + public var Weekday_Thursday: String { return self._s[2250]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2251]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2252]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2249]!, self._r[2249]!, [_0]) + return formatWithArgumentRanges(self._s[2253]!, self._r[2253]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2250]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2251]! } - public var Passport_RequestedInformation: String { return self._s[2252]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2253]! } - public var Conversation_EncryptionProcessing: String { return self._s[2255]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2256]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2258]! } - public var Channel_Setup_Title: String { return self._s[2259]! } - public var Conversation_SearchPlaceholder: String { return self._s[2260]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2261]! } - public var Checkout_ErrorGeneric: String { return self._s[2262]! } - public var Passport_Language_hu: String { return self._s[2263]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2254]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2255]! } + public var Passport_RequestedInformation: String { return self._s[2256]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2257]! } + public var Conversation_EncryptionProcessing: String { return self._s[2259]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2260]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2262]! } + public var Channel_Setup_Title: String { return self._s[2263]! } + public var Conversation_SearchPlaceholder: String { return self._s[2264]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2265]! } + public var Checkout_ErrorGeneric: String { return self._s[2266]! } + public var Passport_Language_hu: String { return self._s[2267]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_0]) - } - public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_1]) - } - public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) } - public var Group_Location_Info: String { return self._s[2270]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2271]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2272]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2273]! } - public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2274]!, self._r[2274]!, [_0]) + public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_1]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2275]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2276]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2277]! } - public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { + public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2273]!, self._r[2273]!, [_0]) + } + public var Group_Location_Info: String { return self._s[2274]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2275]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2276]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2277]! } + public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2279]! } - public var Message_PinnedAnimationMessage: String { return self._s[2281]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2283]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2284]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2286]! } - public var Embed_PlayingInPIP: String { return self._s[2287]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2288]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2279]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2280]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2281]! } + public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2282]!, self._r[2282]!, [_0]) + } + public var Passport_Language_cs: String { return self._s[2283]! } + public var Message_PinnedAnimationMessage: String { return self._s[2285]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2287]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2288]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2290]! } + public var Embed_PlayingInPIP: String { return self._s[2291]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2292]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_0]) + return formatWithArgumentRanges(self._s[2293]!, self._r[2293]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2290]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2294]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1]) + return formatWithArgumentRanges(self._s[2295]!, self._r[2295]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2292]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2293]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2294]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2295]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2296]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2297]! } + public var Notification_PaymentSent: String { return self._s[2296]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2297]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2298]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2299]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2300]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2301]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_1]) + return formatWithArgumentRanges(self._s[2304]!, self._r[2304]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2301]!, self._r[2301]!, [_1]) + return formatWithArgumentRanges(self._s[2305]!, self._r[2305]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1]) + return formatWithArgumentRanges(self._s[2306]!, self._r[2306]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2304]! } - public var PasscodeSettings_HelpTop: String { return self._s[2305]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2306]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2307]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2308]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2309]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2310]! } - public var Call_Accept: String { return self._s[2312]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2313]! } - public var Month_GenMarch: String { return self._s[2315]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2316]! } - public var LoginPassword_Title: String { return self._s[2317]! } - public var Call_End: String { return self._s[2318]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2319]! } - public var VoiceOver_Chat_Contact: String { return self._s[2320]! } - public var CallSettings_Always: String { return self._s[2321]! } - public var CallFeedback_Success: String { return self._s[2322]! } - public var TwoStepAuth_SetupHint: String { return self._s[2323]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2308]! } + public var PasscodeSettings_HelpTop: String { return self._s[2309]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2310]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2311]! } + public var EditTheme_ShortLink: String { return self._s[2312]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2313]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2314]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2315]! } + public var Call_Accept: String { return self._s[2317]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2318]! } + public var Month_GenMarch: String { return self._s[2320]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2321]! } + public var LoginPassword_Title: String { return self._s[2322]! } + public var Call_End: String { return self._s[2323]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2324]! } + public var VoiceOver_Chat_Contact: String { return self._s[2325]! } + public var CallSettings_Always: String { return self._s[2326]! } + public var CallFeedback_Success: String { return self._s[2327]! } + public var TwoStepAuth_SetupHint: String { return self._s[2328]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2324]!, self._r[2324]!, [_1]) + return formatWithArgumentRanges(self._s[2329]!, self._r[2329]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2325]! } - public var Login_PhoneTitle: String { return self._s[2326]! } - public var Passport_FieldPhoneHelp: String { return self._s[2327]! } - public var Weekday_ShortSunday: String { return self._s[2328]! } - public var Passport_InfoFAQ_URL: String { return self._s[2329]! } - public var ContactInfo_Job: String { return self._s[2331]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2332]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2333]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2334]! } - public var Invite_ChannelsTooMuch: String { return self._s[2335]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2336]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2337]! } - public var CallFeedback_ReasonNoise: String { return self._s[2338]! } - public var Appearance_AppIconDefault: String { return self._s[2340]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2341]! } - public var MediaPicker_AddCaption: String { return self._s[2342]! } - public var CallSettings_TabIconDescription: String { return self._s[2343]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2330]! } + public var Login_PhoneTitle: String { return self._s[2331]! } + public var Passport_FieldPhoneHelp: String { return self._s[2332]! } + public var Weekday_ShortSunday: String { return self._s[2333]! } + public var Passport_InfoFAQ_URL: String { return self._s[2334]! } + public var ContactInfo_Job: String { return self._s[2336]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2337]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2338]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2339]! } + public var Invite_ChannelsTooMuch: String { return self._s[2340]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2341]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2342]! } + public var CallFeedback_ReasonNoise: String { return self._s[2343]! } + public var Appearance_AppIconDefault: String { return self._s[2345]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2346]! } + public var MediaPicker_AddCaption: String { return self._s[2347]! } + public var CallSettings_TabIconDescription: String { return self._s[2348]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2344]!, self._r[2344]!, [_0]) + return formatWithArgumentRanges(self._s[2349]!, self._r[2349]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2345]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2346]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2347]! } - public var DialogList_SearchSectionRecent: String { return self._s[2348]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2349]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2352]! } - public var LastSeen_WithinAWeek: String { return self._s[2353]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2354]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2356]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2357]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2350]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2351]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2352]! } + public var DialogList_SearchSectionRecent: String { return self._s[2353]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2354]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2357]! } + public var LastSeen_WithinAWeek: String { return self._s[2358]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2359]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2361]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2362]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2358]!, self._r[2358]!, [_0]) + return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2359]! } - public var Conversation_StatusLeftGroup: String { return self._s[2360]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2361]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2363]! } - public var GroupPermission_AddSuccess: String { return self._s[2364]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2366]! } - public var Conversation_ContextMenuCopy: String { return self._s[2367]! } - public var AccessDenied_CallMicrophone: String { return self._s[2368]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2364]! } + public var Conversation_StatusLeftGroup: String { return self._s[2365]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2366]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2368]! } + public var GroupPermission_AddSuccess: String { return self._s[2369]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2371]! } + public var Conversation_ContextMenuCopy: String { return self._s[2372]! } + public var AccessDenied_CallMicrophone: String { return self._s[2373]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2369]!, self._r[2369]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2374]!, self._r[2374]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2370]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2371]! } - public var Checkout_PaymentMethod_New: String { return self._s[2372]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2373]! } - public var PhotoEditor_QualityTool: String { return self._s[2374]! } - public var Login_SendCodeViaSms: String { return self._s[2375]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2376]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2377]! } - public var Login_EmailNotConfiguredError: String { return self._s[2378]! } - public var SocksProxySetup_Status: String { return self._s[2379]! } - public var PrivacyPolicy_Accept: String { return self._s[2380]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2381]! } - public var Appearance_AppIconClassicX: String { return self._s[2382]! } + public var Login_InvalidFirstNameError: String { return self._s[2375]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2376]! } + public var Checkout_PaymentMethod_New: String { return self._s[2377]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2378]! } + public var PhotoEditor_QualityTool: String { return self._s[2379]! } + public var Login_SendCodeViaSms: String { return self._s[2380]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2381]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2382]! } + public var Login_EmailNotConfiguredError: String { return self._s[2383]! } + public var SocksProxySetup_Status: String { return self._s[2384]! } + public var PrivacyPolicy_Accept: String { return self._s[2385]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2386]! } + public var Appearance_AppIconClassicX: String { return self._s[2387]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2383]!, self._r[2383]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2388]!, self._r[2388]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2384]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2385]! } - public var AutoNightTheme_Automatic: String { return self._s[2386]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2387]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2388]! } - public var Cache_Help: String { return self._s[2389]! } - public var Group_ErrorAccessDenied: String { return self._s[2390]! } - public var Passport_Language_fa: String { return self._s[2391]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2392]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2393]! } - public var PrivacySettings_LastSeen: String { return self._s[2394]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2389]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2390]! } + public var AutoNightTheme_Automatic: String { return self._s[2391]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2392]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2393]! } + public var Cache_Help: String { return self._s[2394]! } + public var Group_ErrorAccessDenied: String { return self._s[2395]! } + public var Passport_Language_fa: String { return self._s[2396]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2397]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2398]! } + public var PrivacySettings_LastSeen: String { return self._s[2399]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2395]!, self._r[2395]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2400]!, self._r[2400]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2399]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2400]! } - public var Profile_About: String { return self._s[2401]! } - public var Channel_About_Placeholder: String { return self._s[2402]! } - public var Login_InfoTitle: String { return self._s[2403]! } + public var Preview_SaveGif: String { return self._s[2404]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2405]! } + public var Profile_About: String { return self._s[2406]! } + public var Channel_About_Placeholder: String { return self._s[2407]! } + public var Login_InfoTitle: String { return self._s[2408]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2404]!, self._r[2404]!, [_0]) + return formatWithArgumentRanges(self._s[2409]!, self._r[2409]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2406]! } - public var ContactInfo_Title: String { return self._s[2407]! } - public var Media_ShareThisVideo: String { return self._s[2408]! } - public var Weekday_ShortFriday: String { return self._s[2409]! } - public var AccessDenied_Contacts: String { return self._s[2411]! } - public var Notification_CallIncomingShort: String { return self._s[2412]! } - public var Group_Setup_TypePublic: String { return self._s[2413]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2414]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2415]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2418]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2419]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2420]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2421]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2422]! } - public var DialogList_Typing: String { return self._s[2423]! } - public var CallFeedback_IncludeLogs: String { return self._s[2425]! } - public var Checkout_Phone: String { return self._s[2427]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2430]! } - public var Privacy_Calls_Integration: String { return self._s[2431]! } - public var Notifications_PermissionsAllow: String { return self._s[2432]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2436]! } - public var Settings_ChatSettings: String { return self._s[2437]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2411]! } + public var ContactInfo_Title: String { return self._s[2412]! } + public var Media_ShareThisVideo: String { return self._s[2413]! } + public var Weekday_ShortFriday: String { return self._s[2414]! } + public var AccessDenied_Contacts: String { return self._s[2416]! } + public var Notification_CallIncomingShort: String { return self._s[2417]! } + public var Group_Setup_TypePublic: String { return self._s[2418]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2419]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2420]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2423]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2424]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2425]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2426]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2427]! } + public var DialogList_Typing: String { return self._s[2428]! } + public var CallFeedback_IncludeLogs: String { return self._s[2430]! } + public var Checkout_Phone: String { return self._s[2432]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2435]! } + public var Privacy_Calls_Integration: String { return self._s[2436]! } + public var Notifications_PermissionsAllow: String { return self._s[2437]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2441]! } + public var Settings_ChatSettings: String { return self._s[2442]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2438]!, self._r[2438]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2440]! } + public var GroupRemoved_DeleteUser: String { return self._s[2445]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2441]!, self._r[2441]!, [_0]) + return formatWithArgumentRanges(self._s[2446]!, self._r[2446]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2442]!, self._r[2442]!, [_1]) + return formatWithArgumentRanges(self._s[2447]!, self._r[2447]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2443]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2444]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2446]! } - public var Conversation_Unblock: String { return self._s[2447]! } - public var PrivacySettings_DataSettings: String { return self._s[2448]! } - public var Group_PublicLink_Info: String { return self._s[2449]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2450]! } + public var Login_ContinueWithLocalization: String { return self._s[2448]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2449]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2451]! } + public var Conversation_Unblock: String { return self._s[2452]! } + public var PrivacySettings_DataSettings: String { return self._s[2453]! } + public var Group_PublicLink_Info: String { return self._s[2454]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2455]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2456]!, self._r[2456]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2454]! } - public var Call_Mute: String { return self._s[2455]! } - public var Passport_Language_dz: String { return self._s[2456]! } - public var Passport_Language_tk: String { return self._s[2457]! } + public var PrivacySettings_Passcode: String { return self._s[2459]! } + public var Call_Mute: String { return self._s[2460]! } + public var Passport_Language_dz: String { return self._s[2461]! } + public var Passport_Language_tk: String { return self._s[2462]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2458]!, self._r[2458]!, [_0]) + return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) } - public var Settings_Search: String { return self._s[2459]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2460]! } - public var Conversation_ContextMenuReply: String { return self._s[2461]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2462]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2463]! } - public var Tour_Title1: String { return self._s[2464]! } - public var Conversation_ClearGroupHistory: String { return self._s[2466]! } - public var WallpaperPreview_Motion: String { return self._s[2467]! } + public var Settings_Search: String { return self._s[2464]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2465]! } + public var Conversation_ContextMenuReply: String { return self._s[2466]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2467]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2468]! } + public var Tour_Title1: String { return self._s[2469]! } + public var Conversation_ClearGroupHistory: String { return self._s[2471]! } + public var WallpaperPreview_Motion: String { return self._s[2472]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) + return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_0]) } - public var Call_RateCall: String { return self._s[2469]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2470]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2471]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2472]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2474]! } + public var Call_RateCall: String { return self._s[2474]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2475]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2476]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2477]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2479]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2476]!, self._r[2476]!, [_0]) + return formatWithArgumentRanges(self._s[2481]!, self._r[2481]!, [_0]) } - public var Compose_Create: String { return self._s[2477]! } - public var Contacts_InviteToTelegram: String { return self._s[2478]! } - public var GroupInfo_Notifications: String { return self._s[2479]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2481]! } - public var Month_GenApril: String { return self._s[2482]! } - public var Appearance_AutoNightTheme: String { return self._s[2483]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2485]! } - public var Login_CodeSentSms: String { return self._s[2487]! } + public var Compose_Create: String { return self._s[2482]! } + public var Contacts_InviteToTelegram: String { return self._s[2483]! } + public var GroupInfo_Notifications: String { return self._s[2484]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2486]! } + public var Month_GenApril: String { return self._s[2487]! } + public var Appearance_AutoNightTheme: String { return self._s[2488]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2490]! } + public var Login_CodeSentSms: String { return self._s[2492]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) - } - public var EmptyGroupInfo_Line3: String { return self._s[2489]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2490]! } - public var Passport_Language_hr: String { return self._s[2491]! } - public var Common_ActionNotAllowedError: String { return self._s[2492]! } - public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2493]!, self._r[2493]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2494]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2495]! } - public var Privacy_SecretChatsTitle: String { return self._s[2496]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2498]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2499]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2500]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2501]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2502]! } - public var Preview_DeleteGif: String { return self._s[2503]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2504]! } - public var Group_ErrorNotMutualContact: String { return self._s[2505]! } - public var Notification_MessageLifetime5s: String { return self._s[2506]! } + public var EmptyGroupInfo_Line3: String { return self._s[2494]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2495]! } + public var Passport_Language_hr: String { return self._s[2496]! } + public var Common_ActionNotAllowedError: String { return self._s[2497]! } + public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2498]!, self._r[2498]!, [_0]) + } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2499]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2500]! } + public var Privacy_SecretChatsTitle: String { return self._s[2501]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2503]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2504]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2505]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2506]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2507]! } + public var Preview_DeleteGif: String { return self._s[2508]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2509]! } + public var Group_ErrorNotMutualContact: String { return self._s[2510]! } + public var Notification_MessageLifetime5s: String { return self._s[2511]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2507]!, self._r[2507]!, [_0]) + return formatWithArgumentRanges(self._s[2512]!, self._r[2512]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2508]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2510]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2511]! } - public var Passport_Address_AddBankStatement: String { return self._s[2512]! } - public var Notification_CallIncoming: String { return self._s[2513]! } - public var Compose_NewGroupTitle: String { return self._s[2514]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2516]! } - public var Passport_Address_Postcode: String { return self._s[2518]! } + public var VoiceOver_Chat_Video: String { return self._s[2513]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2515]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2516]! } + public var Passport_Address_AddBankStatement: String { return self._s[2517]! } + public var Notification_CallIncoming: String { return self._s[2518]! } + public var Compose_NewGroupTitle: String { return self._s[2519]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2521]! } + public var Passport_Address_Postcode: String { return self._s[2523]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_0]) + return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2520]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2521]! } - public var WallpaperColors_Title: String { return self._s[2522]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2523]! } - public var VoiceOver_MessageContextForward: String { return self._s[2524]! } - public var GroupPermission_Duration: String { return self._s[2525]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2525]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2526]! } + public var WallpaperColors_Title: String { return self._s[2527]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2528]! } + public var VoiceOver_MessageContextForward: String { return self._s[2529]! } + public var GroupPermission_Duration: String { return self._s[2530]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2526]!, self._r[2526]!, [_0]) + return formatWithArgumentRanges(self._s[2531]!, self._r[2531]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2527]! } - public var Username_Placeholder: String { return self._s[2528]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2529]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2530]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2531]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2532]! } + public var Username_Placeholder: String { return self._s[2533]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2534]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2535]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2536]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2533]!, self._r[2533]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2534]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2535]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2536]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2537]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2538]! } - public var Conversation_ContextMenuMore: String { return self._s[2539]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2540]! } - public var CallSettings_TabIcon: String { return self._s[2541]! } - public var KeyCommand_Find: String { return self._s[2542]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2543]! } - public var Message_PinnedGame: String { return self._s[2544]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2545]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2547]! } - public var Login_CallRequestState2: String { return self._s[2549]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2551]! } + public var Passport_PasswordDescription: String { return self._s[2539]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2540]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2541]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2542]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2543]! } + public var Conversation_ContextMenuMore: String { return self._s[2544]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2545]! } + public var CallSettings_TabIcon: String { return self._s[2546]! } + public var KeyCommand_Find: String { return self._s[2547]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2548]! } + public var Message_PinnedGame: String { return self._s[2549]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2550]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2552]! } + public var Login_CallRequestState2: String { return self._s[2554]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2556]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2552]!, self._r[2552]!, [_0]) - } - public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2554]!, self._r[2554]!, [_0]) - } - public var WallpaperPreview_Blurred: String { return self._s[2555]! } - public var Conversation_InstantPagePreview: String { return self._s[2556]! } - public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2560]! } - public var WallpaperSearch_ColorRed: String { return self._s[2561]! } - public var GroupPermission_NoPinMessages: String { return self._s[2562]! } - public var Passport_Language_es: String { return self._s[2563]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2565]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2566]! } + public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2559]!, self._r[2559]!, [_0]) + } + public var WallpaperPreview_Blurred: String { return self._s[2560]! } + public var Conversation_InstantPagePreview: String { return self._s[2561]! } + public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2562]!, self._r[2562]!, [_0]) + } + public var SecretTimer_VideoDescription: String { return self._s[2565]! } + public var WallpaperSearch_ColorRed: String { return self._s[2566]! } + public var GroupPermission_NoPinMessages: String { return self._s[2567]! } + public var Passport_Language_es: String { return self._s[2568]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2570]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2571]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2567]!, self._r[2567]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2572]!, self._r[2572]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2568]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2569]! } - public var Watch_UserInfo_Unmute: String { return self._s[2570]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2571]! } - public var AccessDenied_CameraRestricted: String { return self._s[2573]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2573]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2574]! } + public var Watch_UserInfo_Unmute: String { return self._s[2575]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2576]! } + public var AccessDenied_CameraRestricted: String { return self._s[2578]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2574]!, self._r[2574]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2579]!, self._r[2579]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2576]! } - public var Settings_CopyUsername: String { return self._s[2577]! } - public var Contacts_SearchLabel: String { return self._s[2578]! } - public var Map_OpenInYandexNavigator: String { return self._s[2580]! } - public var PasscodeSettings_EncryptData: String { return self._s[2581]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2582]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2583]! } - public var DialogList_AdNoticeAlert: String { return self._s[2584]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2586]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2587]! } - public var Localization_LanguageCustom: String { return self._s[2588]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2589]! } - public var CallFeedback_Title: String { return self._s[2590]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2593]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2594]! } - public var Conversation_InfoGroup: String { return self._s[2595]! } - public var Compose_NewMessage: String { return self._s[2596]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2597]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2598]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2599]! } + public var ChatList_ReadAll: String { return self._s[2581]! } + public var Settings_CopyUsername: String { return self._s[2582]! } + public var Contacts_SearchLabel: String { return self._s[2583]! } + public var Map_OpenInYandexNavigator: String { return self._s[2585]! } + public var PasscodeSettings_EncryptData: String { return self._s[2586]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2587]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2588]! } + public var DialogList_AdNoticeAlert: String { return self._s[2589]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2591]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2592]! } + public var Localization_LanguageCustom: String { return self._s[2593]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2594]! } + public var CallFeedback_Title: String { return self._s[2595]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2598]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2599]! } + public var Conversation_InfoGroup: String { return self._s[2600]! } + public var Compose_NewMessage: String { return self._s[2601]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2602]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2603]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2604]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2600]!, self._r[2600]!, [_0]) + return formatWithArgumentRanges(self._s[2605]!, self._r[2605]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2601]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2602]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2603]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2604]! } - public var Channel_BlackList_Title: String { return self._s[2605]! } - public var UserInfo_PhoneCall: String { return self._s[2606]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2608]! } - public var State_connecting: String { return self._s[2609]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2610]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2606]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2607]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2608]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2609]! } + public var Channel_BlackList_Title: String { return self._s[2610]! } + public var UserInfo_PhoneCall: String { return self._s[2611]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2613]! } + public var State_connecting: String { return self._s[2614]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2615]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2616]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2611]!, self._r[2611]!, [_0]) + return formatWithArgumentRanges(self._s[2617]!, self._r[2617]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2612]! } - public var Passport_Identity_EditPassport: String { return self._s[2613]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2615]! } - public var Localization_EnglishLanguageName: String { return self._s[2616]! } - public var Share_AuthDescription: String { return self._s[2617]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2618]! } - public var Passport_Identity_Surname: String { return self._s[2619]! } - public var Compose_TokenListPlaceholder: String { return self._s[2620]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2621]! } - public var Settings_AboutEmpty: String { return self._s[2622]! } - public var Conversation_Unmute: String { return self._s[2623]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2625]! } + public var Notifications_GroupNotifications: String { return self._s[2618]! } + public var Passport_Identity_EditPassport: String { return self._s[2619]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2621]! } + public var Localization_EnglishLanguageName: String { return self._s[2622]! } + public var Share_AuthDescription: String { return self._s[2623]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2624]! } + public var Passport_Identity_Surname: String { return self._s[2625]! } + public var Compose_TokenListPlaceholder: String { return self._s[2626]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2627]! } + public var Settings_AboutEmpty: String { return self._s[2628]! } + public var Conversation_Unmute: String { return self._s[2629]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2631]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_1]) + return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2627]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2629]! } - public var ChatSettings_Appearance: String { return self._s[2630]! } - public var Appearance_PickAccentColor: String { return self._s[2631]! } + public var Login_CodeSentCall: String { return self._s[2633]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2635]! } + public var ChatSettings_Appearance: String { return self._s[2636]! } + public var Appearance_PickAccentColor: String { return self._s[2637]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2638]!, self._r[2638]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2633]!, self._r[2633]!, [_1]) + return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2634]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2635]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2636]! } - public var ChatAdmins_AdminLabel: String { return self._s[2638]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2639]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2641]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2642]! } - public var Month_GenJune: String { return self._s[2643]! } - public var Watch_Location_Current: String { return self._s[2644]! } - public var Conversation_TitleMute: String { return self._s[2645]! } + public var Notification_CallMissed: String { return self._s[2640]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2641]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2642]! } + public var ChatAdmins_AdminLabel: String { return self._s[2644]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2645]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2647]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2648]! } + public var Month_GenJune: String { return self._s[2649]! } + public var Watch_Location_Current: String { return self._s[2650]! } + public var Conversation_TitleMute: String { return self._s[2651]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2646]!, self._r[2646]!, [_1]) + return formatWithArgumentRanges(self._s[2652]!, self._r[2652]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2647]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2653]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_0]) + return formatWithArgumentRanges(self._s[2654]!, self._r[2654]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2649]! } - public var Chat_SlowmodeSendError: String { return self._s[2650]! } - public var MaskStickerSettings_Info: String { return self._s[2651]! } + public var Call_ReportPlaceholder: String { return self._s[2655]! } + public var Chat_SlowmodeSendError: String { return self._s[2656]! } + public var MaskStickerSettings_Info: String { return self._s[2657]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2652]!, self._r[2652]!, [_0]) + return formatWithArgumentRanges(self._s[2658]!, self._r[2658]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2653]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2655]! } - public var Contacts_ShareTelegram: String { return self._s[2656]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2657]! } - public var Channel_ErrorAccessDenied: String { return self._s[2658]! } - public var UserInfo_ScamBotWarning: String { return self._s[2660]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2661]! } - public var Call_ConnectionErrorTitle: String { return self._s[2662]! } - public var UserInfo_NotificationsEnable: String { return self._s[2663]! } - public var ArchivedChats_IntroText1: String { return self._s[2664]! } - public var Tour_Text4: String { return self._s[2667]! } - public var WallpaperSearch_Recent: String { return self._s[2668]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2669]! } - public var Profile_MessageLifetime2s: String { return self._s[2671]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2672]! } - public var Notification_MessageLifetime2s: String { return self._s[2673]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2659]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2661]! } + public var Contacts_ShareTelegram: String { return self._s[2662]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2663]! } + public var Channel_ErrorAccessDenied: String { return self._s[2664]! } + public var UserInfo_ScamBotWarning: String { return self._s[2666]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2667]! } + public var Call_ConnectionErrorTitle: String { return self._s[2668]! } + public var UserInfo_NotificationsEnable: String { return self._s[2669]! } + public var ArchivedChats_IntroText1: String { return self._s[2670]! } + public var Tour_Text4: String { return self._s[2673]! } + public var WallpaperSearch_Recent: String { return self._s[2674]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2675]! } + public var Profile_MessageLifetime2s: String { return self._s[2677]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2678]! } + public var Notification_MessageLifetime2s: String { return self._s[2679]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2675]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2676]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2677]! } + public var Cache_ClearCache: String { return self._s[2681]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2682]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2683]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2681]!, self._r[2681]!, [_0]) + return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2683]!, self._r[2683]!, [_0]) + return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2684]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2685]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2686]! } - public var ChatList_UnarchiveAction: String { return self._s[2687]! } - public var AutoNightTheme_Title: String { return self._s[2688]! } - public var InstantPage_FeedbackButton: String { return self._s[2689]! } - public var Passport_FieldAddress: String { return self._s[2690]! } + public var LocalGroup_Text: String { return self._s[2690]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2691]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2692]! } + public var ChatList_UnarchiveAction: String { return self._s[2693]! } + public var AutoNightTheme_Title: String { return self._s[2694]! } + public var InstantPage_FeedbackButton: String { return self._s[2695]! } + public var Passport_FieldAddress: String { return self._s[2696]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2691]!, self._r[2691]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2697]!, self._r[2697]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2692]! } + public var Month_ShortMarch: String { return self._s[2698]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2693]!, self._r[2693]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2699]!, self._r[2699]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2694]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2695]! } - public var Passport_FloodError: String { return self._s[2696]! } - public var SecretGif_Title: String { return self._s[2697]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2698]! } - public var Passport_Language_th: String { return self._s[2700]! } - public var Passport_Address_Address: String { return self._s[2701]! } - public var Login_InvalidLastNameError: String { return self._s[2702]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2703]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2704]! } - public var SettingsSearch_FAQ: String { return self._s[2705]! } - public var ShareMenu_Send: String { return self._s[2706]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2708]! } - public var Month_GenNovember: String { return self._s[2710]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2712]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2700]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2701]! } + public var Passport_FloodError: String { return self._s[2702]! } + public var SecretGif_Title: String { return self._s[2703]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2704]! } + public var Passport_Language_th: String { return self._s[2706]! } + public var Passport_Address_Address: String { return self._s[2707]! } + public var Login_InvalidLastNameError: String { return self._s[2708]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2709]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2710]! } + public var SettingsSearch_FAQ: String { return self._s[2711]! } + public var ShareMenu_Send: String { return self._s[2712]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2714]! } + public var Month_GenNovember: String { return self._s[2716]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2718]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2713]!, self._r[2713]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2714]! } - public var NotificationsSound_Tritone: String { return self._s[2715]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2717]! } + public var Checkout_Email: String { return self._s[2720]! } + public var NotificationsSound_Tritone: String { return self._s[2721]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2723]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2720]!, self._r[2720]!, [_1]) + return formatWithArgumentRanges(self._s[2726]!, self._r[2726]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2721]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2727]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2722]!, self._r[2722]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2723]! } - public var Notification_Exceptions_Add: String { return self._s[2724]! } - public var DialogList_You: String { return self._s[2725]! } - public var MediaPicker_Send: String { return self._s[2728]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2729]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2730]! } - public var Call_AudioRouteSpeaker: String { return self._s[2731]! } - public var Appearance_CreateThemeInfo: String { return self._s[2732]! } - public var Watch_UserInfo_Title: String { return self._s[2733]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2734]! } - public var Appearance_AccentColor: String { return self._s[2735]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2729]! } + public var Notification_Exceptions_Add: String { return self._s[2730]! } + public var DialogList_You: String { return self._s[2731]! } + public var MediaPicker_Send: String { return self._s[2734]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2735]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2736]! } + public var Call_AudioRouteSpeaker: String { return self._s[2737]! } + public var Appearance_CreateThemeInfo: String { return self._s[2738]! } + public var Watch_UserInfo_Title: String { return self._s[2739]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2740]! } + public var Appearance_AccentColor: String { return self._s[2741]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2736]!, self._r[2736]!, [_0]) + return formatWithArgumentRanges(self._s[2742]!, self._r[2742]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2737]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2743]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2738]!, self._r[2738]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2744]!, self._r[2744]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2739]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2740]! } - public var Notification_CallOutgoing: String { return self._s[2741]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2742]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2743]! } - public var Call_RecordingDisabledMessage: String { return self._s[2744]! } - public var Message_Game: String { return self._s[2745]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2746]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2747]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2748]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2749]! } - public var Date_DialogDateFormat: String { return self._s[2750]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2751]! } - public var Notifications_InAppNotifications: String { return self._s[2752]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2745]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2746]! } + public var Notification_CallOutgoing: String { return self._s[2747]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2748]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2749]! } + public var Call_RecordingDisabledMessage: String { return self._s[2750]! } + public var Message_Game: String { return self._s[2751]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2752]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2753]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2754]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2755]! } + public var Date_DialogDateFormat: String { return self._s[2756]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2757]! } + public var Notifications_InAppNotifications: String { return self._s[2758]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_0]) + return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2760]!, self._r[2760]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2755]! } + public var NewContact_Title: String { return self._s[2761]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2756]!, self._r[2756]!, [_0]) + return formatWithArgumentRanges(self._s[2762]!, self._r[2762]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2757]! } + public var Conversation_ViewContactDetails: String { return self._s[2763]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_1]) + return formatWithArgumentRanges(self._s[2765]!, self._r[2765]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2760]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2761]! } - public var PrivacySettings_Title: String { return self._s[2762]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2765]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2766]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2767]! } - public var Contacts_PhoneNumber: String { return self._s[2768]! } - public var Map_ShowPlaces: String { return self._s[2770]! } - public var ChatAdmins_Title: String { return self._s[2771]! } - public var InstantPage_Reference: String { return self._s[2773]! } - public var ReportGroupLocation_Text: String { return self._s[2774]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2766]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2767]! } + public var PrivacySettings_Title: String { return self._s[2768]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2771]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2772]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2773]! } + public var Contacts_PhoneNumber: String { return self._s[2774]! } + public var Map_ShowPlaces: String { return self._s[2776]! } + public var ChatAdmins_Title: String { return self._s[2777]! } + public var InstantPage_Reference: String { return self._s[2779]! } + public var ReportGroupLocation_Text: String { return self._s[2780]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2775]!, self._r[2775]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2776]! } - public var Watch_UserInfo_Block: String { return self._s[2777]! } - public var ChatSettings_Stickers: String { return self._s[2778]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2779]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2780]! } + public var Camera_FlashOff: String { return self._s[2782]! } + public var Watch_UserInfo_Block: String { return self._s[2783]! } + public var ChatSettings_Stickers: String { return self._s[2784]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2785]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2786]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_0]) + return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2782]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2783]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2784]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2785]! } - public var VoiceOver_MessageContextShare: String { return self._s[2786]! } - public var CreateTheme_Title: String { return self._s[2788]! } + public var Settings_ViewPhoto: String { return self._s[2788]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2789]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2790]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2791]! } + public var VoiceOver_MessageContextShare: String { return self._s[2792]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2789]!, self._r[2789]!, [_0]) + return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2790]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2791]! } + public var Privacy_DeleteDrafts: String { return self._s[2795]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2796]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_0]) + return formatWithArgumentRanges(self._s[2797]!, self._r[2797]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2793]! } - public var DialogList_SavedMessages: String { return self._s[2794]! } - public var GroupInfo_UpgradeButton: String { return self._s[2795]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2797]! } - public var DialogList_Pin: String { return self._s[2798]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2798]! } + public var DialogList_SavedMessages: String { return self._s[2799]! } + public var GroupInfo_UpgradeButton: String { return self._s[2800]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2802]! } + public var DialogList_Pin: String { return self._s[2803]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2799]!, self._r[2799]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2804]!, self._r[2804]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0]) + return formatWithArgumentRanges(self._s[2805]!, self._r[2805]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2801]! } - public var UserInfo_NotificationsDisable: String { return self._s[2802]! } - public var Paint_Outlined: String { return self._s[2803]! } - public var Activity_PlayingGame: String { return self._s[2804]! } - public var SearchImages_NoImagesFound: String { return self._s[2805]! } - public var SocksProxySetup_ProxyType: String { return self._s[2806]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2808]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2809]! } - public var Settings_AppLanguage: String { return self._s[2810]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2811]! } - public var Common_ChoosePhoto: String { return self._s[2812]! } - public var CallFeedback_ReasonEcho: String { return self._s[2813]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2806]! } + public var UserInfo_NotificationsDisable: String { return self._s[2807]! } + public var Paint_Outlined: String { return self._s[2808]! } + public var Activity_PlayingGame: String { return self._s[2809]! } + public var SearchImages_NoImagesFound: String { return self._s[2810]! } + public var SocksProxySetup_ProxyType: String { return self._s[2811]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2813]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2814]! } + public var Settings_AppLanguage: String { return self._s[2815]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2816]! } + public var Common_ChoosePhoto: String { return self._s[2817]! } + public var CallFeedback_ReasonEcho: String { return self._s[2818]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2814]!, self._r[2814]!, [_1]) + return formatWithArgumentRanges(self._s[2819]!, self._r[2819]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2815]! } - public var Activity_UploadingVideo: String { return self._s[2816]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2817]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2818]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2819]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2820]! } - public var Checkout_PayWithTouchId: String { return self._s[2821]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2822]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2820]! } + public var Activity_UploadingVideo: String { return self._s[2821]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2822]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2823]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2824]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2825]! } + public var Checkout_PayWithTouchId: String { return self._s[2826]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2827]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2824]!, self._r[2824]!, [_1]) + return formatWithArgumentRanges(self._s[2829]!, self._r[2829]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2825]! } + public var Notifications_ExceptionsNone: String { return self._s[2830]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_0]) + return formatWithArgumentRanges(self._s[2831]!, self._r[2831]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_1]) + return formatWithArgumentRanges(self._s[2832]!, self._r[2832]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2829]! } - public var Passport_Address_Region: String { return self._s[2832]! } - public var ChatList_DeleteChat: String { return self._s[2833]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2834]! } - public var PhotoEditor_TiltShift: String { return self._s[2835]! } - public var Settings_FAQ_URL: String { return self._s[2836]! } - public var Passport_Language_sl: String { return self._s[2837]! } - public var Settings_PrivacySettings: String { return self._s[2839]! } - public var SharedMedia_TitleLink: String { return self._s[2840]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2841]! } - public var Settings_SetProfilePhoto: String { return self._s[2842]! } - public var Channel_About_Help: String { return self._s[2843]! } - public var Contacts_PermissionsEnable: String { return self._s[2844]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2845]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2846]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2848]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2849]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2850]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2851]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2852]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2854]! } - public var Map_OpenInYandexMaps: String { return self._s[2856]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2857]! } - public var VoiceOver_MessageContextReply: String { return self._s[2858]! } - public var PhotoEditor_SaturationTool: String { return self._s[2859]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2834]! } + public var Passport_Address_Region: String { return self._s[2837]! } + public var ChatList_DeleteChat: String { return self._s[2838]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2839]! } + public var PhotoEditor_TiltShift: String { return self._s[2840]! } + public var Settings_FAQ_URL: String { return self._s[2841]! } + public var Passport_Language_sl: String { return self._s[2842]! } + public var Settings_PrivacySettings: String { return self._s[2844]! } + public var SharedMedia_TitleLink: String { return self._s[2845]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2846]! } + public var Settings_SetProfilePhoto: String { return self._s[2847]! } + public var Channel_About_Help: String { return self._s[2848]! } + public var Contacts_PermissionsEnable: String { return self._s[2849]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2850]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2851]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2853]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2854]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2855]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2856]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2857]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2859]! } + public var Map_OpenInYandexMaps: String { return self._s[2861]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2862]! } + public var VoiceOver_MessageContextReply: String { return self._s[2863]! } + public var PhotoEditor_SaturationTool: String { return self._s[2864]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2860]!, self._r[2860]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2861]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2862]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2863]! } - public var Appearance_TextSize: String { return self._s[2864]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2866]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2867]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2868]! } + public var Appearance_TextSize: String { return self._s[2869]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2870]!, self._r[2870]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2866]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2868]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2871]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2873]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2874]!, self._r[2874]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2870]!, self._r[2870]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2875]!, self._r[2875]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2871]! } - public var Passport_PassportInformation: String { return self._s[2874]! } - public var WatchRemote_AlertTitle: String { return self._s[2875]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2876]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2878]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2876]! } + public var Passport_PassportInformation: String { return self._s[2879]! } + public var Theme_Unsupported: String { return self._s[2880]! } + public var WatchRemote_AlertTitle: String { return self._s[2881]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2882]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2884]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) - } - public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1]) - } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2881]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2883]! } - public var AccessDenied_CameraDisabled: String { return self._s[2884]! } - public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2888]! } + public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2886]!, self._r[2886]!, [_1]) + } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2887]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2889]! } + public var AccessDenied_CameraDisabled: String { return self._s[2890]! } + public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_0]) + } + public var PhotoEditor_ContrastTool: String { return self._s[2894]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2889]!, self._r[2889]!, [_1]) + return formatWithArgumentRanges(self._s[2895]!, self._r[2895]!, [_1]) } - public var DialogList_Draft: String { return self._s[2890]! } - public var Privacy_TopPeersDelete: String { return self._s[2892]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2893]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2894]! } - public var WebSearch_RecentSectionClear: String { return self._s[2895]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2897]! } - public var Common_Done: String { return self._s[2899]! } - public var AuthSessions_EmptyText: String { return self._s[2900]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2901]! } - public var Tour_Title5: String { return self._s[2902]! } + public var DialogList_Draft: String { return self._s[2896]! } + public var Privacy_TopPeersDelete: String { return self._s[2898]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2899]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2900]! } + public var WebSearch_RecentSectionClear: String { return self._s[2901]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2903]! } + public var Common_Done: String { return self._s[2905]! } + public var AuthSessions_EmptyText: String { return self._s[2906]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2907]! } + public var Tour_Title5: String { return self._s[2908]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2903]!, self._r[2903]!, [_0]) + return formatWithArgumentRanges(self._s[2909]!, self._r[2909]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2904]! } - public var Conversation_LinkDialogSave: String { return self._s[2905]! } - public var GroupInfo_ActionRestrict: String { return self._s[2906]! } - public var Checkout_Title: String { return self._s[2907]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2909]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2911]! } - public var Notification_RenamedGroup: String { return self._s[2912]! } - public var PeopleNearby_Groups: String { return self._s[2913]! } - public var Checkout_PayWithFaceId: String { return self._s[2914]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2915]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2917]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2918]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2919]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2910]! } + public var Conversation_LinkDialogSave: String { return self._s[2911]! } + public var GroupInfo_ActionRestrict: String { return self._s[2912]! } + public var Checkout_Title: String { return self._s[2913]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2915]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2917]! } + public var Notification_RenamedGroup: String { return self._s[2918]! } + public var PeopleNearby_Groups: String { return self._s[2919]! } + public var Checkout_PayWithFaceId: String { return self._s[2920]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2921]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2923]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2924]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2925]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_0]) + return formatWithArgumentRanges(self._s[2926]!, self._r[2926]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2922]! } + public var Profile_AddToExisting: String { return self._s[2928]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2929]!, self._r[2929]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2925]! } - public var Permissions_PrivacyPolicy: String { return self._s[2926]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2927]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2928]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2930]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2932]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2933]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2934]! } - public var VoiceOver_AttachMedia: String { return self._s[2936]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2937]! } + public var Cache_Files: String { return self._s[2931]! } + public var Permissions_PrivacyPolicy: String { return self._s[2932]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2933]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2934]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2936]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2938]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2939]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2940]! } + public var VoiceOver_AttachMedia: String { return self._s[2942]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2943]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2938]!, self._r[2938]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2944]!, self._r[2944]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2939]! } - public var Conversation_SetReminder_Title: String { return self._s[2940]! } - public var Passport_FieldAddressHelp: String { return self._s[2941]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2942]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2945]! } + public var Conversation_SetReminder_Title: String { return self._s[2946]! } + public var Passport_FieldAddressHelp: String { return self._s[2947]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2948]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2943]!, self._r[2943]!, [_0]) + return formatWithArgumentRanges(self._s[2949]!, self._r[2949]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2944]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2946]! } - public var Login_UnknownError: String { return self._s[2947]! } - public var Group_UpgradeNoticeText2: String { return self._s[2949]! } - public var Watch_Compose_AddContact: String { return self._s[2950]! } - public var Web_Error: String { return self._s[2951]! } - public var Gif_Search: String { return self._s[2952]! } - public var Profile_MessageLifetime1h: String { return self._s[2953]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2954]! } - public var Channel_Username_CheckingUsername: String { return self._s[2955]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2956]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2957]! } - public var Channel_AboutItem: String { return self._s[2958]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2960]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2961]! } - public var GroupInfo_SharedMedia: String { return self._s[2962]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2950]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2952]! } + public var Login_UnknownError: String { return self._s[2953]! } + public var Group_UpgradeNoticeText2: String { return self._s[2955]! } + public var Watch_Compose_AddContact: String { return self._s[2956]! } + public var Web_Error: String { return self._s[2957]! } + public var Gif_Search: String { return self._s[2958]! } + public var Profile_MessageLifetime1h: String { return self._s[2959]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2960]! } + public var Channel_Username_CheckingUsername: String { return self._s[2961]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2962]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2963]! } + public var Channel_AboutItem: String { return self._s[2964]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2966]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2967]! } + public var GroupInfo_SharedMedia: String { return self._s[2968]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2963]!, self._r[2963]!, [_1]) + return formatWithArgumentRanges(self._s[2969]!, self._r[2969]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2964]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2970]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_1]) + return formatWithArgumentRanges(self._s[2971]!, self._r[2971]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2966]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2967]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2968]! } - public var CreatePoll_AddOption: String { return self._s[2969]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2970]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2971]! } - public var Channel_Management_AddModerator: String { return self._s[2972]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2973]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2974]! } - public var NotificationsSound_Hello: String { return self._s[2975]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2976]! } - public var Channel_Stickers_Placeholder: String { return self._s[2978]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2972]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2973]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2974]! } + public var CreatePoll_AddOption: String { return self._s[2975]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2976]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2977]! } + public var Channel_Management_AddModerator: String { return self._s[2978]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2979]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2980]! } + public var NotificationsSound_Hello: String { return self._s[2981]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2982]! } + public var Channel_Stickers_Placeholder: String { return self._s[2984]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2979]!, self._r[2979]!, [_0]) + return formatWithArgumentRanges(self._s[2985]!, self._r[2985]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2980]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2981]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2982]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2983]! } - public var AutoDownloadSettings_Channels: String { return self._s[2984]! } - public var Passport_Language_mn: String { return self._s[2985]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2988]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2989]! } - public var Passport_Language_ja: String { return self._s[2991]! } - public var Settings_About_Title: String { return self._s[2992]! } - public var Settings_NotificationsAndSounds: String { return self._s[2993]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2994]! } - public var Settings_BlockedUsers: String { return self._s[2995]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2986]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2987]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2988]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2989]! } + public var AutoDownloadSettings_Channels: String { return self._s[2990]! } + public var Passport_Language_mn: String { return self._s[2991]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2994]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2995]! } + public var Passport_Language_ja: String { return self._s[2997]! } + public var Settings_About_Title: String { return self._s[2998]! } + public var Settings_NotificationsAndSounds: String { return self._s[2999]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3000]! } + public var Settings_BlockedUsers: String { return self._s[3001]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2996]!, self._r[2996]!, [_0]) + return formatWithArgumentRanges(self._s[3002]!, self._r[3002]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2997]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2998]! } - public var Channel_Username_Title: String { return self._s[2999]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3003]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3004]! } + public var Channel_Username_Title: String { return self._s[3005]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3000]!, self._r[3000]!, [_0]) + return formatWithArgumentRanges(self._s[3006]!, self._r[3006]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3002]! } - public var AppleWatch_Title: String { return self._s[3003]! } - public var Activity_RecordingVideoMessage: String { return self._s[3004]! } + public var AttachmentMenu_File: String { return self._s[3008]! } + public var AppleWatch_Title: String { return self._s[3009]! } + public var Activity_RecordingVideoMessage: String { return self._s[3010]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3005]!, self._r[3005]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3006]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3007]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3008]! } - public var Common_Next: String { return self._s[3010]! } - public var Channel_Stickers_YourStickers: String { return self._s[3012]! } - public var Call_AudioRouteHeadphones: String { return self._s[3013]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3015]! } - public var Watch_Contacts_NoResults: String { return self._s[3017]! } - public var PhotoEditor_TintTool: String { return self._s[3020]! } - public var LoginPassword_ResetAccount: String { return self._s[3022]! } - public var Settings_SavedMessages: String { return self._s[3023]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3024]! } - public var Bot_GenericSupportStatus: String { return self._s[3025]! } - public var StickerPack_Add: String { return self._s[3026]! } - public var Checkout_TotalAmount: String { return self._s[3027]! } - public var Your_cards_number_is_invalid: String { return self._s[3028]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3029]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3030]! } + public var Weekday_Saturday: String { return self._s[3012]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3013]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3014]! } + public var Common_Next: String { return self._s[3016]! } + public var Channel_Stickers_YourStickers: String { return self._s[3018]! } + public var Message_Theme: String { return self._s[3019]! } + public var Call_AudioRouteHeadphones: String { return self._s[3020]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3022]! } + public var Watch_Contacts_NoResults: String { return self._s[3024]! } + public var PhotoEditor_TintTool: String { return self._s[3027]! } + public var LoginPassword_ResetAccount: String { return self._s[3029]! } + public var Settings_SavedMessages: String { return self._s[3030]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3031]! } + public var Bot_GenericSupportStatus: String { return self._s[3032]! } + public var StickerPack_Add: String { return self._s[3033]! } + public var Checkout_TotalAmount: String { return self._s[3034]! } + public var Your_cards_number_is_invalid: String { return self._s[3035]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3036]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3037]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_0]) + return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3032]!, self._r[3032]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3039]!, self._r[3039]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3033]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3040]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3042]!, self._r[3042]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3036]!, self._r[3036]!, [_0]) + return formatWithArgumentRanges(self._s[3043]!, self._r[3043]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3037]! } - public var StickerPack_Share: String { return self._s[3038]! } - public var Passport_DeleteAddress: String { return self._s[3039]! } - public var Settings_Passport: String { return self._s[3040]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3041]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3042]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3043]! } - public var Contacts_PermissionsText: String { return self._s[3044]! } - public var Group_Setup_HistoryVisible: String { return self._s[3045]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3047]! } - public var SocksProxySetup_Title: String { return self._s[3048]! } - public var Notification_Mute1h: String { return self._s[3049]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3044]! } + public var StickerPack_Share: String { return self._s[3045]! } + public var Passport_DeleteAddress: String { return self._s[3046]! } + public var Settings_Passport: String { return self._s[3047]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3048]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3049]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3050]! } + public var Contacts_PermissionsText: String { return self._s[3051]! } + public var Group_Setup_HistoryVisible: String { return self._s[3052]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3054]! } + public var SocksProxySetup_Title: String { return self._s[3055]! } + public var Notification_Mute1h: String { return self._s[3056]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_0]) + return formatWithArgumentRanges(self._s[3057]!, self._r[3057]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3051]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3058]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3052]!, self._r[3052]!, [_1]) + return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3053]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3056]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3058]! } - public var DialogList_NoMessagesText: String { return self._s[3059]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3060]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3061]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3063]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3064]! } - public var Common_TakePhotoOrVideo: String { return self._s[3065]! } - public var Call_StatusBusy: String { return self._s[3066]! } - public var Conversation_PinnedMessage: String { return self._s[3067]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3068]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3069]! } - public var Undo_ChatCleared: String { return self._s[3070]! } - public var AppleWatch_ReplyPresets: String { return self._s[3071]! } - public var Passport_DiscardMessageDescription: String { return self._s[3073]! } - public var Login_NetworkError: String { return self._s[3074]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3060]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3063]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3065]! } + public var DialogList_NoMessagesText: String { return self._s[3066]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3067]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3068]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3070]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3071]! } + public var Common_TakePhotoOrVideo: String { return self._s[3072]! } + public var Call_StatusBusy: String { return self._s[3073]! } + public var Conversation_PinnedMessage: String { return self._s[3074]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3075]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3076]! } + public var Undo_ChatCleared: String { return self._s[3077]! } + public var AppleWatch_ReplyPresets: String { return self._s[3078]! } + public var Passport_DiscardMessageDescription: String { return self._s[3080]! } + public var Login_NetworkError: String { return self._s[3081]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) + return formatWithArgumentRanges(self._s[3082]!, self._r[3082]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3076]!, self._r[3076]!, [_0]) + return formatWithArgumentRanges(self._s[3083]!, self._r[3083]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3077]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3079]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3084]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3086]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3081]!, self._r[3081]!, [_0]) + return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3082]! } - public var VoiceOver_Chat_Music: String { return self._s[3083]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3084]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3086]! } - public var ConversationMedia_Title: String { return self._s[3087]! } - public var EncryptionKey_Title: String { return self._s[3089]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3090]! } - public var Notification_Exceptions_AddException: String { return self._s[3091]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3092]! } - public var Profile_MessageLifetime1m: String { return self._s[3093]! } + public var Call_ConnectionErrorMessage: String { return self._s[3089]! } + public var VoiceOver_Chat_Music: String { return self._s[3090]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3091]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3093]! } + public var ConversationMedia_Title: String { return self._s[3094]! } + public var EncryptionKey_Title: String { return self._s[3096]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3097]! } + public var Notification_Exceptions_AddException: String { return self._s[3098]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3099]! } + public var Profile_MessageLifetime1m: String { return self._s[3100]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_1]) + return formatWithArgumentRanges(self._s[3101]!, self._r[3101]!, [_1]) } - public var Month_GenMay: String { return self._s[3095]! } + public var Month_GenMay: String { return self._s[3102]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3096]!, self._r[3096]!, [_0]) + return formatWithArgumentRanges(self._s[3103]!, self._r[3103]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3097]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3098]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3099]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3101]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3102]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3103]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3104]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3105]! } - public var Channel_JoinChannel: String { return self._s[3107]! } - public var Appearance_Animations: String { return self._s[3110]! } + public var PeopleNearby_Users: String { return self._s[3104]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3105]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3106]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3108]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3109]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3110]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3111]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3112]! } + public var Channel_JoinChannel: String { return self._s[3114]! } + public var Appearance_Animations: String { return self._s[3117]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3118]!, self._r[3118]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3113]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3115]! } - public var Passport_Address_Street: String { return self._s[3116]! } - public var Conversation_AddContact: String { return self._s[3117]! } - public var Login_PhonePlaceholder: String { return self._s[3118]! } - public var Channel_Members_InviteLink: String { return self._s[3120]! } - public var Bot_Stop: String { return self._s[3121]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3123]! } - public var Notification_PassportValueAddress: String { return self._s[3124]! } - public var Month_ShortJuly: String { return self._s[3125]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3126]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3127]! } - public var Passport_Identity_ReverseSide: String { return self._s[3128]! } - public var Watch_Stickers_Recents: String { return self._s[3131]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3133]! } - public var Map_SendThisLocation: String { return self._s[3134]! } + public var Stickers_GroupStickers: String { return self._s[3120]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3122]! } + public var Passport_Address_Street: String { return self._s[3123]! } + public var Conversation_AddContact: String { return self._s[3124]! } + public var Login_PhonePlaceholder: String { return self._s[3125]! } + public var Channel_Members_InviteLink: String { return self._s[3127]! } + public var Bot_Stop: String { return self._s[3128]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3130]! } + public var Notification_PassportValueAddress: String { return self._s[3131]! } + public var Month_ShortJuly: String { return self._s[3132]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3133]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3134]! } + public var Passport_Identity_ReverseSide: String { return self._s[3135]! } + public var Watch_Stickers_Recents: String { return self._s[3138]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3140]! } + public var Map_SendThisLocation: String { return self._s[3141]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_0]) + return formatWithArgumentRanges(self._s[3142]!, self._r[3142]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0]) + return formatWithArgumentRanges(self._s[3143]!, self._r[3143]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3137]! } + public var ConvertToSupergroup_Note: String { return self._s[3144]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_0]) + return formatWithArgumentRanges(self._s[3145]!, self._r[3145]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3139]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3146]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3147]!, self._r[3147]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3142]! } - public var Wallpaper_SearchShort: String { return self._s[3143]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3145]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3146]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3147]! } + public var Login_CallRequestState3: String { return self._s[3149]! } + public var Wallpaper_SearchShort: String { return self._s[3150]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3152]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3153]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3154]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3148]!, self._r[3148]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3149]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3153]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3156]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3160]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_0]) + return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3155]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3156]! } + public var Passport_CorrectErrors: String { return self._s[3162]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3163]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_0]) + return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3158]! } - public var Channel_DiscussionGroup: String { return self._s[3159]! } + public var Map_SendMyCurrentLocation: String { return self._s[3165]! } + public var Channel_DiscussionGroup: String { return self._s[3166]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3167]!, self._r[3167]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3161]! } - public var Permissions_NotificationsText_v0: String { return self._s[3162]! } - public var Appearance_AppIcon: String { return self._s[3163]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3164]! } - public var LoginPassword_FloodError: String { return self._s[3165]! } - public var Appearance_Publish: String { return self._s[3167]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3168]! } + public var SharedMedia_SearchNoResults: String { return self._s[3168]! } + public var Permissions_NotificationsText_v0: String { return self._s[3169]! } + public var Appearance_AppIcon: String { return self._s[3170]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3171]! } + public var LoginPassword_FloodError: String { return self._s[3172]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3174]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_0]) + return formatWithArgumentRanges(self._s[3175]!, self._r[3175]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3170]! } + public var Passport_Language_bn: String { return self._s[3176]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_0]) + return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_0]) } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_0]) + return formatWithArgumentRanges(self._s[3178]!, self._r[3178]!, [_0]) } - public var CreateTheme_ShortLinkInfo: String { return self._s[3173]! } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3174]!, self._r[3174]!, [_0]) + return formatWithArgumentRanges(self._s[3179]!, self._r[3179]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3177]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3179]! } - public var Contacts_PermissionsAllow: String { return self._s[3180]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3181]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3182]! } - public var WallpaperPreview_Pattern: String { return self._s[3183]! } - public var Paint_Duplicate: String { return self._s[3184]! } - public var Passport_Address_Country: String { return self._s[3185]! } - public var Notification_RenamedChannel: String { return self._s[3187]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3188]! } - public var Group_MessagePhotoUpdated: String { return self._s[3189]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3190]! } - public var Conversation_ContextMenuBan: String { return self._s[3191]! } - public var TwoStepAuth_EmailSent: String { return self._s[3192]! } - public var MessagePoll_NoVotes: String { return self._s[3193]! } - public var Passport_Language_is: String { return self._s[3194]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3196]! } - public var Tour_Text5: String { return self._s[3197]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3182]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3184]! } + public var Contacts_PermissionsAllow: String { return self._s[3185]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3186]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3187]! } + public var WallpaperPreview_Pattern: String { return self._s[3188]! } + public var Paint_Duplicate: String { return self._s[3189]! } + public var Passport_Address_Country: String { return self._s[3190]! } + public var Notification_RenamedChannel: String { return self._s[3192]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3193]! } + public var Group_MessagePhotoUpdated: String { return self._s[3194]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3195]! } + public var Conversation_ContextMenuBan: String { return self._s[3196]! } + public var TwoStepAuth_EmailSent: String { return self._s[3197]! } + public var MessagePoll_NoVotes: String { return self._s[3198]! } + public var Passport_Language_is: String { return self._s[3199]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3201]! } + public var Tour_Text5: String { return self._s[3202]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3204]!, self._r[3204]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3200]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3201]! } + public var Undo_SecretChatDeleted: String { return self._s[3205]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3206]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3202]!, self._r[3202]!, [_0]) + return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3203]! } - public var Paint_Edit: String { return self._s[3205]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3207]! } - public var Undo_DeletedGroup: String { return self._s[3209]! } - public var LoginPassword_ForgotPassword: String { return self._s[3210]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3211]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3208]! } + public var Paint_Edit: String { return self._s[3210]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3212]! } + public var Undo_DeletedGroup: String { return self._s[3214]! } + public var LoginPassword_ForgotPassword: String { return self._s[3215]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3216]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3217]!, self._r[3217]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3213]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3214]! } - public var Passport_Language_uz: String { return self._s[3215]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3216]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3217]! } - public var Map_StopLiveLocation: String { return self._s[3219]! } - public var VoiceOver_MessageContextSend: String { return self._s[3221]! } - public var PasscodeSettings_Help: String { return self._s[3222]! } - public var NotificationsSound_Input: String { return self._s[3223]! } - public var Share_Title: String { return self._s[3226]! } - public var LogoutOptions_Title: String { return self._s[3227]! } - public var Login_TermsOfServiceAgree: String { return self._s[3228]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3229]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3230]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3231]! } - public var EnterPasscode_EnterTitle: String { return self._s[3232]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3218]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3219]! } + public var Passport_Language_uz: String { return self._s[3220]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3221]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3222]! } + public var Map_StopLiveLocation: String { return self._s[3224]! } + public var VoiceOver_MessageContextSend: String { return self._s[3226]! } + public var PasscodeSettings_Help: String { return self._s[3227]! } + public var NotificationsSound_Input: String { return self._s[3228]! } + public var Share_Title: String { return self._s[3231]! } + public var LogoutOptions_Title: String { return self._s[3232]! } + public var Login_TermsOfServiceAgree: String { return self._s[3233]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3234]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3235]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3236]! } + public var EnterPasscode_EnterTitle: String { return self._s[3237]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_0]) - } - public var Settings_CopyPhoneNumber: String { return self._s[3234]! } - public var Conversation_AddToContacts: String { return self._s[3235]! } - public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_0]) - } - public var NotificationsSound_Keys: String { return self._s[3237]! } - public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3239]! } - public var Message_Video: String { return self._s[3240]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3241]! } + public var Settings_CopyPhoneNumber: String { return self._s[3239]! } + public var Conversation_AddToContacts: String { return self._s[3240]! } + public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_0]) + } + public var NotificationsSound_Keys: String { return self._s[3242]! } + public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_0]) + } + public var Notification_MessageLifetime1w: String { return self._s[3244]! } + public var Message_Video: String { return self._s[3245]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3246]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3242]!, self._r[3242]!, [_1]) + return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3245]!, self._r[3245]!, [_0]) + return formatWithArgumentRanges(self._s[3250]!, self._r[3250]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_0]) + return formatWithArgumentRanges(self._s[3251]!, self._r[3251]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3247]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3248]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3250]! } - public var PrivacyPolicy_Decline: String { return self._s[3251]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3252]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3253]! } - public var Permissions_SiriAllow_v0: String { return self._s[3255]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3256]! } + public var Passport_Language_mk: String { return self._s[3252]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3253]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3255]! } + public var PrivacyPolicy_Decline: String { return self._s[3256]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3257]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3258]! } + public var Permissions_SiriAllow_v0: String { return self._s[3260]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3261]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3257]!, self._r[3257]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3262]!, self._r[3262]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3258]!, self._r[3258]!, [_0]) + return formatWithArgumentRanges(self._s[3263]!, self._r[3263]!, [_0]) } - public var Paint_Regular: String { return self._s[3259]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3260]! } - public var SocksProxySetup_ShareLink: String { return self._s[3261]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3262]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3264]! } - public var GroupInfo_InviteByLink: String { return self._s[3265]! } - public var MessageTimer_Custom: String { return self._s[3266]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3267]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3269]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3270]! } - public var VoiceOver_Chat_Selected: String { return self._s[3271]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3272]! } - public var Channel_Username_InvalidTaken: String { return self._s[3273]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3274]! } - public var Settings_ChatBackground: String { return self._s[3275]! } - public var Channel_Subscribers_Title: String { return self._s[3276]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3277]! } - public var Watch_ConnectionDescription: String { return self._s[3278]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3282]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3283]! } - public var EditProfile_Title: String { return self._s[3284]! } - public var NotificationsSound_Bamboo: String { return self._s[3286]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3288]! } - public var Login_SmsRequestState2: String { return self._s[3289]! } - public var Passport_Language_ar: String { return self._s[3290]! } + public var Paint_Regular: String { return self._s[3264]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3265]! } + public var SocksProxySetup_ShareLink: String { return self._s[3266]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3267]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3269]! } + public var GroupInfo_InviteByLink: String { return self._s[3270]! } + public var MessageTimer_Custom: String { return self._s[3271]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3272]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3274]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3275]! } + public var VoiceOver_Chat_Selected: String { return self._s[3276]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3277]! } + public var Channel_Username_InvalidTaken: String { return self._s[3278]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3279]! } + public var Settings_ChatBackground: String { return self._s[3280]! } + public var Channel_Subscribers_Title: String { return self._s[3281]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3282]! } + public var Watch_ConnectionDescription: String { return self._s[3283]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3287]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3288]! } + public var EditProfile_Title: String { return self._s[3289]! } + public var NotificationsSound_Bamboo: String { return self._s[3291]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3293]! } + public var Login_SmsRequestState2: String { return self._s[3294]! } + public var Passport_Language_ar: String { return self._s[3295]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3291]!, self._r[3291]!, [_0]) + return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3292]! } - public var Conversation_MessageDialogEdit: String { return self._s[3293]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3294]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3297]! } + public var Conversation_MessageDialogEdit: String { return self._s[3298]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3299]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3295]!, self._r[3295]!, [_1]) + return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_1]) } - public var Common_Close: String { return self._s[3296]! } - public var GroupInfo_PublicLink: String { return self._s[3297]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3298]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3299]! } + public var Common_Close: String { return self._s[3301]! } + public var GroupInfo_PublicLink: String { return self._s[3302]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3303]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3304]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_0]) + return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3304]! } + public var UserInfo_About_Placeholder: String { return self._s[3309]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3305]!, self._r[3305]!, [_0]) + return formatWithArgumentRanges(self._s[3310]!, self._r[3310]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3306]! } - public var Channel_Info_Banned: String { return self._s[3308]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3311]! } + public var Channel_Info_Banned: String { return self._s[3313]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3309]!, self._r[3309]!, [_0]) + return formatWithArgumentRanges(self._s[3314]!, self._r[3314]!, [_0]) } - public var Appearance_Other: String { return self._s[3310]! } - public var Passport_Language_my: String { return self._s[3311]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3312]! } + public var Appearance_Other: String { return self._s[3315]! } + public var Passport_Language_my: String { return self._s[3316]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3317]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3313]!, self._r[3313]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3314]! } - public var Preview_CopyAddress: String { return self._s[3315]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3319]! } + public var Preview_CopyAddress: String { return self._s[3320]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) + return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3317]! } - public var UserInfo_BotSettings: String { return self._s[3318]! } - public var LiveLocation_MenuStopAll: String { return self._s[3320]! } - public var Passport_PasswordCreate: String { return self._s[3321]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3322]! } - public var Message_PinnedLocationMessage: String { return self._s[3323]! } - public var Map_Satellite: String { return self._s[3324]! } - public var Watch_Message_Unsupported: String { return self._s[3325]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3326]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3327]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3322]! } + public var UserInfo_BotSettings: String { return self._s[3323]! } + public var LiveLocation_MenuStopAll: String { return self._s[3325]! } + public var Passport_PasswordCreate: String { return self._s[3326]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3327]! } + public var Message_PinnedLocationMessage: String { return self._s[3328]! } + public var Map_Satellite: String { return self._s[3329]! } + public var Watch_Message_Unsupported: String { return self._s[3330]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3331]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3332]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3328]!, self._r[3328]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3329]!, self._r[3329]!, [_0]) + return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3330]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3331]! } - public var NotificationsSound_None: String { return self._s[3332]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3334]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3335]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3335]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3336]! } + public var NotificationsSound_None: String { return self._s[3337]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3339]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3340]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3336]!, self._r[3336]!, [_1]) + return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_1]) } - public var Cache_Indexing: String { return self._s[3337]! } - public var DialogList_RecentTitlePeople: String { return self._s[3339]! } - public var DialogList_EncryptionRejected: String { return self._s[3340]! } - public var GroupInfo_Administrators: String { return self._s[3341]! } - public var Passport_ScanPassportHelp: String { return self._s[3342]! } - public var Application_Name: String { return self._s[3343]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3344]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3346]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3347]! } + public var Cache_Indexing: String { return self._s[3342]! } + public var DialogList_RecentTitlePeople: String { return self._s[3344]! } + public var DialogList_EncryptionRejected: String { return self._s[3345]! } + public var GroupInfo_Administrators: String { return self._s[3346]! } + public var Passport_ScanPassportHelp: String { return self._s[3347]! } + public var Application_Name: String { return self._s[3348]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3349]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3351]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3352]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3348]!, self._r[3348]!, [_0]) + return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_0]) + return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3350]!, self._r[3350]!, [_0]) + return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3351]! } - public var Privacy_ChatsTitle: String { return self._s[3352]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3353]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3354]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3355]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3356]! } - public var Group_LinkedChannel: String { return self._s[3357]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3358]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3359]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3360]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3361]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3363]! } - public var Channel_Setup_TypePublic: String { return self._s[3365]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3356]! } + public var Privacy_ChatsTitle: String { return self._s[3357]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3358]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3359]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3360]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3361]! } + public var Group_LinkedChannel: String { return self._s[3362]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3363]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3364]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3365]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3366]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3368]! } + public var Channel_Setup_TypePublic: String { return self._s[3370]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_0]) + return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3368]! } - public var Map_OpenInMaps: String { return self._s[3370]! } + public var Channel_TypeSetup_Title: String { return self._s[3373]! } + public var Map_OpenInMaps: String { return self._s[3375]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_1]) + return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3373]! } + public var NotificationsSound_Tremolo: String { return self._s[3378]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3374]!, self._r[3374]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3375]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3376]! } - public var Passport_PasswordHelp: String { return self._s[3377]! } - public var Login_CodeExpiredError: String { return self._s[3378]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3379]! } - public var Conversation_TitleUnmute: String { return self._s[3380]! } - public var Passport_Identity_ScansHelp: String { return self._s[3381]! } - public var Passport_Language_lo: String { return self._s[3382]! } - public var Camera_FlashAuto: String { return self._s[3383]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3384]! } - public var Common_Cancel: String { return self._s[3385]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3386]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3387]! } - public var Appearance_TintAllColors: String { return self._s[3388]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3380]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3381]! } + public var Passport_PasswordHelp: String { return self._s[3382]! } + public var Login_CodeExpiredError: String { return self._s[3383]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3384]! } + public var Conversation_TitleUnmute: String { return self._s[3385]! } + public var Passport_Identity_ScansHelp: String { return self._s[3386]! } + public var Passport_Language_lo: String { return self._s[3387]! } + public var Camera_FlashAuto: String { return self._s[3388]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3389]! } + public var Common_Cancel: String { return self._s[3390]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3391]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3392]! } + public var Appearance_TintAllColors: String { return self._s[3393]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3389]!, self._r[3389]!, [_1]) + return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3390]! } - public var ChatSettings_Title: String { return self._s[3392]! } - public var Passport_PasswordReset: String { return self._s[3393]! } - public var SocksProxySetup_TypeNone: String { return self._s[3394]! } - public var PhoneNumberHelp_Help: String { return self._s[3396]! } - public var Checkout_EnterPassword: String { return self._s[3397]! } - public var Share_AuthTitle: String { return self._s[3399]! } - public var Activity_UploadingDocument: String { return self._s[3400]! } - public var State_Connecting: String { return self._s[3401]! } - public var Profile_MessageLifetime1w: String { return self._s[3402]! } - public var Conversation_ContextMenuReport: String { return self._s[3403]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3404]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3405]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3395]! } + public var ChatSettings_Title: String { return self._s[3397]! } + public var Passport_PasswordReset: String { return self._s[3398]! } + public var SocksProxySetup_TypeNone: String { return self._s[3399]! } + public var EditTheme_Title: String { return self._s[3401]! } + public var PhoneNumberHelp_Help: String { return self._s[3402]! } + public var Checkout_EnterPassword: String { return self._s[3403]! } + public var Share_AuthTitle: String { return self._s[3405]! } + public var Activity_UploadingDocument: String { return self._s[3406]! } + public var State_Connecting: String { return self._s[3407]! } + public var Profile_MessageLifetime1w: String { return self._s[3408]! } + public var Conversation_ContextMenuReport: String { return self._s[3409]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3410]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3411]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3406]!, self._r[3406]!, [_0]) + return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3407]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3408]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3409]! } - public var PhotoEditor_Set: String { return self._s[3410]! } - public var EmptyGroupInfo_Title: String { return self._s[3411]! } - public var Login_PadPhoneHelp: String { return self._s[3412]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3414]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3416]! } - public var NotificationsSound_Complete: String { return self._s[3417]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3418]! } - public var Group_Info_AdminLog: String { return self._s[3419]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3420]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3421]! } - public var Conversation_Admin: String { return self._s[3423]! } - public var Conversation_GifTooltip: String { return self._s[3424]! } - public var Passport_NotLoggedInMessage: String { return self._s[3425]! } + public var AuthSessions_Terminate: String { return self._s[3413]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3414]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3415]! } + public var PhotoEditor_Set: String { return self._s[3416]! } + public var EmptyGroupInfo_Title: String { return self._s[3417]! } + public var Login_PadPhoneHelp: String { return self._s[3418]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3420]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3422]! } + public var NotificationsSound_Complete: String { return self._s[3423]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3424]! } + public var Group_Info_AdminLog: String { return self._s[3425]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3426]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3427]! } + public var Conversation_Admin: String { return self._s[3429]! } + public var Conversation_GifTooltip: String { return self._s[3430]! } + public var Passport_NotLoggedInMessage: String { return self._s[3431]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_0]) + return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3427]! } - public var SharedMedia_EmptyTitle: String { return self._s[3429]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3431]! } - public var Username_Help: String { return self._s[3432]! } - public var DialogList_LanguageTooltip: String { return self._s[3434]! } - public var Map_LoadError: String { return self._s[3435]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3436]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3437]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3438]! } - public var Notification_Exceptions_NewException: String { return self._s[3439]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3440]! } - public var WatchRemote_AlertText: String { return self._s[3441]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3444]! } + public var Profile_MessageLifetimeForever: String { return self._s[3433]! } + public var SharedMedia_EmptyTitle: String { return self._s[3435]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3437]! } + public var Username_Help: String { return self._s[3438]! } + public var DialogList_LanguageTooltip: String { return self._s[3440]! } + public var Map_LoadError: String { return self._s[3441]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3442]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3443]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3444]! } + public var Notification_Exceptions_NewException: String { return self._s[3445]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3446]! } + public var WatchRemote_AlertText: String { return self._s[3447]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3450]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3445]!, self._r[3445]!, [_0]) + return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3446]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3447]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3452]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3453]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3448]!, self._r[3448]!, [_0]) + return formatWithArgumentRanges(self._s[3454]!, self._r[3454]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3449]!, self._r[3449]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3450]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3451]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3453]! } - public var ChatList_UndoArchiveText1: String { return self._s[3454]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3455]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3456]! } - public var Cache_ClearNone: String { return self._s[3457]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3458]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3459]! } + public var Group_AdminLog_EmptyText: String { return self._s[3456]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3457]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3459]! } + public var ChatList_UndoArchiveText1: String { return self._s[3460]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3461]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3462]! } + public var Cache_ClearNone: String { return self._s[3463]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3464]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3465]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3460]!, self._r[3460]!, [_0]) + return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3461]! } + public var Passport_Identity_Country: String { return self._s[3467]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3462]!, self._r[3462]!, [_0]) + return formatWithArgumentRanges(self._s[3468]!, self._r[3468]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_0]) + return formatWithArgumentRanges(self._s[3469]!, self._r[3469]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3464]! } - public var AccessDenied_Settings: String { return self._s[3465]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3466]! } - public var Month_ShortMay: String { return self._s[3467]! } - public var Compose_NewGroup: String { return self._s[3468]! } - public var Group_Setup_TypePrivate: String { return self._s[3470]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3472]! } - public var Appearance_ThemeDayClassic: String { return self._s[3473]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3474]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3475]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3476]! } - public var Conversation_typing: String { return self._s[3478]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3479]! } - public var Paint_Masks: String { return self._s[3480]! } - public var Contacts_DeselectAll: String { return self._s[3481]! } - public var Username_InvalidTaken: String { return self._s[3482]! } - public var Call_StatusNoAnswer: String { return self._s[3483]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3484]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3485]! } - public var Passport_Identity_Selfie: String { return self._s[3486]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3487]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3488]! } - public var Conversation_ClearSecretHistory: String { return self._s[3489]! } - public var PeopleNearby_Description: String { return self._s[3491]! } - public var NetworkUsageSettings_Title: String { return self._s[3492]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3494]! } + public var Exceptions_AddToExceptions: String { return self._s[3470]! } + public var AccessDenied_Settings: String { return self._s[3471]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3472]! } + public var Month_ShortMay: String { return self._s[3473]! } + public var Compose_NewGroup: String { return self._s[3474]! } + public var Group_Setup_TypePrivate: String { return self._s[3476]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3478]! } + public var Appearance_ThemeDayClassic: String { return self._s[3479]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3480]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3481]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3482]! } + public var Conversation_typing: String { return self._s[3484]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3485]! } + public var Paint_Masks: String { return self._s[3486]! } + public var Contacts_DeselectAll: String { return self._s[3487]! } + public var Username_InvalidTaken: String { return self._s[3488]! } + public var Call_StatusNoAnswer: String { return self._s[3489]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3490]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3491]! } + public var Passport_Identity_Selfie: String { return self._s[3492]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3493]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3494]! } + public var Conversation_ClearSecretHistory: String { return self._s[3495]! } + public var PeopleNearby_Description: String { return self._s[3497]! } + public var NetworkUsageSettings_Title: String { return self._s[3498]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3500]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3496]!, self._r[3496]!, [_0]) + return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3497]!, self._r[3497]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3503]!, self._r[3503]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3499]! } - public var VoiceOver_Navigation_Search: String { return self._s[3500]! } - public var Map_LiveLocationTitle: String { return self._s[3501]! } - public var Login_InfoAvatarAdd: String { return self._s[3502]! } - public var Passport_Identity_FilesView: String { return self._s[3503]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3504]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3505]! } - public var VoiceOver_Chat_File: String { return self._s[3506]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3505]! } + public var VoiceOver_Navigation_Search: String { return self._s[3506]! } + public var Map_LiveLocationTitle: String { return self._s[3507]! } + public var Login_InfoAvatarAdd: String { return self._s[3508]! } + public var Passport_Identity_FilesView: String { return self._s[3509]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3510]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3511]! } + public var VoiceOver_Chat_File: String { return self._s[3512]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3507]!, self._r[3507]!, [_0]) + return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3508]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3509]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3510]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3514]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3515]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3516]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3517]!, self._r[3517]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3512]! } - public var Tour_Title2: String { return self._s[3513]! } - public var Conversation_FileOpenIn: String { return self._s[3514]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3515]! } - public var Wallpaper_Set: String { return self._s[3516]! } - public var Passport_Identity_Translations: String { return self._s[3518]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3518]! } + public var Tour_Title2: String { return self._s[3519]! } + public var Conversation_FileOpenIn: String { return self._s[3520]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3521]! } + public var Wallpaper_Set: String { return self._s[3522]! } + public var Passport_Identity_Translations: String { return self._s[3524]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3519]!, self._r[3519]!, [_0]) + return formatWithArgumentRanges(self._s[3525]!, self._r[3525]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3520]! } + public var Channel_LeaveChannel: String { return self._s[3526]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3521]!, self._r[3521]!, [_1]) + return formatWithArgumentRanges(self._s[3527]!, self._r[3527]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3523]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3524]! } - public var Passport_Email_Delete: String { return self._s[3525]! } - public var Conversation_Mute: String { return self._s[3527]! } - public var Channel_AddBotAsAdmin: String { return self._s[3528]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3530]! } - public var Channel_Management_LabelOwner: String { return self._s[3532]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3529]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3530]! } + public var Passport_Email_Delete: String { return self._s[3531]! } + public var Conversation_Mute: String { return self._s[3533]! } + public var Channel_AddBotAsAdmin: String { return self._s[3534]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3536]! } + public var Channel_Management_LabelOwner: String { return self._s[3538]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3533]!, self._r[3533]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3539]!, self._r[3539]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3534]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3535]! } - public var Common_No: String { return self._s[3536]! } - public var Weekday_Sunday: String { return self._s[3537]! } - public var Notification_Reply: String { return self._s[3538]! } - public var Conversation_ViewMessage: String { return self._s[3539]! } + public var Calls_CallTabDescription: String { return self._s[3540]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3541]! } + public var Common_No: String { return self._s[3542]! } + public var Weekday_Sunday: String { return self._s[3543]! } + public var Notification_Reply: String { return self._s[3544]! } + public var Conversation_ViewMessage: String { return self._s[3545]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3540]!, self._r[3540]!, [_0]) + return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3541]!, self._r[3541]!, [_0]) + return formatWithArgumentRanges(self._s[3547]!, self._r[3547]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3542]! } - public var Message_PinnedDocumentMessage: String { return self._s[3543]! } - public var DialogList_TabTitle: String { return self._s[3545]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3546]! } - public var Passport_FieldEmail: String { return self._s[3547]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3548]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3549]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3550]! } - public var Privacy_Calls_P2P: String { return self._s[3551]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3548]! } + public var Message_PinnedDocumentMessage: String { return self._s[3549]! } + public var DialogList_TabTitle: String { return self._s[3551]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3552]! } + public var Passport_FieldEmail: String { return self._s[3553]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3554]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3555]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3556]! } + public var Privacy_Calls_P2P: String { return self._s[3557]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3553]!, self._r[3553]!, [_0]) + return formatWithArgumentRanges(self._s[3559]!, self._r[3559]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3554]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3560]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3555]!, self._r[3555]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3556]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3557]! } - public var Passport_InfoText: String { return self._s[3558]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3559]! } + public var Stickers_ClearRecent: String { return self._s[3562]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3563]! } + public var Passport_InfoText: String { return self._s[3564]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3565]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_0]) + return formatWithArgumentRanges(self._s[3566]!, self._r[3566]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3567]!, self._r[3567]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3562]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3563]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3564]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3565]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3567]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3568]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3568]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3569]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3570]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3571]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3573]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3574]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3569]!, self._r[3569]!, [_1, _2]) - } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3571]! } - public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3573]!, self._r[3573]!, [_0]) - } - public var DialogList_Unread: String { return self._s[3574]! } - public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3576]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3577]! } - public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3578]!, self._r[3578]!, [_0]) + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3577]! } + public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3579]!, self._r[3579]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3579]! } - public var SharedMedia_CategoryMedia: String { return self._s[3580]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3581]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3582]! } - public var Watch_ChatList_Compose: String { return self._s[3583]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3584]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3585]! } - public var Watch_Microphone_Access: String { return self._s[3586]! } - public var Group_Setup_HistoryHeader: String { return self._s[3587]! } - public var Map_SetThisLocation: String { return self._s[3588]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3589]! } - public var Activity_UploadingPhoto: String { return self._s[3590]! } - public var Conversation_Edit: String { return self._s[3592]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3593]! } - public var Login_TermsOfServiceDecline: String { return self._s[3594]! } - public var Message_PinnedContactMessage: String { return self._s[3595]! } + public var DialogList_Unread: String { return self._s[3580]! } + public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_1, _2]) + } + public var User_DeletedAccount: String { return self._s[3582]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3583]! } + public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_0]) + } + public var UserInfo_NotificationsDefault: String { return self._s[3585]! } + public var SharedMedia_CategoryMedia: String { return self._s[3586]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3587]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3588]! } + public var Watch_ChatList_Compose: String { return self._s[3589]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3590]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3591]! } + public var Watch_Microphone_Access: String { return self._s[3592]! } + public var Group_Setup_HistoryHeader: String { return self._s[3593]! } + public var Map_SetThisLocation: String { return self._s[3594]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3595]! } + public var Activity_UploadingPhoto: String { return self._s[3596]! } + public var Conversation_Edit: String { return self._s[3598]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3599]! } + public var Login_TermsOfServiceDecline: String { return self._s[3600]! } + public var Message_PinnedContactMessage: String { return self._s[3601]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3596]!, self._r[3596]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3602]!, self._r[3602]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3597]!, self._r[3597]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3598]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3600]! } + public var Appearance_LargeEmoji: String { return self._s[3604]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3606]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3601]!, self._r[3601]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3602]! } - public var Message_PinnedPhotoMessage: String { return self._s[3603]! } - public var Passport_FieldPhone: String { return self._s[3604]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3605]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3606]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3608]! } - public var Conversation_Call: String { return self._s[3609]! } - public var Common_TakePhoto: String { return self._s[3611]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3612]! } - public var Channel_NotificationLoading: String { return self._s[3613]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3608]! } + public var Message_PinnedPhotoMessage: String { return self._s[3609]! } + public var Passport_FieldPhone: String { return self._s[3610]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3611]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3612]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3614]! } + public var Conversation_Call: String { return self._s[3615]! } + public var Common_TakePhoto: String { return self._s[3617]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3618]! } + public var Channel_NotificationLoading: String { return self._s[3619]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3614]!, self._r[3614]!, [_0]) + return formatWithArgumentRanges(self._s[3620]!, self._r[3620]!, [_0]) } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_0]) + return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_1]) + return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3617]! } + public var Permissions_SiriTitle_v0: String { return self._s[3623]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_0]) + return formatWithArgumentRanges(self._s[3624]!, self._r[3624]!, [_0]) } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3619]!, self._r[3619]!, [_0]) + return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3620]! } - public var Common_edit: String { return self._s[3621]! } - public var PrivacySettings_AuthSessions: String { return self._s[3622]! } - public var Month_ShortJune: String { return self._s[3623]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3624]! } - public var Call_ReportSend: String { return self._s[3625]! } - public var Watch_LastSeen_JustNow: String { return self._s[3626]! } - public var Notifications_MessageNotifications: String { return self._s[3627]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3628]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3630]! } - public var Group_Status: String { return self._s[3631]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3626]! } + public var Common_edit: String { return self._s[3627]! } + public var PrivacySettings_AuthSessions: String { return self._s[3628]! } + public var Month_ShortJune: String { return self._s[3629]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3630]! } + public var Call_ReportSend: String { return self._s[3631]! } + public var Watch_LastSeen_JustNow: String { return self._s[3632]! } + public var Notifications_MessageNotifications: String { return self._s[3633]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3634]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3636]! } + public var Group_Status: String { return self._s[3637]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3638]!, self._r[3638]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3633]! } - public var ShareMenu_ShareTo: String { return self._s[3634]! } - public var Conversation_Moderate_Ban: String { return self._s[3635]! } + public var TextFormat_AddLinkTitle: String { return self._s[3639]! } + public var ShareMenu_ShareTo: String { return self._s[3640]! } + public var Conversation_Moderate_Ban: String { return self._s[3641]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3636]!, self._r[3636]!, [_0]) - } - public var SharedMedia_ViewInChat: String { return self._s[3637]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3638]! } - public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3639]!, self._r[3639]!, [_1]) - } - public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3640]!, self._r[3640]!, [_1, _2]) - } - public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3642]!, self._r[3642]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3643]! } - public var Appearance_ReduceMotion: String { return self._s[3644]! } - public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_1, _2]) + public var SharedMedia_ViewInChat: String { return self._s[3643]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3644]! } + public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_1]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3646]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3647]! } - public var PhotoEditor_Skip: String { return self._s[3648]! } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3646]!, self._r[3646]!, [_1, _2]) + } + public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3648]!, self._r[3648]!, [_0]) + } + public var Map_OpenInHereMaps: String { return self._s[3649]! } + public var Appearance_ReduceMotion: String { return self._s[3650]! } + public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_1, _2]) + } + public var Channel_Setup_TypePublicHelp: String { return self._s[3652]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3653]! } + public var PhotoEditor_Skip: String { return self._s[3654]! } + public func SharedMedia_Photo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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 VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortSeconds(_ value: Int32) -> String { + public func MuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, _1, _2) } public func ForwardedPhotos(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } public func Call_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + public func Invitation_Members(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Conversation_StatusMembers(_ value: Int32) -> String { + public func ForwardedAudios(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedFiles(_ value: Int32) -> String { + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[20 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[21 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func ForwardedGifs(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _1, _2) } public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) } public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 36788365b1..8f72e512e1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -1203,7 +1203,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G UIPasteboard.general.string = mention })) } - actionSheet.setItemGroups([ActionSheetItemGroup(items:items), ActionSheetItemGroup(items: [ + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() }) @@ -3717,6 +3717,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return $0.withUpdatedSilentPosting(value) } }) + strongSelf.saveInterfaceState() var rect: CGRect? = strongSelf.chatDisplayNode.frameForInputPanelAccessoryButton(.silentPost(true)) if rect == nil { @@ -4074,6 +4075,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G case .slowmodeActive: text = strongSelf.presentationData.strings.Chat_SlowmodeSendError moreInfo = false + case .tooMuchScheduled: + text = strongSelf.presentationData.strings.Conversation_SendMessageErrorTooMuchScheduled + moreInfo = false } let actions: [TextAlertAction] if moreInfo { @@ -7557,7 +7561,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } private func donateIntent() { - guard case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.CloudUser else { + guard case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.CloudUser && peerId != context.account.peerId else { return } if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift index 259e46dd23..3b13ba15d7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift @@ -40,7 +40,7 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView, } var contentTypeHint: ChatMessageEntryContentType = .generic - if presentationData.largeEmoji { + if presentationData.largeEmoji, entry.message.media.isEmpty { let messageText = entry.message.text if messageText.count == 1, let _ = associatedData.animatedEmojiStickers[messageText.basicEmoji.0] { contentTypeHint = .animatedEmoji diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift index acbd7c32b2..234787ddbd 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift @@ -397,7 +397,7 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible { } } - if viewClassName == ChatMessageBubbleItemNode.self && self.presentationData.largeEmoji { + if viewClassName == ChatMessageBubbleItemNode.self && self.presentationData.largeEmoji && self.message.media.isEmpty { if self.message.text.count == 1, let _ = self.associatedData.animatedEmojiStickers[self.message.text.basicEmoji.0] { viewClassName = ChatMessageAnimatedStickerItemNode.self } else if messageIsElligibleForLargeEmoji(self.message) { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift index 3bafe6327b..04d4516392 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift @@ -109,8 +109,7 @@ final class ChatMessageNotificationItemNode: NotificationItemNode { var title: String? if let firstMessage = item.messages.first, let peer = messageMainPeer(firstMessage) { - self.avatarNode.setPeer(account: item.context.account, theme: presentationData.theme, peer: peer, emptyColor: presentationData.theme.list.mediaPlaceholderColor) - + var overrideImage: AvatarNodeImageOverride? if let channel = peer as? TelegramChannel, case .broadcast = channel.info { title = peer.displayTitle(strings: item.strings, displayOrder: item.nameDisplayOrder) } else if let author = firstMessage.author { @@ -138,10 +137,13 @@ final class ChatMessageNotificationItemNode: NotificationItemNode { if let text = title, firstMessage.flags.contains(.WasScheduled) { if let author = firstMessage.author, author.id == peer.id, author.id == item.context.account.peerId { title = presentationData.strings.ScheduledMessages_ReminderNotification + overrideImage = .savedMessagesIcon } else { title = "📅 \(text)" } } + + self.avatarNode.setPeer(account: item.context.account, theme: presentationData.theme, peer: peer, overrideImage: overrideImage, emptyColor: presentationData.theme.list.mediaPlaceholderColor) } var titleIcon: UIImage? diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 236a177a6c..21e4515c16 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -305,7 +305,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { UIPasteboard.general.string = mention })) } - actionSheet.setItemGroups([ActionSheetItemGroup(items:items), ActionSheetItemGroup(items: [ + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() }) diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift index 1102bcffc8..2a3a2ea7f5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift @@ -25,7 +25,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel private let cancelButton: HighlightableButtonNode private let doneButton: SolidRoundedButtonNode - private let pickerView: UIDatePicker + private var pickerView: UIDatePicker? private let dateFormatter: DateFormatter private var containerLayout: (ContainerViewLayout, CGFloat)? @@ -74,11 +74,6 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.doneButton = SolidRoundedButtonNode(theme: self.presentationData.theme, height: 52.0, cornerRadius: 11.0, gloss: false) - self.pickerView = UIDatePicker() - self.pickerView.timeZone = TimeZone(secondsFromGMT: 0) - self.pickerView.datePickerMode = .dateAndTime - self.pickerView.locale = localeWithStrings(self.presentationData.strings) - self.dateFormatter = DateFormatter() self.dateFormatter.timeStyle = .none self.dateFormatter.dateStyle = .short @@ -102,47 +97,59 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel self.contentContainerNode.addSubnode(self.cancelButton) self.contentContainerNode.addSubnode(self.doneButton) - self.pickerView.timeZone = TimeZone.current - self.pickerView.minuteInterval = 1 - self.pickerView.setValue(self.presentationData.theme.actionSheet.primaryTextColor, forKey: "textColor") - self.contentContainerNode.view.addSubview(self.pickerView) - self.pickerView.addTarget(self, action: #selector(self.datePickerUpdated), for: .valueChanged) - self.cancelButton.addTarget(self, action: #selector(self.cancelButtonPressed), forControlEvents: .touchUpInside) self.doneButton.pressed = { [weak self] in - if let strongSelf = self { - if strongSelf.pickerView.date < Date() { + if let strongSelf = self, let pickerView = strongSelf.pickerView { + if pickerView.date < Date() { strongSelf.updateMinimumDate() strongSelf.updateButtonTitle() - strongSelf.pickerView.layer.addShakeAnimation() + pickerView.layer.addShakeAnimation() } else { strongSelf.doneButton.isUserInteractionEnabled = false - strongSelf.completion?(Int32(strongSelf.pickerView.date.timeIntervalSince1970)) + strongSelf.completion?(Int32(pickerView.date.timeIntervalSince1970)) } } } - self.updateMinimumDate(currentTime: currentTime) + self.setupPickerView(currentTime: currentTime) self.updateButtonTitle() } + func setupPickerView(currentTime: Int32? = nil) { + var currentDate: Date? + if let pickerView = self.pickerView { + currentDate = pickerView.date + pickerView.removeFromSuperview() + } + + let pickerView = UIDatePicker() + pickerView.timeZone = TimeZone(secondsFromGMT: 0) + pickerView.datePickerMode = .dateAndTime + pickerView.locale = localeWithStrings(self.presentationData.strings) + pickerView.timeZone = TimeZone.current + pickerView.minuteInterval = 1 + pickerView.setValue(self.presentationData.theme.actionSheet.primaryTextColor, forKey: "textColor") + contentContainerNode.view.addSubview(pickerView) + pickerView.addTarget(self, action: #selector(self.datePickerUpdated), for: .valueChanged) + self.pickerView = pickerView + + self.updateMinimumDate(currentTime: currentTime) + if let currentDate = currentDate { + pickerView.date = currentDate + } + } + func updatePresentationData(_ presentationData: PresentationData) { + let previousTheme = self.presentationData.theme self.presentationData = presentationData self.contentBackgroundNode.image = generateStretchableFilledCircleImage(radius: 16.0, color: self.presentationData.theme.actionSheet.opaqueItemBackgroundColor) self.titleNode.attributedText = NSAttributedString(string: self.titleNode.attributedText?.string ?? "", font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor) - self.pickerView.setValue(self.presentationData.theme.actionSheet.primaryTextColor, forKey: "textColor") - - func updatePickerViewSubviews(_ subviews: [UIView]) { - for view in subviews { - if let label = view as? UILabel { - label.textColor = self.presentationData.theme.actionSheet.primaryTextColor - } else { - updatePickerViewSubviews(view.subviews) - } - } + + if previousTheme !== presentationData.theme, let (layout, navigationBarHeight) = self.containerLayout { + self.setupPickerView() + self.containerLayoutUpdated(layout, navigationBarHeight: navigationBarHeight, transition: .immediate) } - updatePickerViewSubviews(self.pickerView.subviews) self.cancelButton.setTitle(self.presentationData.strings.Common_Cancel, with: Font.regular(17.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal) self.doneButton.updateTheme(self.presentationData.theme) @@ -161,16 +168,16 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel let next5MinDate = calendar.date(byAdding: .minute, value: 5 - minute, to: calendar.date(from: components)!) if let date = calendar.date(byAdding: .day, value: 365, to: currentDate) { - self.pickerView.maximumDate = date + self.pickerView?.maximumDate = date } if let next1MinDate = next1MinDate, let next5MinDate = next5MinDate { let minimalTime = self.minimalTime.flatMap(Double.init) ?? 0.0 - self.pickerView.minimumDate = max(next1MinDate, Date(timeIntervalSince1970: minimalTime)) + self.pickerView?.minimumDate = max(next1MinDate, Date(timeIntervalSince1970: minimalTime)) if let currentTime = currentTime, Double(currentTime) > max(currentDate.timeIntervalSince1970, minimalTime) { - self.pickerView.date = Date(timeIntervalSince1970: Double(currentTime)) + self.pickerView?.date = Date(timeIntervalSince1970: Double(currentTime)) } else { - self.pickerView.date = next5MinDate + self.pickerView?.date = next5MinDate } } } @@ -184,9 +191,11 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel } private func updateButtonTitle() { - let calendar = Calendar(identifier: .gregorian) - let date = self.pickerView.date + guard let date = self.pickerView?.date else { + return + } + let calendar = Calendar(identifier: .gregorian) let time = stringForMessageTimestamp(timestamp: Int32(date.timeIntervalSince1970), dateTimeFormat: self.presentationData.dateTimeFormat) switch mode { case .scheduledMessages: @@ -210,7 +219,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel @objc private func datePickerUpdated() { self.updateButtonTitle() - if self.pickerView.date < Date() { + if let date = self.pickerView?.date, date < Date() { self.doneButton.alpha = 0.4 self.doneButton.isUserInteractionEnabled = false } else { @@ -321,7 +330,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel let buttonHeight = self.doneButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) transition.updateFrame(node: self.doneButton, frame: CGRect(x: buttonInset, y: contentHeight - buttonHeight - insets.bottom - 10.0, width: contentFrame.width, height: buttonHeight)) - self.pickerView.frame = CGRect(origin: CGPoint(x: 0.0, y: 54.0), size: CGSize(width: contentFrame.width, height: pickerHeight)) + self.pickerView?.frame = CGRect(origin: CGPoint(x: 0.0, y: 54.0), size: CGSize(width: contentFrame.width, height: pickerHeight)) transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame) } diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index b247f22f96..a41a783aac 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -244,31 +244,35 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur return Signal<(Data, TelegramTheme), GetThemeError> { subscriber in let disposables = DisposableSet() let mediaBox = context.sharedContext.accountManager.mediaBox - let resource = themeInfo.file.resource + let resource = themeInfo.file?.resource - disposables.add(fetchedMediaResource(mediaBox: mediaBox, reference: .standalone(resource: resource)).start()) - - let maybeFetched = mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) - |> take(1) - |> mapToSignal { maybeData -> Signal in - if maybeData.complete { - let loadedData = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) - return .single(loadedData) - } else { - return mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) - |> map { next -> Data? in - return next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) + if let resource = resource { + disposables.add(fetchedMediaResource(mediaBox: mediaBox, reference: .standalone(resource: resource)).start()) + + let maybeFetched = mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) + |> take(1) + |> mapToSignal { maybeData -> Signal in + if maybeData.complete { + let loadedData = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) + return .single(loadedData) + } else { + return mediaBox.resourceData(resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) + |> map { next -> Data? in + return next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) + } } } + + disposables.add(maybeFetched.start(next: { data in + if let data = data { + subscriber.putNext((data, themeInfo)) + subscriber.putCompletion() + } + })) + } else { + subscriber.putError(.generic) } - disposables.add(maybeFetched.start(next: { data in - if let data = data { - subscriber.putNext((data, themeInfo)) - subscriber.putCompletion() - } - })) - return disposables } } diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 6e5d162fe83c29970c3e04f4fbd124eee491007b..5ed689871f2365f750a00d08d9c7f384022922d0 100644 GIT binary patch delta 37069 zcmZTx2Y6IP*UsGJCcEi9+iSAvn}ps1gwO({KmrIzS&{_;Nj9WVm16lUARtE_6=`-w zngtaB!QN;#6qI6Dq}dztzcahp;PXF^37MHQ9a*39xYdXW%PN3TU^F)y8q&Q)h3?BZ+)Gg0rD1XfQY zV=Qbo&5kj%Idp4`$jcQ)#xhYhJ5RW@#j$T62nVy&!&Jow#8%VWERG;)wsK!npoSGlio;K-r*@XtJ<{uKF89{edk_<{k_r-Y*&Q?~(W0(GIGOHz zJuO`H)9Mhu`3Y7K-c5+Dp(BY_b|+m-%wucGoRp_f2p_0p2J$AwvAd`}$)$LT1ihV*2Q6 zZ)AMss+k!sPM>Mt~I%F&5rP|p}sz}Xd zPxGB8P{OLz80DD|TK0GvJ)4@yo~1WaZR&HPNMd94(KWv28t(%6A-gCc&B>mp(@HX( z{ws?m@bq>=mgLtBcg_MJNhC zL+cy7)%A$h5#zgiB-C|5*%$PjDT94U zCrp{@SIBFllKm-UGAFXHslaSw-%=HRe@Ao8R`xyJX*RMSXsbEhb{4W?tqp7OwKtbF z&G5P9Uo{Jx<>dX5E}32GIS3R`LTEA-S{&*HgmhH+Qz|uDwCY8K{FSY-B&wGX(#uYp zdZWgPK*&${iN#Nqr?s^i>)0J!7(XM{&WpORBp&${O9)3W{B2CPcw-E8wI-^+ zBF;dUHtV%wr3s1OsKJ_{{*J%0Y4j&H+GUMrf6|*)2m6bDuv*RkASD_WWLjvCQ6d>lyETnA+7mI`pSHVM zES<5NSUmk}cc}@;?2u#B-;t~)A(T!#%{uZqlGJ2`bUfd{jI!huddy*0(io4+V<~jX z5r-vz!QoI0jQ962Be|WCsu5WXWSx`}GuS)B)85c_jre90O?BFtnU*_ys}@LD$)1!# zA376ER)mBOEr)XP%=EfTeNAniTDg90#L_L8sJ8Tc=A?>rJ4>hL^h`AaS?uC->ACbc z)rF95tv8uIPmj`PA|U#_roPeZ-w8@&=VlYju(BMoXXsci^~p$Qc{DX6N6m-4fvWnZ zMpw7j)}jfbv2NOtk=nNaN%5j#*q%yf`FyS35~*K>L=n;w@vj(K3}0J)(@c!8cb;GG zb|L1x&1;>u8ZF}ZU2eZ-=vDl?k(rpcKW)`zak z%vAfL_zdzjnd$Y+IHez>WjCbJxy)p>7zu7F^rVqF%cAy2$iYXqVwR4}N>T?PXrQ>q z^}Mkw)36d+lVxC~v?a^Q2Gijzr!s_*?-?Dfv8bKXX($=9^Vo12p509;!*ttk;D>Ht zT5ZRkF@m1Vwy{z4Znl$^(}nEr)(TY9@$K&FHcwl7>v&JS=mOC*l~kIO&8ny|CtV#4 zNf!n>nXbJjDsGUktu1)tmHO)BO0PjSD-HPAstM@v zanwIITb+RDB-+@VLX}~vIuRi~FYJjKzA-nNO`@lA?QAj~%FQ)RMUq(O!GQ^`ooS5N zb2jRpm&B%1SzZRKC0|~;Qpadbc^W;HmjLLrFE5wPpda$Ou$g4ece7bED&MHoGk%~N z{k$|k#V{M?3&2r2%Ue6g*WTu?fYue?K8LpDXR`+SB;Uyz=^y-VBAYvp`Ka8Tr#2&7 zJWmK?Nm9SeWxQY`CiF{gt=fVln}AnI{QT2Q6I0=xUxBS&E`oNtCsWz&w|vZ%7FM!64zn*>!B z|8gWP?y6*+$*EVhAk-E8Vc$eFpP zi5a7+XL(xWtk{G}_kGemB`k`TcT2KuhKTqgnJzFzO?`9cPV^w->>;M7gWa@1SI4@U zm50%|$AK+kx|`KUkT;3%c!Z^9;jfTK@hc7gj)xX%_B5m0hP1T!TCmd$^|kx^?{SQJ z3Qg^v%$}gO?sg!o<-K&Yt$UKX1(_{kIwsTc?g{KE`mwu7-HJ#j%^hsy@$X=wxO-^X zHtN;G#kSMb9_i*CNETgM-Bw>a$Jv|g17ZInYi*3oYqo;smdwZrSFEPG-ICh(} zJ!8`LAYGgo^>4VVzBeM0)1uPrYH%~dnsAzZ|HNBrqyZc4~p}o=9 z3WWAeU%Pr7h3M$tN&bEL1m*Q}u+ONnpM`x+P5qqeNtr%jt5E{pQwZftq)%~QsC2Af z8t~eMeh&2v5>kovP1TI@W0NnaTe02rC8EWi9Mqtrd^4fw5EJqh;D;GVZgp`+?{6R` z4v>MxATgWR5acHMZJ-RH@Q38Us^RB>1jNnI~M=Jk_Z+-AC+V(8ij0oO;J@S zQ|e%?Ld}OQe3J+2rD9Mti=;_|GSw(#O`*~5q^RKD7o+ff>C7S_rz)BgONRz!u{ipD zkPS#sS87ud6go3IjedSkcTXG(V~NyMnmRZMMRjW6AWDPE5rw3Rituk$i*E*WnR`f6 zZOg*uHk=YidZm(2gFrkb3{H}D>gaT79uBuLgB^g2g@gMkCWTkMhZ9WYV3qD1oT6GG zZ{w%CFk?cXE;*ZQh<5O!J6MJ+$4+cWPsO3o(L|l5b&hC>Q;{c=BN;qXzcKV3iE#0Jp)!;Kj9UBey55|kmpMMp=MwAao5tscvLvb~i&BQjs_xOVu!OSG248#K;FkJ%@|%V#a%(=> zm&L@Dx3_ugF!TMZbQnETmI?TGqO6NjrchOHU3hoQ@{kdfKf=mJQuzoAz+b}%H^ASz z5jIvqdqy}|C7nWi75zKH#72{Gq)i=zreukY1E)hx%qUN5Tea6KnSyF+9;s7nkZzP5 zK~%M`c1~+|(G%ln$H-o6JbgbhN4*9D7H*4XrpO_Uo_aaCCQ$!T-JKJWA|_x5+>&Z0 zIISlk)yDVYv`X7X#j$H?-zcLx8Ie#YICiewrjZk7%G&aLWvagm{U~!9Rg|Zx9!P>W z7^IIL?`xSe)FU{lkmzHUj&%7~KK+jQQ(%FqPcT65QyA5M>;Ow3slL=UPYD}i_ zRum==^MbrA9bQs1b<~id;^Yu=8`-N}=G&1jI%{lmou|#~_WuLo6j327sIIy@TS@m< zTh!H%E0hy=@*7&3Wk_Oc=+|nSx)$+iJg)~c$oWImyC#F(O;c;k>>j$lrl-OcekKhK ze!C`t-AgBG?Cd_eTvNmzpn|b_ww}tyy4Xf)9-GNF(Y<5MY%}c|>r@{^u|`lorid9c zL{lEZT&4Y`TYo0j>}??(t>do_84*e4XSKhUjVs(#tEv-HogGZt!liL zZKdY%>FPEVmBmeFX5br!0BwjK*-med&tg01r}2)`ok*8^wwzsKJmTCItn6tdiWxA> z+vIJjul2*pa$k$LLxVm80VBnKXwY_?t2{( zXZz{+1UJCl=~6($^^uf0G1l@ba)}YXiVY8b$m@Pp)!gDde1-!j4n#$wuXb;yv48Ooeu22BSoM2%A-)i053;@fvK zqjqSEPo9syqD@om%GYv@C$>qT@eQQJVMAbV+W2ak`W+(dJij-yjvC`_^~$yUJ>tX! z@*mf#X8GED?Ogm?qHT7*0iTq4^ zrrDHV{5!rlg9`3h4Ark|J-O^R%Jbx~-)X!jll?(UJw{M@>pWS8zfjE8`?35ck?U{z z+~ZRJL9$KIW$}KH5S)RRY4r4b_Af1+?gpo~ZF-&(5-Jpi!Qp9G*xV|&bQT&C5`m(` z1j3IfH55^SZ7^6=81=8sP}EQXRcKLdbXqus1g;M#QlHc$+E58JcGM;T3BFdFu0)6O zxtUBKDL+02SzNsTCoCg4@nh-bMW)E$(8ZCb&I};9w9cp|Ksuc^t#`n7(CC$innXlp z(6WPO`mrt!i{qavj4idWE*W#{h0k6~Kk?CnjPeOX|Ofj@% z^wdG^;DjVh(9;dx3}}zXy;(qpN4*(}DU?`cCRt}hD&|mLWx~d@X0?_^%}54Z^vuXp ztf9h?l0*mJiKM4yq$##ge)JP8w&OG6K^mT&VYWC>r`$^YJ5Fhf7kdHP5aL9Fg-%W| zMh$5aGe*Q^(5RU%V-`~WLmmOyE|6WAO?S)`6ynyIJwPFTHPfc#`G>?fD_YG*HkdTt z0y9%G9o(`guz*I-$^%$jGAmsv3Z*Nmj`qw-HFbfg+y*_uXcQdfuCj!I9|}85`}En~ zTFF~>qon#w(1(5N9Uu;;)Mr@wKu%~Kc?K>YQe9m#Y{=BA%2A_)uIo#i>urW&h=}*;+Fhx{Wi0}aVw?4x#5V2SFQ0F=vM8&h6U=KaBv%wy&nC;3K3Q;k@ zSLs_Z%t71ZFr+&Igu6Co@KsB31f8DUO&y8!e9ji3^Co|+RmwxD=ns8_L@yPgwEP2O zW{uZBRVpFrM|_gGDQjwL@pX1o744kULm3mwugt<=|2rpMsSf4#VKBCg@isTep{k*R zh9WkWJPl4Zj&5#9SH_3Z#-TQPw;`5YL&uRgfub9;)QPCcL`AL1RNfe;ObVqV>yo+c zGn}HXYm8T}4JF%C#{7=XoeW{o0au-9(YfB1j^p7Jq+7+&1!P5If-*If4_Gg4Ge%{a ze=bjJiew&|)6_$q4%t*1eOFR+XP4K?!L&fLJzPIvqinnB^oTHsU=&z zPSnkpyM%$R7$)F3EwSnnAt*F$W@Qt0;SxV4UW!<;T!ji9T;GCKgQKV1`j*q)mO_BY z^DP#D$e30u;A4KP9q_TT)ur4LDlJ^Jx-|}l-;IdBjSjS?vD@j>Rwtn0<<=}^RVYum zA9%UAEnZnI2QaEj5VWtM_w$#*WqlVVw-*374sI_{ z??q!Rv}Q>%t!z&KT-?y^Qtl588oE!l$Afgd*lqxZjGC9Nu7|kO&(NKGKO#BMj~&2k z15zEJFpX=+gr`?Ew6}_(--t+|TVPad@sE2~ghDnUIv-3!MgdeyYi&#YbZ?97q=%6p zlyYf9ee-mmr=?EPdBHvI5n}Vr0H4}lGvpa7KN3CKK4 z|1QW;ccCzAhh;gu6bF)-;wzs=wA2q0!{U<~>)ZTDR#fr=QUxyTpd>o%q9W}@TD8y$ zVsYETbmgT`KVCh*PzxOT$3ll;FLGX`3_C4$`>5NZOhC~CU?!UvrRw)XP{7+xboZM{AqM zzj3@p%NCo!KdxV#tG)xlw6*T!xN>jXET7bt?;jEQ?V^&j6iX?*=-Zc)g2#M9Z)5 zqJ9ji;E|q>%3&Ib!j6T~=mCbchoUKNiGZs5C7IwPOO|8+qRw2B4i<7Het%9oml$Ch zKDeZt^)w0+!&T+=H8*%G;OQ|PUK$++rZZ$)+Ex8hHge}o6J6P)(!!;2ny(P!MlOD7 z2?Kk&G*S6FlsCVK^>}<~wDJwsrXI)gBezDyb#CF`Ay3+!Yf>n8nO6Be6h`k<-aLY7 zy5SI8586W*YQzNkLCE3X;Qr;7jvdlM5a5b_4CU*?m_DLV$e;7?-s_j8vh(!pGN*C@ zov=|C(NiQ|4CSA3==s#;dT@?~%L~9cPFtQ1&hh5uncy6^F7FC-d1iUK@_VQ_KkLbM zLo_gE{taD$F+De!K{+nHA&>n-Pu*Z+m+9aQPTwrI$L|Dc=9u6&$Dm`E+}uY^K_y11fZ|FT=6e>liVngTW9K@3 zb5Au5$qr&|Y1H+9iTJFc|Fhc+h!ZDS_{g-)a^oCX(moTcyU1ijl9QLUG1Khw`q~y> zvq1hL!Gr{HXpj~WY!~pLaSv&1Zd=%)>dXNFvD~E4DDYbT6PJJ8Ss)+*u~Z0wt-&sG zNuwIsZqX`^uz-~)A~MLSWl-fUIjReSCSIigc@3|xtMk)VnPEJ?CrgX<*0%VMHd&AY zgLNGaAg6ALQgaZr@&k*3Kb2dPfN4^1wW)ccB(XUy95>uv2*&X+ zewVCWk*jP7316`bMQD_pFMF0RO9 zBgnk63)sS{mHA)`m#h>#;l`B(;0X_}%vMH+tyOf1qr~}GEWnO~_ZUjQBjcKCR4F!a zp{4)J?A0Je?oHq-CDD(;@s`L9UbJN_l7&_&k!JhB-llqQU8hzVN1N}ktK%V~=T#5j zxG%C?gP@%@=+h{4Rf2IMLZW72u?P@E0UP!tDp+NLG1LQD*i5gQ5hcwnetNc@;@7&=1&~PR14;l<$E}T57a?epHvj!6!>)G5 zT1>0g7QyU%U~RT?eVCtNxw6)vEM9hdr=k&QbowqW*t{R^G6JWC z-|YfU%fGt_o;6eN&QtCR6KB_mW~rL)rl;=CQSJ>B2XuXOm9M$h*U}{VAC%tR4%mZj z_c+ycqM-qAhE(+dgfgX{;HrDll=Wfa0HYn$&@MIF2733N46uKf?#WU&LD0ynrn1x+ zC3HMsT_Z8i%2j4gH zUaRs{m^|5s%euDGihB#xZKwqXpSzM`gB$C1MCA)sjsCt@uj~k;(_>O8@4k4Tt>XK# zj87w3*i!va5l4q2(X3|>D{N9Je9N;e1u$&OeHQi{y>p*U*@Z!aX*zOP1N^6i?DG_N zf4cbv0IYtvKg+rw z0%Ae?AyEejJq#K{RCa)h))`^gEnjB`!1AptVz1NYb@}WKI=rp`?B11i8SE{}c)+HA z8|C=9M|r9V_Q$(4<$)~qJ)~v}b1*&lfL=X_kO6&^948zOs(f(N5|teSPU?}y_dkS{ zapi#+V5*q)-QajPXnm1-6j@9#@))({o+f$Pe4idzpQC<=_)K9|By~d)47mCYHg=5q zY{&&hnz6yDev0&b3B$H+NLG%A@gw_~B~o_!2_)rWGdJ^fU9ekMd=&{4W!+c^6jim+ z0u<%jn693JkYpH4H05Ir?6-S2c300J(n`zX9a7(XL6%KL@Vu+ql&gG&In@_^Jsc-6 zzw-W?Hf*x8Z)o2p;e&Tztqo91t9%zG9TmyCSqoci_GYtsR+hQ9+@TeU=|_ZI(&Nbb zbWCQjGtVJf;Mbt(S02#={yOLBz~)>~bmum^^cNxM9}VFIS5jA3mLDuRBr#LmopchW$)<<%nL>vicCb*o^l*_9rcz3~ zGakUx(@-xzA{-^S_~vPFWn1(}ByifzkJzD=AA7{1YLS#nl`mT9+#^XqZR}Ai=7IfD zyArL^>G(97^k|wAqw>>}m^remXiY3~SZH~6TAUxUbU>vzI`C*7;N1B~vy=pt@0<3wm20x25m09PqxG>1*+H# zXw{Z*XCZP)Skc@(ws~d?7LR*Ods9;Y8FWFaNxE)Eb`UCEW!{MC()+DD{k_ErqR#qM zy3$MayGh#iM5GH|UCg51$S*NRhtD9$Lcd={AC>Is79RgTi(D!s`$1BCHO%OO=Jhny z!M|{RKr13Xq&Ohp_xO@_2du8E4x0TTAn;R%CWTIJgon5A@)i{gK(ZLZtIx3h<&9Mk zGLQS z*Mc7WW4i-3XyXnin85)%9JUEam;EM>Fmkq`89@v@iI(rkg`Iipj(l}8L=A$_iS^%K z2+Wcx_{4nRMYc05qKo*ZX{z6H(Y`YY{2!vjisd*l;3 zHHq~WGzf`x72IZ)AT>Y)UYv$eT>4yudIRDzI~YR^ZFw$Mxl!c@>Y2QaBBtX_kmxF% z#D9Ly1^j5(WdQBheHUmym6yQtgh#GnF+sPGTWQrU3qa-8T~2_?qr0-y6)3wb0U8D_=?hNBH1NE^vfzzhnVw{q80B7m9T0sZaJjsp_)` zn)zy#rNI8?onP4`ixV|GN1i=d>hm&P@aLV|&kOX-9v3*k<9n>?OGwxAWj^NTQTC8^ zuS?yFNL+nd55LL1v1}hT?afzTMjU|3SUtUnxc&6jUWa->6fRr`VkKl1wZ4KVfAjP9 zrGNq)v@c6}OYOW0BK*cf-li4%vMujGR7{ZI!57*)*!p+r{e9``dk_&spQ}`?E0OgO zV#K%wSBvQ9Rz!pxMv6GP2Q~mvYO8x}({w>Riu5B?_p(Dh3Mr`pxYfwic!^;AzP#_t zl)dj5=*Y{_uvLHlvanUh@6Q7pSiHY00PWoURsh;N_uHJGKvwKc9d17El2Jb4MbPLi znJJgUr>elubasCtNWp*iXRs5Le!!)Cruu!ogr`O8fdut)lq1o%K!4#K-rgr^%K?{q z3TdtmXTF%=ZhKm#Gm4%puOz~ZUG$0xXt&~(EcO-6f29CkiI2Tv0m6Ob6^HVz3Ys#B zD&LMG&8rExZen;f4=#tpUNr;edSA_EXKD4TnYJHMjZpT|iuM29XV1~|uUgde5DGG( zbote27@i|vvnrQVzI+G>AaS>->@}VGll&gx|F!tFXt02{zLo_RaOZ0UK&)q8bAbia zylw?p&3fGo{%`2(F7SVii1~}|z~6t z1X{59jc#fP*jU@$24;#EOsaccp%`Tak$$vG=ibmNq2c2ApGI+ST9mMGbVxFlzKMaS zsc)tLdbYo52T{o1EK(zpFJ0^f2Kx5R1YplU-*l)kh|CdZO6vNSMU6$s&pKZOLT!I5 z4%FezZ)E{%ZhNaIsKamGN>>v_F_MXLza5Q^Df&7YBao~nBi_i17Q-@j{o65W3WCYB ze?)ThpfQ6)vr`e_;0a?vBEI!@yqbm}Skk#^or_i{%Yy3%UlYv)k`^;3^Brrk5wda_ z`Tcxg4I77<4E$_rI2fg@CSK!cd@7R>|aBiE7 zrl!A}sAPmw!W&MS^sbh<$opBM)_zW1VF7=GtH8|y-6@w+QUA2h<3FzcXQ?G7oI>~_yV z13U|_JD6kYg*ZX0O33tInyfcn`PM+69n>g�Z0#PwCwk;^Mpidz2Q37V+KvkSfd^ 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%0Df~!=lI=PjKU)EP6oc&kYsfsV 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 ZS80V6Do$ac+VWC(QI1Y3dKPJ6{|A|KhFAaq delta 37066 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 B=L-M; diff --git a/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift b/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift index 941a8337be..c4448b12d0 100644 --- a/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift @@ -112,7 +112,7 @@ final class WebpagePreviewAccessoryPanelNode: AccessoryPanelNode { if content.type == "telegram_background" { text = strings.Message_Wallpaper } else if content.type == "telegram_theme" { - text = strings.Message_Wallpaper + text = strings.Message_Theme } else { text = stringForMediaKind(mediaKind, strings: self.strings).0 } diff --git a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index 0e48b1ffc8..8f51a0fccb 100644 --- a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -379,7 +379,9 @@ public struct PresentationThemeSettings: PreferencesEntry { case let .local(theme): resources.append(theme.resource.id) case let .cloud(theme): - resources.append(theme.file.resource.id) + if let file = theme.file { + resources.append(file.resource.id) + } } return resources } diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index 68ffe38e60..99801b909c 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -643,15 +643,11 @@ public func themeImage(account: Account, accountManager: AccountManager, fileRef } else { theme = nil } - return { arguments in let context = DrawingContext(size: arguments.drawingSize, scale: 0.0, clear: true) - let drawingRect = arguments.drawingRect - context.withFlippedContext { c in c.setBlendMode(.normal) - if let theme = theme { if case let .color(value) = theme.chat.defaultWallpaper { c.setFillColor(UIColor(rgb: UInt32(bitPattern: value)).cgColor) @@ -693,22 +689,38 @@ public func themeImage(account: Account, accountManager: AccountManager, fileRef if let microphone = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/IconMicrophone"), color: theme.chat.inputPanel.panelControlColor), let image = microphone.cgImage { c.draw(image, in: CGRect(origin: CGPoint(x: drawingRect.width - 3.0 - 29.0, y: 7.0 + UIScreenPixel), size: microphone.size.fitted(CGSize(width: 30.0, height: 30.0)))) } - } else if let emptyColor = arguments.emptyColor { - c.setFillColor(emptyColor.cgColor) - c.fill(drawingRect) - } - - if let emptyColor = arguments.emptyColor { - c.setStrokeColor(emptyColor.cgColor) + + c.saveGState() + c.setFillColor(theme.chat.message.incoming.bubble.withoutWallpaper.fill.cgColor) + c.setStrokeColor(theme.chat.message.incoming.bubble.withoutWallpaper.stroke.cgColor) + c.translateBy(x: 5.0, y: 65.0) + c.translateBy(x: 114.0, y: 32.0) + c.scaleBy(x: 1.0, y: -1.0) + c.translateBy(x: -114.0, y: -32.0) + let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 Z") + c.restoreGState() + + c.saveGState() + c.setFillColor(theme.chat.message.outgoing.bubble.withoutWallpaper.fill.cgColor) + c.setStrokeColor(theme.chat.message.outgoing.bubble.withoutWallpaper.stroke.cgColor) + c.translateBy(x: drawingRect.width - 114.0 - 5.0, y: 25.0) + c.translateBy(x: 114.0, y: 32.0) + c.scaleBy(x: -1.0, y: -1.0) + c.translateBy(x: 0, y: -32.0) + let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 Z") + c.restoreGState() + + c.setStrokeColor(theme.rootController.navigationBar.separatorColor.cgColor) c.setLineWidth(2.0) let borderPath = UIBezierPath(roundedRect: drawingRect, cornerRadius: 4.0) c.addPath(borderPath.cgPath) c.drawPath(using: .stroke) + } else if let emptyColor = arguments.emptyColor { + c.setFillColor(emptyColor.cgColor) + c.fill(drawingRect) } } - addCorners(context, arguments: arguments) - return context } } From 8fbf2a0ef4b634b6cd5a1e91912f0e3d5f442bf7 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 22:57:36 +0400 Subject: [PATCH 57/86] Merge --- NotificationService/AccountData.swift | 66 -- NotificationService/Api0.swift | 834 ------------------ NotificationService/Data.swift | 31 - NotificationService/ImageData.swift | 180 ---- NotificationService/ManagedFile.swift | 86 -- NotificationService/NotificationService.swift | 538 ----------- NotificationService/ReadBuffer.swift | 310 ------- NotificationService/Serialization.m | 2 +- NotificationService/Serialization.swift | 46 - Telegram-iOS.xcodeproj/project.pbxproj | 16 - submodules/TelegramApi/Sources/Api0.swift | 18 +- submodules/TelegramApi/Sources/Api1.swift | 278 +----- submodules/TelegramApi/Sources/Api3.swift | 137 +-- .../AccountIntermediateState.swift | 8 +- .../AccountStateManagementUtils.swift | 10 +- .../TelegramCore/ApplyUpdateMessage.swift | 2 +- .../TelegramCore/MessageReactionList.swift | 4 +- .../TelegramCore/MessageReactions.swift | 5 +- .../ReactionsMessageAttribute.swift | 8 +- .../TelegramCore/Serialization.swift | 2 +- .../TelegramCore/StoreMessage_Telegram.swift | 12 +- .../TelegramCore/UpdateMessageService.swift | 4 +- .../TelegramCore/UpdatesApiUtils.swift | 8 +- 23 files changed, 122 insertions(+), 2483 deletions(-) delete mode 100644 NotificationService/AccountData.swift delete mode 100644 NotificationService/Api0.swift delete mode 100644 NotificationService/Data.swift delete mode 100644 NotificationService/ImageData.swift delete mode 100644 NotificationService/ManagedFile.swift delete mode 100644 NotificationService/NotificationService.swift delete mode 100644 NotificationService/ReadBuffer.swift delete mode 100644 NotificationService/Serialization.swift diff --git a/NotificationService/AccountData.swift b/NotificationService/AccountData.swift deleted file mode 100644 index 4ad9583d1b..0000000000 --- a/NotificationService/AccountData.swift +++ /dev/null @@ -1,66 +0,0 @@ -import Foundation -import CommonCrypto -import LightweightAccountData - -private func sha256Digest(_ data: Data) -> Data { - let length = data.count - return data.withUnsafeBytes { (bytes: UnsafePointer) -> Data in - var result = Data(count: Int(CC_SHA256_DIGEST_LENGTH)) - result.withUnsafeMutableBytes { (destBytes: UnsafeMutablePointer) -> Void in - CC_SHA256(bytes, UInt32(length), destBytes) - } - return result - } -} - -func decryptedNotificationPayload(accounts: [StoredAccountInfo], data: Data) -> (StoredAccountInfo, [AnyHashable: Any])? { - if data.count < 8 + 16 { - return nil - } - - for account in accounts { - let notificationKey = account.notificationKey - - if data.subdata(in: 0 ..< 8) != notificationKey.id { - continue - } - - let x = 8 - let msgKey = data.subdata(in: 8 ..< (8 + 16)) - let rawData = data.subdata(in: (8 + 16) ..< data.count) - let sha256_a = sha256Digest(msgKey + notificationKey.data.subdata(in: x ..< (x + 36))) - let sha256_b = sha256Digest(notificationKey.data.subdata(in: (40 + x) ..< (40 + x + 36)) + msgKey) - let aesKey = sha256_a.subdata(in: 0 ..< 8) + sha256_b.subdata(in: 8 ..< (8 + 16)) + sha256_a.subdata(in: 24 ..< (24 + 8)) - let aesIv = sha256_b.subdata(in: 0 ..< 8) + sha256_a.subdata(in: 8 ..< (8 + 16)) + sha256_b.subdata(in: 24 ..< (24 + 8)) - - guard let data = MTAesDecrypt(rawData, aesKey, aesIv), data.count > 4 else { - return nil - } - - var dataLength: Int32 = 0 - data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in - memcpy(&dataLength, bytes, 4) - } - - if dataLength < 0 || dataLength > data.count - 4 { - return nil - } - - let checkMsgKeyLarge = sha256Digest(notificationKey.data.subdata(in: (88 + x) ..< (88 + x + 32)) + data) - let checkMsgKey = checkMsgKeyLarge.subdata(in: 8 ..< (8 + 16)) - - if checkMsgKey != msgKey { - return nil - } - - let contentData = data.subdata(in: 4 ..< (4 + Int(dataLength))) - guard let result = try? JSONSerialization.jsonObject(with: contentData, options: []) else { - return nil - } - guard let dict = result as? [AnyHashable: Any] else { - return nil - } - return (account, dict) - } - return nil -} diff --git a/NotificationService/Api0.swift b/NotificationService/Api0.swift deleted file mode 100644 index b7debd8831..0000000000 --- a/NotificationService/Api0.swift +++ /dev/null @@ -1,834 +0,0 @@ - -fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { - var dict: [Int32 : (BufferReader) -> Any?] = [:] - dict[-1471112230] = { return $0.readInt32() } - dict[570911930] = { return $0.readInt64() } - dict[571523412] = { return $0.readDouble() } - dict[-1255641564] = { return parseString($0) } - dict[590459437] = { return Api.Photo.parse_photoEmpty($0) } - dict[-797637467] = { return Api.Photo.parse_photo($0) } - dict[236446268] = { return Api.PhotoSize.parse_photoSizeEmpty($0) } - dict[2009052699] = { return Api.PhotoSize.parse_photoSize($0) } - dict[-374917894] = { return Api.PhotoSize.parse_photoCachedSize($0) } - dict[-525288402] = { return Api.PhotoSize.parse_photoStrippedSize($0) } - dict[-1132476723] = { return Api.FileLocation.parse_fileLocationToBeDeprecated($0) } - dict[1815593308] = { return Api.DocumentAttribute.parse_documentAttributeImageSize($0) } - dict[297109817] = { return Api.DocumentAttribute.parse_documentAttributeAnimated($0) } - dict[1662637586] = { return Api.DocumentAttribute.parse_documentAttributeSticker($0) } - dict[250621158] = { return Api.DocumentAttribute.parse_documentAttributeVideo($0) } - dict[-1739392570] = { return Api.DocumentAttribute.parse_documentAttributeAudio($0) } - dict[358154344] = { return Api.DocumentAttribute.parse_documentAttributeFilename($0) } - dict[-1744710921] = { return Api.DocumentAttribute.parse_documentAttributeHasStickers($0) } - dict[-4838507] = { return Api.InputStickerSet.parse_inputStickerSetEmpty($0) } - dict[-1645763991] = { return Api.InputStickerSet.parse_inputStickerSetID($0) } - dict[-2044933984] = { return Api.InputStickerSet.parse_inputStickerSetShortName($0) } - dict[1075322878] = { return Api.InputFileLocation.parse_inputPhotoFileLocation($0) } - dict[-1160743548] = { return Api.InputFileLocation.parse_inputDocumentFileLocation($0) } - dict[-1361650766] = { return Api.MaskCoords.parse_maskCoords($0) } - dict[-1683841855] = { return Api.Document.parse_document($0) } - return dict -}() - -public struct Api { - public static func parse(_ buffer: Buffer) -> Any? { - let reader = BufferReader(buffer) - if let signature = reader.readInt32() { - return parse(reader, signature: signature) - } - return nil - } - - public static func parse(_ reader: BufferReader, signature: Int32) -> Any? { - if let parser = parsers[signature] { - return parser(reader) - } - else { - telegramApiLog("Type constructor \(String(signature, radix: 16, uppercase: false)) not found") - return nil - } - } - - public static func parseVector(_ reader: BufferReader, elementSignature: Int32, elementType: T.Type) -> [T]? { - if let count = reader.readInt32() { - var array = [T]() - var i: Int32 = 0 - while i < count { - var signature = elementSignature - if elementSignature == 0 { - if let unboxedSignature = reader.readInt32() { - signature = unboxedSignature - } - else { - return nil - } - } - if elementType == Buffer.self { - if let item = parseBytes(reader) as? T { - array.append(item) - } else { - return nil - } - } else { - if let item = Api.parse(reader, signature: signature) as? T { - array.append(item) - } - else { - return nil - } - } - i += 1 - } - return array - } - return nil - } - - public static func serializeObject(_ object: Any, buffer: Buffer, boxed: Swift.Bool) { - switch object { - case let _1 as Api.Photo: - _1.serialize(buffer, boxed) - case let _1 as Api.PhotoSize: - _1.serialize(buffer, boxed) - case let _1 as Api.FileLocation: - _1.serialize(buffer, boxed) - case let _1 as Api.DocumentAttribute: - _1.serialize(buffer, boxed) - case let _1 as Api.InputStickerSet: - _1.serialize(buffer, boxed) - case let _1 as Api.InputFileLocation: - _1.serialize(buffer, boxed) - case let _1 as Api.MaskCoords: - _1.serialize(buffer, boxed) - case let _1 as Api.Document: - _1.serialize(buffer, boxed) - default: - break - } - } - -} -public extension Api { - public enum Photo: TypeConstructorDescription { - case photoEmpty(id: Int64) - case photo(flags: Int32, id: Int64, accessHash: Int64, fileReference: Buffer, date: Int32, sizes: [Api.PhotoSize], dcId: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .photoEmpty(let id): - if boxed { - buffer.appendInt32(590459437) - } - serializeInt64(id, buffer: buffer, boxed: false) - break - case .photo(let flags, let id, let accessHash, let fileReference, let date, let sizes, let dcId): - if boxed { - buffer.appendInt32(-797637467) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt64(id, buffer: buffer, boxed: false) - serializeInt64(accessHash, buffer: buffer, boxed: false) - serializeBytes(fileReference, buffer: buffer, boxed: false) - serializeInt32(date, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(sizes.count)) - for item in sizes { - item.serialize(buffer, true) - } - serializeInt32(dcId, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .photoEmpty(let id): - return ("photoEmpty", [("id", id)]) - case .photo(let flags, let id, let accessHash, let fileReference, let date, let sizes, let dcId): - return ("photo", [("flags", flags), ("id", id), ("accessHash", accessHash), ("fileReference", fileReference), ("date", date), ("sizes", sizes), ("dcId", dcId)]) - } - } - - public static func parse_photoEmpty(_ reader: BufferReader) -> Photo? { - var _1: Int64? - _1 = reader.readInt64() - let _c1 = _1 != nil - if _c1 { - return Api.Photo.photoEmpty(id: _1!) - } - else { - return nil - } - } - public static func parse_photo(_ reader: BufferReader) -> Photo? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int64? - _2 = reader.readInt64() - var _3: Int64? - _3 = reader.readInt64() - var _4: Buffer? - _4 = parseBytes(reader) - var _5: Int32? - _5 = reader.readInt32() - var _6: [Api.PhotoSize]? - if let _ = reader.readInt32() { - _6 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PhotoSize.self) - } - var _7: Int32? - _7 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - let _c5 = _5 != nil - let _c6 = _6 != nil - let _c7 = _7 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 { - return Api.Photo.photo(flags: _1!, id: _2!, accessHash: _3!, fileReference: _4!, date: _5!, sizes: _6!, dcId: _7!) - } - else { - return nil - } - } - - } - public enum PhotoSize: TypeConstructorDescription { - case photoSizeEmpty(type: String) - case photoSize(type: String, location: Api.FileLocation, w: Int32, h: Int32, size: Int32) - case photoCachedSize(type: String, location: Api.FileLocation, w: Int32, h: Int32, bytes: Buffer) - case photoStrippedSize(type: String, bytes: Buffer) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .photoSizeEmpty(let type): - if boxed { - buffer.appendInt32(236446268) - } - serializeString(type, buffer: buffer, boxed: false) - break - case .photoSize(let type, let location, let w, let h, let size): - if boxed { - buffer.appendInt32(2009052699) - } - serializeString(type, buffer: buffer, boxed: false) - location.serialize(buffer, true) - serializeInt32(w, buffer: buffer, boxed: false) - serializeInt32(h, buffer: buffer, boxed: false) - serializeInt32(size, buffer: buffer, boxed: false) - break - case .photoCachedSize(let type, let location, let w, let h, let bytes): - if boxed { - buffer.appendInt32(-374917894) - } - serializeString(type, buffer: buffer, boxed: false) - location.serialize(buffer, true) - serializeInt32(w, buffer: buffer, boxed: false) - serializeInt32(h, buffer: buffer, boxed: false) - serializeBytes(bytes, buffer: buffer, boxed: false) - break - case .photoStrippedSize(let type, let bytes): - if boxed { - buffer.appendInt32(-525288402) - } - serializeString(type, buffer: buffer, boxed: false) - serializeBytes(bytes, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .photoSizeEmpty(let type): - return ("photoSizeEmpty", [("type", type)]) - case .photoSize(let type, let location, let w, let h, let size): - return ("photoSize", [("type", type), ("location", location), ("w", w), ("h", h), ("size", size)]) - case .photoCachedSize(let type, let location, let w, let h, let bytes): - return ("photoCachedSize", [("type", type), ("location", location), ("w", w), ("h", h), ("bytes", bytes)]) - case .photoStrippedSize(let type, let bytes): - return ("photoStrippedSize", [("type", type), ("bytes", bytes)]) - } - } - - public static func parse_photoSizeEmpty(_ reader: BufferReader) -> PhotoSize? { - var _1: String? - _1 = parseString(reader) - let _c1 = _1 != nil - if _c1 { - return Api.PhotoSize.photoSizeEmpty(type: _1!) - } - else { - return nil - } - } - public static func parse_photoSize(_ reader: BufferReader) -> PhotoSize? { - var _1: String? - _1 = parseString(reader) - var _2: Api.FileLocation? - if let signature = reader.readInt32() { - _2 = Api.parse(reader, signature: signature) as? Api.FileLocation - } - var _3: Int32? - _3 = reader.readInt32() - var _4: Int32? - _4 = reader.readInt32() - var _5: Int32? - _5 = 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.PhotoSize.photoSize(type: _1!, location: _2!, w: _3!, h: _4!, size: _5!) - } - else { - return nil - } - } - public static func parse_photoCachedSize(_ reader: BufferReader) -> PhotoSize? { - var _1: String? - _1 = parseString(reader) - var _2: Api.FileLocation? - if let signature = reader.readInt32() { - _2 = Api.parse(reader, signature: signature) as? Api.FileLocation - } - var _3: Int32? - _3 = reader.readInt32() - var _4: Int32? - _4 = reader.readInt32() - var _5: Buffer? - _5 = parseBytes(reader) - 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.PhotoSize.photoCachedSize(type: _1!, location: _2!, w: _3!, h: _4!, bytes: _5!) - } - else { - return nil - } - } - public static func parse_photoStrippedSize(_ reader: BufferReader) -> PhotoSize? { - var _1: String? - _1 = parseString(reader) - var _2: Buffer? - _2 = parseBytes(reader) - let _c1 = _1 != nil - let _c2 = _2 != nil - if _c1 && _c2 { - return Api.PhotoSize.photoStrippedSize(type: _1!, bytes: _2!) - } - else { - return nil - } - } - - } - public enum FileLocation: TypeConstructorDescription { - case fileLocationToBeDeprecated(volumeId: Int64, localId: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .fileLocationToBeDeprecated(let volumeId, let localId): - if boxed { - buffer.appendInt32(-1132476723) - } - serializeInt64(volumeId, buffer: buffer, boxed: false) - serializeInt32(localId, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .fileLocationToBeDeprecated(let volumeId, let localId): - return ("fileLocationToBeDeprecated", [("volumeId", volumeId), ("localId", localId)]) - } - } - - public static func parse_fileLocationToBeDeprecated(_ reader: BufferReader) -> FileLocation? { - var _1: Int64? - _1 = reader.readInt64() - var _2: Int32? - _2 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - if _c1 && _c2 { - return Api.FileLocation.fileLocationToBeDeprecated(volumeId: _1!, localId: _2!) - } - else { - return nil - } - } - - } - public enum DocumentAttribute: TypeConstructorDescription { - case documentAttributeImageSize(w: Int32, h: Int32) - case documentAttributeAnimated - case documentAttributeSticker(flags: Int32, alt: String, stickerset: Api.InputStickerSet, maskCoords: Api.MaskCoords?) - case documentAttributeVideo(flags: Int32, duration: Int32, w: Int32, h: Int32) - case documentAttributeAudio(flags: Int32, duration: Int32, title: String?, performer: String?, waveform: Buffer?) - case documentAttributeFilename(fileName: String) - case documentAttributeHasStickers - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .documentAttributeImageSize(let w, let h): - if boxed { - buffer.appendInt32(1815593308) - } - serializeInt32(w, buffer: buffer, boxed: false) - serializeInt32(h, buffer: buffer, boxed: false) - break - case .documentAttributeAnimated: - if boxed { - buffer.appendInt32(297109817) - } - - break - case .documentAttributeSticker(let flags, let alt, let stickerset, let maskCoords): - if boxed { - buffer.appendInt32(1662637586) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeString(alt, buffer: buffer, boxed: false) - stickerset.serialize(buffer, true) - if Int(flags) & Int(1 << 0) != 0 {maskCoords!.serialize(buffer, true)} - break - case .documentAttributeVideo(let flags, let duration, let w, let h): - if boxed { - buffer.appendInt32(250621158) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt32(duration, buffer: buffer, boxed: false) - serializeInt32(w, buffer: buffer, boxed: false) - serializeInt32(h, buffer: buffer, boxed: false) - break - case .documentAttributeAudio(let flags, let duration, let title, let performer, let waveform): - if boxed { - buffer.appendInt32(-1739392570) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt32(duration, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {serializeString(title!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 1) != 0 {serializeString(performer!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 2) != 0 {serializeBytes(waveform!, buffer: buffer, boxed: false)} - break - case .documentAttributeFilename(let fileName): - if boxed { - buffer.appendInt32(358154344) - } - serializeString(fileName, buffer: buffer, boxed: false) - break - case .documentAttributeHasStickers: - if boxed { - buffer.appendInt32(-1744710921) - } - - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .documentAttributeImageSize(let w, let h): - return ("documentAttributeImageSize", [("w", w), ("h", h)]) - case .documentAttributeAnimated: - return ("documentAttributeAnimated", []) - case .documentAttributeSticker(let flags, let alt, let stickerset, let maskCoords): - return ("documentAttributeSticker", [("flags", flags), ("alt", alt), ("stickerset", stickerset), ("maskCoords", maskCoords)]) - case .documentAttributeVideo(let flags, let duration, let w, let h): - return ("documentAttributeVideo", [("flags", flags), ("duration", duration), ("w", w), ("h", h)]) - case .documentAttributeAudio(let flags, let duration, let title, let performer, let waveform): - return ("documentAttributeAudio", [("flags", flags), ("duration", duration), ("title", title), ("performer", performer), ("waveform", waveform)]) - case .documentAttributeFilename(let fileName): - return ("documentAttributeFilename", [("fileName", fileName)]) - case .documentAttributeHasStickers: - return ("documentAttributeHasStickers", []) - } - } - - public static func parse_documentAttributeImageSize(_ reader: BufferReader) -> DocumentAttribute? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - if _c1 && _c2 { - return Api.DocumentAttribute.documentAttributeImageSize(w: _1!, h: _2!) - } - else { - return nil - } - } - public static func parse_documentAttributeAnimated(_ reader: BufferReader) -> DocumentAttribute? { - return Api.DocumentAttribute.documentAttributeAnimated - } - public static func parse_documentAttributeSticker(_ reader: BufferReader) -> DocumentAttribute? { - var _1: Int32? - _1 = reader.readInt32() - var _2: String? - _2 = parseString(reader) - var _3: Api.InputStickerSet? - if let signature = reader.readInt32() { - _3 = Api.parse(reader, signature: signature) as? Api.InputStickerSet - } - var _4: Api.MaskCoords? - if Int(_1!) & Int(1 << 0) != 0 {if let signature = reader.readInt32() { - _4 = Api.parse(reader, signature: signature) as? Api.MaskCoords - } } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = (Int(_1!) & Int(1 << 0) == 0) || _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.DocumentAttribute.documentAttributeSticker(flags: _1!, alt: _2!, stickerset: _3!, maskCoords: _4) - } - else { - return nil - } - } - public static func parse_documentAttributeVideo(_ reader: BufferReader) -> DocumentAttribute? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: Int32? - _3 = reader.readInt32() - var _4: Int32? - _4 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.DocumentAttribute.documentAttributeVideo(flags: _1!, duration: _2!, w: _3!, h: _4!) - } - else { - return nil - } - } - public static func parse_documentAttributeAudio(_ reader: BufferReader) -> DocumentAttribute? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: String? - if Int(_1!) & Int(1 << 0) != 0 {_3 = parseString(reader) } - var _4: String? - if Int(_1!) & Int(1 << 1) != 0 {_4 = parseString(reader) } - var _5: Buffer? - if Int(_1!) & Int(1 << 2) != 0 {_5 = parseBytes(reader) } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil - let _c4 = (Int(_1!) & Int(1 << 1) == 0) || _4 != nil - let _c5 = (Int(_1!) & Int(1 << 2) == 0) || _5 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 { - return Api.DocumentAttribute.documentAttributeAudio(flags: _1!, duration: _2!, title: _3, performer: _4, waveform: _5) - } - else { - return nil - } - } - public static func parse_documentAttributeFilename(_ reader: BufferReader) -> DocumentAttribute? { - var _1: String? - _1 = parseString(reader) - let _c1 = _1 != nil - if _c1 { - return Api.DocumentAttribute.documentAttributeFilename(fileName: _1!) - } - else { - return nil - } - } - public static func parse_documentAttributeHasStickers(_ reader: BufferReader) -> DocumentAttribute? { - return Api.DocumentAttribute.documentAttributeHasStickers - } - - } - public enum InputStickerSet: TypeConstructorDescription { - case inputStickerSetEmpty - case inputStickerSetID(id: Int64, accessHash: Int64) - case inputStickerSetShortName(shortName: String) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .inputStickerSetEmpty: - if boxed { - buffer.appendInt32(-4838507) - } - - break - case .inputStickerSetID(let id, let accessHash): - if boxed { - buffer.appendInt32(-1645763991) - } - serializeInt64(id, buffer: buffer, boxed: false) - serializeInt64(accessHash, buffer: buffer, boxed: false) - break - case .inputStickerSetShortName(let shortName): - if boxed { - buffer.appendInt32(-2044933984) - } - serializeString(shortName, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .inputStickerSetEmpty: - return ("inputStickerSetEmpty", []) - case .inputStickerSetID(let id, let accessHash): - return ("inputStickerSetID", [("id", id), ("accessHash", accessHash)]) - case .inputStickerSetShortName(let shortName): - return ("inputStickerSetShortName", [("shortName", shortName)]) - } - } - - public static func parse_inputStickerSetEmpty(_ reader: BufferReader) -> InputStickerSet? { - return Api.InputStickerSet.inputStickerSetEmpty - } - public static func parse_inputStickerSetID(_ reader: BufferReader) -> InputStickerSet? { - var _1: Int64? - _1 = reader.readInt64() - var _2: Int64? - _2 = reader.readInt64() - let _c1 = _1 != nil - let _c2 = _2 != nil - if _c1 && _c2 { - return Api.InputStickerSet.inputStickerSetID(id: _1!, accessHash: _2!) - } - else { - return nil - } - } - public static func parse_inputStickerSetShortName(_ reader: BufferReader) -> InputStickerSet? { - var _1: String? - _1 = parseString(reader) - let _c1 = _1 != nil - if _c1 { - return Api.InputStickerSet.inputStickerSetShortName(shortName: _1!) - } - else { - return nil - } - } - - } - public enum InputFileLocation: TypeConstructorDescription { - case inputPhotoFileLocation(id: Int64, accessHash: Int64, fileReference: Buffer, thumbSize: String) - case inputDocumentFileLocation(id: Int64, accessHash: Int64, fileReference: Buffer, thumbSize: String) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .inputPhotoFileLocation(let id, let accessHash, let fileReference, let thumbSize): - if boxed { - buffer.appendInt32(1075322878) - } - serializeInt64(id, buffer: buffer, boxed: false) - serializeInt64(accessHash, buffer: buffer, boxed: false) - serializeBytes(fileReference, buffer: buffer, boxed: false) - serializeString(thumbSize, buffer: buffer, boxed: false) - break - case .inputDocumentFileLocation(let id, let accessHash, let fileReference, let thumbSize): - if boxed { - buffer.appendInt32(-1160743548) - } - serializeInt64(id, buffer: buffer, boxed: false) - serializeInt64(accessHash, buffer: buffer, boxed: false) - serializeBytes(fileReference, buffer: buffer, boxed: false) - serializeString(thumbSize, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .inputPhotoFileLocation(let id, let accessHash, let fileReference, let thumbSize): - return ("inputPhotoFileLocation", [("id", id), ("accessHash", accessHash), ("fileReference", fileReference), ("thumbSize", thumbSize)]) - case .inputDocumentFileLocation(let id, let accessHash, let fileReference, let thumbSize): - return ("inputDocumentFileLocation", [("id", id), ("accessHash", accessHash), ("fileReference", fileReference), ("thumbSize", thumbSize)]) - } - } - - public static func parse_inputPhotoFileLocation(_ reader: BufferReader) -> InputFileLocation? { - var _1: Int64? - _1 = reader.readInt64() - var _2: Int64? - _2 = reader.readInt64() - var _3: Buffer? - _3 = parseBytes(reader) - var _4: String? - _4 = parseString(reader) - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.InputFileLocation.inputPhotoFileLocation(id: _1!, accessHash: _2!, fileReference: _3!, thumbSize: _4!) - } - else { - return nil - } - } - public static func parse_inputDocumentFileLocation(_ reader: BufferReader) -> InputFileLocation? { - var _1: Int64? - _1 = reader.readInt64() - var _2: Int64? - _2 = reader.readInt64() - var _3: Buffer? - _3 = parseBytes(reader) - var _4: String? - _4 = parseString(reader) - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.InputFileLocation.inputDocumentFileLocation(id: _1!, accessHash: _2!, fileReference: _3!, thumbSize: _4!) - } - else { - return nil - } - } - - } - public enum MaskCoords: TypeConstructorDescription { - case maskCoords(n: Int32, x: Double, y: Double, zoom: Double) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .maskCoords(let n, let x, let y, let zoom): - if boxed { - buffer.appendInt32(-1361650766) - } - serializeInt32(n, buffer: buffer, boxed: false) - serializeDouble(x, buffer: buffer, boxed: false) - serializeDouble(y, buffer: buffer, boxed: false) - serializeDouble(zoom, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .maskCoords(let n, let x, let y, let zoom): - return ("maskCoords", [("n", n), ("x", x), ("y", y), ("zoom", zoom)]) - } - } - - public static func parse_maskCoords(_ reader: BufferReader) -> MaskCoords? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Double? - _2 = reader.readDouble() - var _3: Double? - _3 = reader.readDouble() - var _4: Double? - _4 = reader.readDouble() - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.MaskCoords.maskCoords(n: _1!, x: _2!, y: _3!, zoom: _4!) - } - else { - return nil - } - } - - } - public enum Document: TypeConstructorDescription { - case document(flags: Int32, id: Int64, accessHash: Int64, fileReference: Buffer, date: Int32, mimeType: String, size: Int32, thumbs: [Api.PhotoSize]?, dcId: Int32, attributes: [Api.DocumentAttribute]) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .document(let flags, let id, let accessHash, let fileReference, let date, let mimeType, let size, let thumbs, let dcId, let attributes): - if boxed { - buffer.appendInt32(-1683841855) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt64(id, buffer: buffer, boxed: false) - serializeInt64(accessHash, buffer: buffer, boxed: false) - serializeBytes(fileReference, buffer: buffer, boxed: false) - serializeInt32(date, buffer: buffer, boxed: false) - serializeString(mimeType, buffer: buffer, boxed: false) - serializeInt32(size, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {buffer.appendInt32(481674261) - buffer.appendInt32(Int32(thumbs!.count)) - for item in thumbs! { - item.serialize(buffer, true) - }} - serializeInt32(dcId, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(attributes.count)) - for item in attributes { - item.serialize(buffer, true) - } - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .document(let flags, let id, let accessHash, let fileReference, let date, let mimeType, let size, let thumbs, let dcId, let attributes): - return ("document", [("flags", flags), ("id", id), ("accessHash", accessHash), ("fileReference", fileReference), ("date", date), ("mimeType", mimeType), ("size", size), ("thumbs", thumbs), ("dcId", dcId), ("attributes", attributes)]) - } - } - - public static func parse_document(_ reader: BufferReader) -> Document? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int64? - _2 = reader.readInt64() - var _3: Int64? - _3 = reader.readInt64() - var _4: Buffer? - _4 = parseBytes(reader) - var _5: Int32? - _5 = reader.readInt32() - var _6: String? - _6 = parseString(reader) - var _7: Int32? - _7 = reader.readInt32() - var _8: [Api.PhotoSize]? - if Int(_1!) & Int(1 << 0) != 0 {if let _ = reader.readInt32() { - _8 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PhotoSize.self) - } } - var _9: Int32? - _9 = reader.readInt32() - var _10: [Api.DocumentAttribute]? - if let _ = reader.readInt32() { - _10 = Api.parseVector(reader, elementSignature: 0, elementType: Api.DocumentAttribute.self) - } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - let _c5 = _5 != nil - let _c6 = _6 != nil - let _c7 = _7 != nil - let _c8 = (Int(_1!) & Int(1 << 0) == 0) || _8 != nil - let _c9 = _9 != nil - let _c10 = _10 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 { - return Api.Document.document(flags: _1!, id: _2!, accessHash: _3!, fileReference: _4!, date: _5!, mimeType: _6!, size: _7!, thumbs: _8, dcId: _9!, attributes: _10!) - } - else { - return nil - } - } - - } -} -public extension Api { - public struct functions { - - } -} diff --git a/NotificationService/Data.swift b/NotificationService/Data.swift deleted file mode 100644 index 86dba1c072..0000000000 --- a/NotificationService/Data.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -enum Namespaces { - struct Peer { - static let CloudUser: PeerId.Namespace = 0 - static let CloudGroup: PeerId.Namespace = 1 - static let CloudChannel: PeerId.Namespace = 2 - } -} - -struct PeerId { - typealias Namespace = Int32 - typealias Id = Int32 - - public let namespace: Namespace - public let id: Id - - public init(namespace: Namespace, id: Id) { - self.namespace = namespace - self.id = id - } - - public init(_ n: Int64) { - self.namespace = Int32((n >> 32) & 0x7fffffff) - self.id = Int32(bitPattern: UInt32(n & 0xffffffff)) - } - - public func toInt64() -> Int64 { - return (Int64(self.namespace) << 32) | Int64(bitPattern: UInt64(UInt32(bitPattern: self.id))) - } -} diff --git a/NotificationService/ImageData.swift b/NotificationService/ImageData.swift deleted file mode 100644 index fd97b1affe..0000000000 --- a/NotificationService/ImageData.swift +++ /dev/null @@ -1,180 +0,0 @@ -import Foundation -#if BUCK -import MtProtoKit -#else -import MtProtoKitDynamic -#endif - -import BuildConfig -import LightweightAccountData - -struct ImageResource { - let datacenterId: Int - let volumeId: Int64 - let localId: Int32 - let secret: Int64 - let fileReference: Data? - - var resourceId: String { - return "telegram-cloud-file-\(self.datacenterId)-\(self.volumeId)-\(self.localId)-\(self.secret)" - } -} - -private class Keychain: NSObject, MTKeychain { - var dict: [String: Data] = [:] - - func setObject(_ object: Any!, forKey aKey: String!, group: String!) { - let data = NSKeyedArchiver.archivedData(withRootObject: object) - self.dict[group + ":" + aKey] = data - } - - func object(forKey aKey: String!, group: String!) -> Any! { - if let data = self.dict[group + ":" + aKey] { - return NSKeyedUnarchiver.unarchiveObject(with: data as Data) - } - return nil - } - - func removeObject(forKey aKey: String!, group: String!) { - self.dict.removeValue(forKey: group + ":" + aKey) - } - - func dropGroup(_ group: String!) { - } -} - -private final class ParsedFile: NSObject { - let data: Data? - - init(data: Data?) { - self.data = data - - super.init() - } -} - -func fetchImageWithAccount(buildConfig: BuildConfig, proxyConnection: AccountProxyConnection?, account: StoredAccountInfo, inputFileLocation: Api.InputFileLocation, datacenterId: Int32, completion: @escaping (Data?) -> Void) -> () -> Void { - MTLogSetEnabled(true) - MTLogSetLoggingFunction({ str, args in - //let string = NSString(format: str! as NSString, args!) - print("MT: \(str!)") - }) - - let serialization = Serialization() - - var apiEnvironment = MTApiEnvironment() - - apiEnvironment.apiId = buildConfig.apiId - apiEnvironment.langPack = "ios" - apiEnvironment.layer = NSNumber(value: Int(serialization.currentLayer())) - apiEnvironment.disableUpdates = true - apiEnvironment = apiEnvironment.withUpdatedLangPackCode("en") - - if let proxy = proxyConnection { - apiEnvironment = apiEnvironment.withUpdatedSocksProxySettings(MTSocksProxySettings(ip: proxy.host, port: UInt16(clamping: proxy.port), username: proxy.username, password: proxy.password, secret: proxy.secret)) - } - - let context = MTContext(serialization: serialization, apiEnvironment: apiEnvironment, isTestingEnvironment: account.isTestingEnvironment, useTempAuthKeys: false)! - - let seedAddressList: [Int: [String]] - - if account.isTestingEnvironment { - seedAddressList = [ - 1: ["149.154.175.10"], - 2: ["149.154.167.40"] - ] - } else { - seedAddressList = [ - 1: ["149.154.175.50", "2001:b28:f23d:f001::a"], - 2: ["149.154.167.50", "2001:67c:4e8:f002::a"], - 3: ["149.154.175.100", "2001:b28:f23d:f003::a"], - 4: ["149.154.167.91", "2001:67c:4e8:f004::a"], - 5: ["149.154.171.5", "2001:b28:f23f:f005::a"] - ] - } - - for (id, ips) in seedAddressList { - context.setSeedAddressSetForDatacenterWithId(id, seedAddressSet: MTDatacenterAddressSet(addressList: ips.map { MTDatacenterAddress(ip: $0, port: 443, preferForMedia: false, restrictToTcp: false, cdn: false, preferForProxy: false, secret: nil) })) - } - - let keychain = Keychain() - context.keychain = keychain - - context.performBatchUpdates({ - for (id, info) in account.datacenters { - if !info.addressList.isEmpty { - var addressList: [MTDatacenterAddress] = [] - for address in info.addressList { - addressList.append(MTDatacenterAddress(ip: address.host, port: UInt16(clamping: address.port), preferForMedia: address.isMedia, restrictToTcp: false, cdn: false, preferForProxy: false, secret: address.secret)) - } - context.updateAddressSetForDatacenter(withId: Int(id), addressSet: MTDatacenterAddressSet(addressList: addressList), forceUpdateSchemes: true) - } - } - }) - - for (id, info) in account.datacenters { - context.updateAuthInfoForDatacenter(withId: Int(id), authInfo: MTDatacenterAuthInfo(authKey: info.masterKey.data, authKeyId: info.masterKey.id, saltSet: [], authKeyAttributes: [:], mainTempAuthKey: nil, mediaTempAuthKey: nil)) - } - - let mtProto = MTProto(context: context, datacenterId: Int(datacenterId), usageCalculationInfo: nil)! - mtProto.useTempAuthKeys = context.useTempAuthKeys - mtProto.checkForProxyConnectionIssues = false - - let requestService = MTRequestMessageService(context: context)! - mtProto.add(requestService) - - let request = MTRequest() - - let buffer = Buffer() - buffer.appendInt32(-475607115) //upload.getFile - Api.serializeObject(inputFileLocation, buffer: buffer, boxed: true) - - buffer.appendInt32(0) - buffer.appendInt32(32 * 1024) - - request.setPayload(buffer.makeData(), metadata: "getFile", shortMetadata: "getFile", responseParser: { response in - let reader = BufferReader(Buffer(data: response)) - guard let signature = reader.readInt32() else { - return ParsedFile(data: nil) - } - guard signature == 157948117 else { - return ParsedFile(data: nil) - } - reader.skip(4) //type - reader.skip(4) //mtime - guard let bytes = parseBytes(reader) else { - return ParsedFile(data: nil) - } - return ParsedFile(data: bytes.makeData()) - }) - - request.dependsOnPasswordEntry = false - request.shouldContinueExecutionWithErrorContext = { errorContext in - guard let _ = errorContext else { - return true - } - return true - } - - request.completed = { (boxedResponse, timestamp, error) -> () in - if let _ = error { - completion(nil) - } else { - if let result = boxedResponse as? ParsedFile { - completion(result.data) - } else { - completion(nil) - } - } - } - - requestService.add(request) - mtProto.resume() - - let internalId = request.internalId - return { - requestService.removeRequest(byInternalId: internalId) - context.performBatchUpdates({}) - mtProto.stop() - } -} diff --git a/NotificationService/ManagedFile.swift b/NotificationService/ManagedFile.swift deleted file mode 100644 index f09a798c61..0000000000 --- a/NotificationService/ManagedFile.swift +++ /dev/null @@ -1,86 +0,0 @@ -import Foundation - -enum ManagedFileMode { - case read - case readwrite - case append -} - -private func wrappedWrite(_ fd: Int32, _ data: UnsafeRawPointer, _ count: Int) -> Int { - return write(fd, data, count) -} - -private func wrappedRead(_ fd: Int32, _ data: UnsafeMutableRawPointer, _ count: Int) -> Int { - return read(fd, data, count) -} - -final class ManagedFile { - private let fd: Int32 - private let mode: ManagedFileMode - - init?(path: String, mode: ManagedFileMode) { - self.mode = mode - let fileMode: Int32 - let accessMode: UInt16 - switch mode { - case .read: - fileMode = O_RDONLY - accessMode = S_IRUSR - case .readwrite: - fileMode = O_RDWR | O_CREAT - accessMode = S_IRUSR | S_IWUSR - case .append: - fileMode = O_WRONLY | O_CREAT | O_APPEND - accessMode = S_IRUSR | S_IWUSR - } - let fd = open(path, fileMode, accessMode) - if fd >= 0 { - self.fd = fd - } else { - return nil - } - } - - deinit { - close(self.fd) - } - - func write(_ data: UnsafeRawPointer, count: Int) -> Int { - return wrappedWrite(self.fd, data, count) - } - - func read(_ data: UnsafeMutableRawPointer, _ count: Int) -> Int { - return wrappedRead(self.fd, data, count) - } - - func readData(count: Int) -> Data { - var result = Data(count: count) - result.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in - let readCount = self.read(bytes, count) - assert(readCount == count) - } - return result - } - - func seek(position: Int64) { - lseek(self.fd, position, SEEK_SET) - } - - func truncate(count: Int64) { - ftruncate(self.fd, count) - } - - func getSize() -> Int? { - var value = stat() - if fstat(self.fd, &value) == 0 { - return Int(value.st_size) - } else { - return nil - } - } - - func sync() { - fsync(self.fd) - } -} - diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift deleted file mode 100644 index a00827f038..0000000000 --- a/NotificationService/NotificationService.swift +++ /dev/null @@ -1,538 +0,0 @@ -import Foundation -import UserNotifications -#if BUCK -import MtProtoKit -#else -import MtProtoKitDynamic -#endif -import WebP -import BuildConfig -import LightweightAccountData - -private var sharedLogger: Logger? - -private final class Logger { - private let maxLength: Int = 2 * 1024 * 1024 - private let maxFiles: Int = 20 - - private let basePath: String - private var file: (ManagedFile, Int)? - - var logToFile: Bool = true - var logToConsole: Bool = true - - public static func setSharedLogger(_ logger: Logger) { - sharedLogger = logger - } - - public static var shared: Logger { - if let sharedLogger = sharedLogger { - return sharedLogger - } else { - assertionFailure() - let tempLogger = Logger(basePath: "") - tempLogger.logToFile = false - tempLogger.logToConsole = false - return tempLogger - } - } - - public init(basePath: String) { - self.basePath = basePath - //self.logToConsole = false - } - - public func log(_ tag: String, _ what: @autoclosure () -> String) { - if !self.logToFile && !self.logToConsole { - return - } - - let string = what() - - var rawTime = time_t() - time(&rawTime) - var timeinfo = tm() - localtime_r(&rawTime, &timeinfo) - - var curTime = timeval() - gettimeofday(&curTime, nil) - let milliseconds = curTime.tv_usec / 1000 - - var consoleContent: String? - if self.logToConsole { - let content = String(format: "[%@] %d-%d-%d %02d:%02d:%02d.%03d %@", arguments: [tag, Int(timeinfo.tm_year) + 1900, Int(timeinfo.tm_mon + 1), Int(timeinfo.tm_mday), Int(timeinfo.tm_hour), Int(timeinfo.tm_min), Int(timeinfo.tm_sec), Int(milliseconds), string]) - consoleContent = content - print(content) - } - - if self.logToFile { - let content: String - if let consoleContent = consoleContent { - content = consoleContent - } else { - content = String(format: "[%@] %d-%d-%d %02d:%02d:%02d.%03d %@", arguments: [tag, Int(timeinfo.tm_year) + 1900, Int(timeinfo.tm_mon + 1), Int(timeinfo.tm_mday), Int(timeinfo.tm_hour), Int(timeinfo.tm_min), Int(timeinfo.tm_sec), Int(milliseconds), string]) - } - - var currentFile: ManagedFile? - var openNew = false - if let (file, length) = self.file { - if length >= self.maxLength { - self.file = nil - openNew = true - } else { - currentFile = file - } - } else { - openNew = true - } - if openNew { - let _ = try? FileManager.default.createDirectory(atPath: self.basePath, withIntermediateDirectories: true, attributes: nil) - - var createNew = false - if let files = try? FileManager.default.contentsOfDirectory(at: URL(fileURLWithPath: self.basePath), includingPropertiesForKeys: [URLResourceKey.creationDateKey], options: []) { - var minCreationDate: (Date, URL)? - var maxCreationDate: (Date, URL)? - var count = 0 - for url in files { - if url.lastPathComponent.hasPrefix("log-") { - if let values = try? url.resourceValues(forKeys: Set([URLResourceKey.creationDateKey])), let creationDate = values.creationDate { - count += 1 - if minCreationDate == nil || minCreationDate!.0 > creationDate { - minCreationDate = (creationDate, url) - } - if maxCreationDate == nil || maxCreationDate!.0 < creationDate { - maxCreationDate = (creationDate, url) - } - } - } - } - if let (_, url) = minCreationDate, count >= self.maxFiles { - let _ = try? FileManager.default.removeItem(at: url) - } - if let (_, url) = maxCreationDate { - var value = stat() - if stat(url.path, &value) == 0 && Int(value.st_size) < self.maxLength { - if let file = ManagedFile(path: url.path, mode: .append) { - self.file = (file, Int(value.st_size)) - currentFile = file - } - } else { - createNew = true - } - } else { - createNew = true - } - } - - if createNew { - let fileName = String(format: "log-%d-%d-%d_%02d-%02d-%02d.%03d.txt", arguments: [Int(timeinfo.tm_year) + 1900, Int(timeinfo.tm_mon + 1), Int(timeinfo.tm_mday), Int(timeinfo.tm_hour), Int(timeinfo.tm_min), Int(timeinfo.tm_sec), Int(milliseconds)]) - - let path = self.basePath + "/" + fileName - - if let file = ManagedFile(path: path, mode: .append) { - self.file = (file, 0) - currentFile = file - } - } - } - - if let currentFile = currentFile { - if let data = content.data(using: .utf8) { - data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in - let _ = currentFile.write(bytes, count: data.count) - } - var newline: UInt8 = 0x0a - let _ = currentFile.write(&newline, count: 1) - if let file = self.file { - self.file = (file.0, file.1 + data.count + 1) - } else { - assertionFailure() - } - } - } - } - } -} - -private func parseBase64(string: String) -> Data? { - var string = string - string = string.replacingOccurrences(of: "-", with: "+") - string = string.replacingOccurrences(of: "_", with: "/") - while string.count % 4 != 0 { - string.append("=") - } - return Data(base64Encoded: string) -} - -enum ParsedMediaAttachment { - case document(Api.Document) - case photo(Api.Photo) -} - -private func parseAttachment(data: Data) -> (ParsedMediaAttachment, Data)? { - let reader = BufferReader(Buffer(data: data)) - guard let initialSignature = reader.readInt32() else { - return nil - } - - let buffer: Buffer - if initialSignature == 0x3072cfa1 { - guard let bytes = parseBytes(reader) else { - return nil - } - guard let decompressedData = MTGzip.decompress(bytes.makeData()) else { - return nil - } - buffer = Buffer(data: decompressedData) - } else { - buffer = Buffer(data: data) - } - - if let result = Api.parse(buffer) { - if let photo = result as? Api.Photo { - return (.photo(photo), buffer.makeData()) - } else if let document = result as? Api.Document { - return (.document(document), buffer.makeData()) - } else { - return nil - } - } else { - return nil - } -} - -private func photoSizeDimensions(_ size: Api.PhotoSize) -> CGSize? { - switch size { - case let .photoSize(_, _, w, h, _): - return CGSize(width: CGFloat(w), height: CGFloat(h)) - case let .photoCachedSize(_, _, w, h, _): - return CGSize(width: CGFloat(w), height: CGFloat(h)) - default: - return nil - } -} - -private func photoDimensions(_ photo: Api.Photo) -> CGSize? { - switch photo { - case let .photo(_, _, _, _, _, sizes, _): - for size in sizes.reversed() { - if let dimensions = photoSizeDimensions(size) { - return dimensions - } - } - return nil - case .photoEmpty: - return nil - } -} - -private func photoSizes(_ photo: Api.Photo) -> [Api.PhotoSize] { - switch photo { - case let .photo(_, _, _, _, _, sizes, _): - return sizes - case .photoEmpty: - return [] - } -} - -class NotificationService: UNNotificationServiceExtension { - private let rootPath: String? - - var contentHandler: ((UNNotificationContent) -> Void)? - var bestAttemptContent: UNMutableNotificationContent? - - var cancelFetch: (() -> Void)? - - override init() { - let appBundleIdentifier = Bundle.main.bundleIdentifier! - if let lastDotRange = appBundleIdentifier.range(of: ".", options: [.backwards]) { - let appGroupName = "group.\(appBundleIdentifier[.. Void) { - guard let rootPath = self.rootPath else { - contentHandler(request.content) - return - } - let accountInfos = self.rootPath.flatMap({ rootPath in - loadAccountsData(rootPath: rootPath) - }) ?? StoredAccountInfos(proxy: nil, accounts: []) - - self.contentHandler = contentHandler - self.bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent - - var encryptedData: Data? - if let encryptedPayload = request.content.userInfo["p"] as? String { - encryptedData = parseBase64(string: encryptedPayload) - } - - Logger.shared.log("NotificationService", "received notification \(request), parsed encryptedData \(String(describing: encryptedData))") - - if let (account, dict) = encryptedData.flatMap({ decryptedNotificationPayload(accounts: accountInfos.accounts, data: $0) }) { - Logger.shared.log("NotificationService", "decrypted notification") - var userInfo = self.bestAttemptContent?.userInfo ?? [:] - userInfo["accountId"] = account.id - - var peerId: PeerId? - var messageId: Int32? - var silent = false - - if let msgId = dict["msg_id"] as? String { - userInfo["msg_id"] = msgId - messageId = Int32(msgId) - } - if let fromId = dict["from_id"] as? String { - userInfo["from_id"] = fromId - if let id = Int32(fromId) { - peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: id) - } - } - if let chatId = dict["chat_id"] as? String { - userInfo["chat_id"] = chatId - if let id = Int32(chatId) { - peerId = PeerId(namespace: Namespaces.Peer.CloudGroup, id: id) - } - } - if let channelId = dict["channel_id"] as? String { - userInfo["channel_id"] = channelId - if let id = Int32(channelId) { - peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: id) - } - } - if let silentValue = dict["silent"] as? String { - silent = silentValue == "1" - } - - var attachment: ParsedMediaAttachment? - var attachmentData: Data? - if let attachmentDataString = dict["attachb64"] as? String, let attachmentDataValue = parseBase64(string: attachmentDataString) { - if let value = parseAttachment(data: attachmentDataValue) { - attachment = value.0 - attachmentData = value.1 - } - } - - let imagesPath = NSTemporaryDirectory() + "aps-data" - let _ = try? FileManager.default.createDirectory(atPath: imagesPath, withIntermediateDirectories: true, attributes: nil) - - let accountBasePath = rootPath + "/account-\(UInt64(bitPattern: account.id))" - - let mediaBoxPath = accountBasePath + "/postbox/media" - - var tempImagePath: String? - var mediaBoxThumbnailImagePath: String? - - var inputFileLocation: (Int32, Api.InputFileLocation)? - var fetchResourceId: String? - var isPng = false - var isExpandableMedia = false - - if let attachment = attachment { - switch attachment { - case let .photo(photo): - switch photo { - case let .photo(_, id, accessHash, fileReference, _, sizes, dcId): - isExpandableMedia = true - loop: for size in sizes { - switch size { - case let .photoSize(type, _, _, _, _): - if type == "m" { - inputFileLocation = (dcId, .inputPhotoFileLocation(id: id, accessHash: accessHash, fileReference: fileReference, thumbSize: type)) - fetchResourceId = "telegram-cloud-photo-size-\(dcId)-\(id)-\(type)" - break loop - } - default: - break - } - } - case .photoEmpty: - break - } - case let .document(document): - switch document { - case let .document(_, id, accessHash, fileReference, _, mimeType, _, thumbs, dcId, attributes): - var isSticker = false - for attribute in attributes { - switch attribute { - case .documentAttributeSticker: - isSticker = true - default: - break - } - } - let isAnimatedSticker = mimeType == "application/x-tgsticker" - if isSticker || isAnimatedSticker { - isExpandableMedia = true - } - if let thumbs = thumbs { - loop: for size in thumbs { - switch size { - case let .photoSize(type, _, _, _, _): - if (isSticker && type == "s") || type == "m" { - if isSticker { - isPng = true - } - inputFileLocation = (dcId, .inputDocumentFileLocation(id: id, accessHash: accessHash, fileReference: fileReference, thumbSize: type)) - fetchResourceId = "telegram-cloud-document-size-\(dcId)-\(id)-\(type)" - break loop - } - default: - break - } - } - } - } - } - } - - if let fetchResourceId = fetchResourceId { - tempImagePath = imagesPath + "/\(fetchResourceId).\(isPng ? "png" : "jpg")" - mediaBoxThumbnailImagePath = mediaBoxPath + "/\(fetchResourceId)" - } - - if let aps = dict["aps"] as? [AnyHashable: Any] { - if let alert = aps["alert"] as? String { - self.bestAttemptContent?.title = "" - self.bestAttemptContent?.body = alert - } else if let alert = aps["alert"] as? [AnyHashable: Any] { - self.bestAttemptContent?.title = alert["title"] as? String ?? "" - if let title = self.bestAttemptContent?.title, !title.isEmpty && silent { - self.bestAttemptContent?.title = "\(title) 🔕" - } - self.bestAttemptContent?.subtitle = alert["subtitle"] as? String ?? "" - self.bestAttemptContent?.body = alert["body"] as? String ?? "" - } - - if accountInfos.accounts.count > 1 { - if let title = self.bestAttemptContent?.title, !title.isEmpty, !account.peerName.isEmpty { - self.bestAttemptContent?.title = "\(title) → \(account.peerName)" - } - } - - if let threadId = aps["thread-id"] as? String { - self.bestAttemptContent?.threadIdentifier = threadId - } - if let sound = aps["sound"] as? String { - self.bestAttemptContent?.sound = UNNotificationSound(named: UNNotificationSoundName(sound)) - } - if let category = aps["category"] as? String { - self.bestAttemptContent?.categoryIdentifier = category - if let peerId = peerId, let messageId = messageId, let _ = attachment, let attachmentData = attachmentData { - userInfo["peerId"] = peerId.toInt64() - userInfo["messageId.namespace"] = 0 as Int32 - userInfo["messageId.id"] = messageId - - userInfo["media"] = attachmentData.base64EncodedString() - - if isExpandableMedia { - if category == "r" { - self.bestAttemptContent?.categoryIdentifier = "withReplyMedia" - } else if category == "m" { - self.bestAttemptContent?.categoryIdentifier = "withMuteMedia" - } - } - } - } - } - - self.bestAttemptContent?.userInfo = userInfo - - self.cancelFetch?() - if let mediaBoxThumbnailImagePath = mediaBoxThumbnailImagePath, let tempImagePath = tempImagePath, let (datacenterId, inputFileLocation) = inputFileLocation { - if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxThumbnailImagePath)) { - var tempData = data - if isPng { - if let image = WebP.convert(fromWebP: data), let imageData = image.pngData() { - tempData = imageData - } - } - if let _ = try? tempData.write(to: URL(fileURLWithPath: tempImagePath)) { - if let attachment = try? UNNotificationAttachment(identifier: "image", url: URL(fileURLWithPath: tempImagePath)) { - self.bestAttemptContent?.attachments = [attachment] - } - } - if let bestAttemptContent = self.bestAttemptContent { - contentHandler(bestAttemptContent) - } - } else { - let appBundleIdentifier = Bundle.main.bundleIdentifier! - guard let lastDotRange = appBundleIdentifier.range(of: ".", options: [.backwards]) else { - return - } - - let baseAppBundleId = String(appBundleIdentifier[.. Data { - return self.withUnsafeMutablePointer { pointer, size -> Data in - if let pointer = pointer { - return Data(bytes: pointer.assumingMemoryBound(to: UInt8.self), count: Int(size)) - } else { - return Data() - } - } - } - - var description: String { - get { - var string = "" - if let data = self.data { - var i: UInt = 0 - let bytes = data.assumingMemoryBound(to: UInt8.self) - while i < _size && i < 8 { - string += String(format: "%02x", Int(bytes.advanced(by: Int(i)).pointee)) - i += 1 - } - if i < _size { - string += "...\(_size)b" - } - } else { - string += "" - } - return string - } - } - - func appendBytes(_ bytes: UnsafeRawPointer, length: UInt) { - if self.capacity < self._size + length { - self.capacity = self._size + length + 128 - if self.data == nil { - self.data = malloc(Int(self.capacity))! - } - else { - self.data = realloc(self.data, Int(self.capacity))! - } - } - - memcpy(self.data?.advanced(by: Int(self._size)), bytes, Int(length)) - self._size += length - } - - func appendBuffer(_ buffer: Buffer) { - if self.capacity < self._size + buffer._size { - self.capacity = self._size + buffer._size + 128 - if self.data == nil { - self.data = malloc(Int(self.capacity))! - } - else { - self.data = realloc(self.data, Int(self.capacity))! - } - } - - memcpy(self.data?.advanced(by: Int(self._size)), buffer.data, Int(buffer._size)) - } - - func appendInt32(_ value: Int32) { - var v = value - self.appendBytes(&v, length: 4) - } - - func appendInt64(_ value: Int64) { - var v = value - self.appendBytes(&v, length: 8) - } - - func appendDouble(_ value: Double) { - var v = value - self.appendBytes(&v, length: 8) - } - - func withUnsafeMutablePointer(_ f: (UnsafeMutableRawPointer?, UInt) -> R) -> R { - return f(self.data, self._size) - } -} - -class BufferReader { - private let buffer: Buffer - private(set) var offset: UInt = 0 - - init(_ buffer: Buffer) { - self.buffer = buffer - } - - func reset() { - self.offset = 0 - } - - func skip(_ count: Int) { - self.offset = min(self.buffer._size, self.offset + UInt(count)) - } - - func readInt32() -> Int32? { - if self.offset + 4 <= self.buffer._size { - let value: Int32 = buffer.data!.advanced(by: Int(self.offset)).assumingMemoryBound(to: Int32.self).pointee - self.offset += 4 - return value - } - return nil - } - - func readInt64() -> Int64? { - if self.offset + 8 <= self.buffer._size { - let value: Int64 = buffer.data!.advanced(by: Int(self.offset)).assumingMemoryBound(to: Int64.self).pointee - self.offset += 8 - return value - } - return nil - } - - func readDouble() -> Double? { - if self.offset + 8 <= self.buffer._size { - let value: Double = buffer.data!.advanced(by: Int(self.offset)).assumingMemoryBound(to: Double.self).pointee - self.offset += 8 - return value - } - return nil - } - - func readBytesAsInt32(_ count: Int) -> Int32? { - if count == 0 { - return 0 - } - else if count > 0 && count <= 4 || self.offset + UInt(count) <= self.buffer._size { - var value: Int32 = 0 - memcpy(&value, self.buffer.data?.advanced(by: Int(self.offset)), count) - self.offset += UInt(count) - return value - } - return nil - } - - func readBuffer(_ count: Int) -> Buffer? { - if count >= 0 && self.offset + UInt(count) <= self.buffer._size { - let buffer = Buffer() - buffer.appendBytes((self.buffer.data?.advanced(by: Int(self.offset)))!, length: UInt(count)) - self.offset += UInt(count) - return buffer - } - return nil - } - - func withReadBufferNoCopy(_ count: Int, _ f: (Buffer) -> T) -> T? { - if count >= 0 && self.offset + UInt(count) <= self.buffer._size { - return f(Buffer(memory: self.buffer.data!.advanced(by: Int(self.offset)), size: count, capacity: count, freeWhenDone: false)) - } - return nil - } -} - -private func roundUp(_ numToRound: Int, multiple: Int) -> Int { - if multiple == 0 { - return numToRound - } - - let remainder = numToRound % multiple - if remainder == 0 { - return numToRound - } - - return numToRound + multiple - remainder -} - -func parseBytes(_ reader: BufferReader) -> Buffer? { - if let tmp = reader.readBytesAsInt32(1) { - var paddingBytes: Int = 0 - var length: Int = 0 - if tmp == 254 { - if let len = reader.readBytesAsInt32(3) { - length = Int(len) - paddingBytes = roundUp(length, multiple: 4) - length - } - else { - return nil - } - } - else { - length = Int(tmp) - paddingBytes = roundUp(length + 1, multiple: 4) - (length + 1) - } - - let buffer = reader.readBuffer(length) - reader.skip(paddingBytes) - return buffer - } - return nil -} - -func parseString(_ reader: BufferReader) -> String? { - if let buffer = parseBytes(reader) { - return (NSString(data: buffer.makeData() as Data, encoding: String.Encoding.utf8.rawValue) as? String) ?? "" - } - return nil -} - -protocol TypeConstructorDescription { - func descriptionFields() -> (String, [(String, Any)]) -} - -func serializeInt32(_ value: Int32, buffer: Buffer, boxed: Bool) { - if boxed { - buffer.appendInt32(-1471112230) - } - buffer.appendInt32(value) -} - -func serializeInt64(_ value: Int64, buffer: Buffer, boxed: Bool) { - if boxed { - buffer.appendInt32(570911930) - } - buffer.appendInt64(value) -} - -func serializeDouble(_ value: Double, buffer: Buffer, boxed: Bool) { - if boxed { - buffer.appendInt32(571523412) - } - buffer.appendDouble(value) -} - -func serializeString(_ value: String, buffer: Buffer, boxed: Bool) { - let stringBuffer = Buffer() - let data = value.data(using: .utf8, allowLossyConversion: true) ?? Data() - data.withUnsafeBytes { bytes in - stringBuffer.appendBytes(bytes, length: UInt(data.count)) - } - serializeBytes(stringBuffer, buffer: buffer, boxed: boxed) -} - -func serializeBytes(_ value: Buffer, buffer: Buffer, boxed: Bool) { - if boxed { - buffer.appendInt32(-1255641564) - } - - var length: Int32 = Int32(value.size) - var padding: Int32 = 0 - if (length >= 254) - { - var tmp: UInt8 = 254 - buffer.appendBytes(&tmp, length: 1) - buffer.appendBytes(&length, length: 3) - padding = (((length % 4) == 0 ? length : (length + 4 - (length % 4)))) - length; - } - else - { - buffer.appendBytes(&length, length: 1) - - let e1 = (((length + 1) % 4) == 0 ? (length + 1) : ((length + 1) + 4 - ((length + 1) % 4))) - padding = (e1) - (length + 1) - } - - if value.size != 0 { - buffer.appendBytes(value.data!, length: UInt(length)) - } - - var i: Int32 = 0 - var tmp: UInt8 = 0 - while i < padding { - buffer.appendBytes(&tmp, length: 1) - i += 1 - } -} - diff --git a/NotificationService/Serialization.m b/NotificationService/Serialization.m index 6f6f9191a5..a10db76cba 100644 --- a/NotificationService/Serialization.m +++ b/NotificationService/Serialization.m @@ -3,7 +3,7 @@ @implementation Serialization - (NSUInteger)currentLayer { - return 106; + return 105; } - (id _Nullable)parseMessage:(NSData * _Nullable)data { diff --git a/NotificationService/Serialization.swift b/NotificationService/Serialization.swift deleted file mode 100644 index f0477c29cc..0000000000 --- a/NotificationService/Serialization.swift +++ /dev/null @@ -1,46 +0,0 @@ -import Foundation -#if BUCK -import MtProtoKit -#else -import MtProtoKitDynamic -#endif - -public class BoxedMessage: NSObject { - public let body: Any - public init(_ body: Any) { - self.body = body - } -} - -public class Serialization: NSObject, MTSerialization { - public func currentLayer() -> UInt { - return 106 - } - - public func parseMessage(_ data: Data!) -> Any! { - return nil - } - - public func exportAuthorization(_ datacenterId: Int32, data: AutoreleasingUnsafeMutablePointer) -> MTExportAuthorizationResponseParser! - { - return { data -> MTExportedAuthorizationData? in - return nil - } - } - - public func importAuthorization(_ authId: Int32, bytes: Data!) -> Data! { - return Data() - } - - public func requestDatacenterAddress(with data: AutoreleasingUnsafeMutablePointer) -> MTRequestDatacenterAddressListParser! { - return { response -> MTDatacenterAddressListData? in - return nil - } - } - - public func requestNoop(_ data: AutoreleasingUnsafeMutablePointer!) -> MTRequestNoopParser! { - return { response -> AnyObject? in - return nil - } - } -} diff --git a/Telegram-iOS.xcodeproj/project.pbxproj b/Telegram-iOS.xcodeproj/project.pbxproj index 889e67f3ad..600bb45c29 100644 --- a/Telegram-iOS.xcodeproj/project.pbxproj +++ b/Telegram-iOS.xcodeproj/project.pbxproj @@ -901,8 +901,6 @@ D00859B71B28189D00EAF753 /* Telegram_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Telegram_iOSTests.swift; sourceTree = ""; }; D00ED7591FE94630001F38BD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/AppIntentVocabulary.plist; sourceTree = ""; }; D00ED75C1FE95287001F38BD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - D015E010225CCEB300CB9E8A /* ReadBuffer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadBuffer.swift; sourceTree = ""; }; - D015E01E225CDF5000CB9E8A /* Api0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api0.swift; sourceTree = ""; }; D015E04C225D2D8F00CB9E8A /* WebP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WebP.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D01A47521F4DBEB100383CC1 /* libHockeySDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libHockeySDK.a; path = "../../build/HockeySDK-iOS/Support/build/Debug-iphoneos/libHockeySDK.a"; sourceTree = ""; }; D01A47541F4DBED700383CC1 /* HockeySDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = HockeySDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -937,7 +935,6 @@ D03B0E951D637A0500955575 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03BCCC91C6EBD670097A291 /* ListViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListViewTests.swift; sourceTree = ""; }; D0400ED81D5B8F97007931CE /* TelegramUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TelegramUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D0400EE41D5B912E007931CE /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; D0400EE61D5B912E007931CE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D04DCC0B1F71C80000B021D7 /* 0.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 0.m4a; sourceTree = ""; }; D04DCC0C1F71C80000B021D7 /* 1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 1.m4a; sourceTree = ""; }; @@ -1014,7 +1011,6 @@ D06706601D51185400DED3E3 /* TelegramCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D073E51E21FF7CE900742DDD /* Crypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Crypto.h; sourceTree = ""; }; D073E51F21FF7CE900742DDD /* Crypto.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Crypto.m; sourceTree = ""; }; - D073E52122003E1E00742DDD /* Data.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = ""; }; D079FD001F06BBD10038FADE /* Telegram-iOS-AppStore.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Telegram-iOS-AppStore.entitlements"; sourceTree = ""; }; D08410471FABDC7A008FFE92 /* SSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D08410491FABDCF2008FFE92 /* LegacyComponents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyComponents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1114,7 +1110,6 @@ D0D268881D79A70A00C422DA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D0D268971D79AF1B00C422DA /* SiriIntents-AppStore.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SiriIntents-AppStore.entitlements"; sourceTree = ""; }; D0D268981D79AF3900C422DA /* SiriIntentsUI.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SiriIntentsUI.entitlements; sourceTree = ""; }; - D0E2CE632227F0680084E3DD /* ManagedFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedFile.swift; sourceTree = ""; }; D0E3A7071B285B5000A402D9 /* Telegram-iOS-Hockeyapp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Telegram-iOS-Hockeyapp.entitlements"; sourceTree = ""; }; D0E41A381D65A69C00FBFC00 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; D0E41A3B1D65A69C00FBFC00 /* TodayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewController.swift; sourceTree = ""; }; @@ -1133,10 +1128,7 @@ D0ECCB7E1FE9C38500609802 /* Telegram_iOS_UITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Telegram_iOS_UITests.swift; sourceTree = ""; }; D0ECCB801FE9C38500609802 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D0ECCB891FE9C4AC00609802 /* SnapshotHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SnapshotHelper.swift; sourceTree = ""; }; - D0ED633921FF3EDF001D4648 /* AccountData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountData.swift; sourceTree = ""; }; D0ED633C21FF3F28001D4648 /* NotificationService-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NotificationService-Bridging-Header.h"; sourceTree = ""; }; - D0ED633E21FF46E4001D4648 /* ImageData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageData.swift; sourceTree = ""; }; - D0ED634021FF4786001D4648 /* Serialization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Serialization.swift; sourceTree = ""; }; D0F575122083B96B00F1C1E1 /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; D0FC1947201D2DA700FEDBB2 /* SFCompactRounded-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SFCompactRounded-Semibold.otf"; path = "Telegram-iOS/Resources/SFCompactRounded-Semibold.otf"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -2177,22 +2169,14 @@ D0BAAA232310302300AFC473 /* FetchImage.m */, D0BAAA252310326200AFC473 /* Serialization.h */, D0BAAA262310326200AFC473 /* Serialization.m */, - D015E01E225CDF5000CB9E8A /* Api0.swift */, D000CAC221FB6E170011B15D /* NotificationService-AppStore.entitlements */, D000CAC321FB6E170011B15D /* NotificationService-AppStoreLLC.entitlements */, D000CAC121FB6E160011B15D /* NotificationService-Fork.entitlements */, D000CAC021FB6E160011B15D /* NotificationService-HockeyApp.entitlements */, - D0400EE41D5B912E007931CE /* NotificationService.swift */, - D0ED633921FF3EDF001D4648 /* AccountData.swift */, - D0ED633E21FF46E4001D4648 /* ImageData.swift */, D0400EE61D5B912E007931CE /* Info.plist */, D0ED633C21FF3F28001D4648 /* NotificationService-Bridging-Header.h */, - D0ED634021FF4786001D4648 /* Serialization.swift */, D073E51E21FF7CE900742DDD /* Crypto.h */, D073E51F21FF7CE900742DDD /* Crypto.m */, - D073E52122003E1E00742DDD /* Data.swift */, - D0E2CE632227F0680084E3DD /* ManagedFile.swift */, - D015E010225CCEB300CB9E8A /* ReadBuffer.swift */, ); path = NotificationService; sourceTree = ""; diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 3132ce6cd9..df189d76b7 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -5,7 +5,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[570911930] = { return $0.readInt64() } dict[571523412] = { return $0.readDouble() } dict[-1255641564] = { return parseString($0) } - dict[-475111160] = { return Api.MessageReactionsList.parse_messageReactionsList($0) } dict[-1240849242] = { return Api.messages.StickerSet.parse_stickerSet($0) } dict[-457104426] = { return Api.InputGeoPoint.parse_inputGeoPointEmpty($0) } dict[-206066487] = { return Api.InputGeoPoint.parse_inputGeoPoint($0) } @@ -240,7 +239,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1263546448] = { return Api.Update.parse_updatePeerLocated($0) } dict[967122427] = { return Api.Update.parse_updateNewScheduledMessage($0) } dict[-1870238482] = { return Api.Update.parse_updateDeleteScheduledMessages($0) } - dict[357013699] = { return Api.Update.parse_updateMessageReactions($0) } dict[-2112423005] = { return Api.Update.parse_updateTheme($0) } dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) } dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) } @@ -283,7 +281,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1012306921] = { return Api.InputTheme.parse_inputTheme($0) } dict[-175567375] = { return Api.InputTheme.parse_inputThemeSlug($0) } dict[1158290442] = { return Api.messages.FoundGifs.parse_foundGifs($0) } - dict[-1199954735] = { return Api.MessageReactions.parse_messageReactions($0) } dict[-1132476723] = { return Api.FileLocation.parse_fileLocationToBeDeprecated($0) } dict[-716006138] = { return Api.Poll.parse_poll($0) } dict[423314455] = { return Api.InputNotifyPeer.parse_inputNotifyUsers($0) } @@ -428,6 +425,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-2128640689] = { return Api.account.SentEmailCode.parse_sentEmailCode($0) } dict[-1038136962] = { return Api.EncryptedFile.parse_encryptedFileEmpty($0) } dict[1248893260] = { return Api.EncryptedFile.parse_encryptedFile($0) } + dict[-557924733] = { return Api.CodeSettings.parse_codeSettings($0) } dict[-391902247] = { return Api.SecureValueError.parse_secureValueErrorData($0) } dict[12467706] = { return Api.SecureValueError.parse_secureValueErrorFrontSide($0) } dict[-2037765467] = { return Api.SecureValueError.parse_secureValueErrorReverseSide($0) } @@ -560,7 +558,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1820043071] = { return Api.User.parse_user($0) } dict[-2082087340] = { return Api.Message.parse_messageEmpty($0) } dict[-1642487306] = { return Api.Message.parse_messageService($0) } - dict[-1752573244] = { return Api.Message.parse_message($0) } + dict[1160515173] = { return Api.Message.parse_message($0) } dict[186120336] = { return Api.messages.RecentStickers.parse_recentStickersNotModified($0) } dict[586395571] = { return Api.messages.RecentStickers.parse_recentStickers($0) } dict[-182231723] = { return Api.InputFileLocation.parse_inputEncryptedFileLocation($0) } @@ -614,7 +612,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1625153079] = { return Api.InputWebFileLocation.parse_inputWebFileGeoPointLocation($0) } dict[-332168592] = { return Api.MessageFwdHeader.parse_messageFwdHeader($0) } dict[398898678] = { return Api.help.Support.parse_support($0) } - dict[1873957073] = { return Api.ReactionCount.parse_reactionCount($0) } dict[1474492012] = { return Api.MessagesFilter.parse_inputMessagesFilterEmpty($0) } dict[-1777752804] = { return Api.MessagesFilter.parse_inputMessagesFilterPhotos($0) } dict[-1614803355] = { return Api.MessagesFilter.parse_inputMessagesFilterVideo($0) } @@ -641,7 +638,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-290921362] = { return Api.upload.CdnFile.parse_cdnFileReuploadNeeded($0) } dict[-1449145777] = { return Api.upload.CdnFile.parse_cdnFile($0) } dict[415997816] = { return Api.help.InviteText.parse_inviteText($0) } - dict[-764945220] = { return Api.MessageUserReaction.parse_messageUserReaction($0) } dict[-1937807902] = { return Api.BotInlineMessage.parse_botInlineMessageText($0) } dict[982505656] = { return Api.BotInlineMessage.parse_botInlineMessageMediaGeo($0) } dict[1984755728] = { return Api.BotInlineMessage.parse_botInlineMessageMediaAuto($0) } @@ -841,8 +837,6 @@ public struct Api { public static func serializeObject(_ object: Any, buffer: Buffer, boxed: Swift.Bool) { switch object { - case let _1 as Api.MessageReactionsList: - _1.serialize(buffer, boxed) case let _1 as Api.messages.StickerSet: _1.serialize(buffer, boxed) case let _1 as Api.InputGeoPoint: @@ -975,8 +969,6 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.messages.FoundGifs: _1.serialize(buffer, boxed) - case let _1 as Api.MessageReactions: - _1.serialize(buffer, boxed) case let _1 as Api.FileLocation: _1.serialize(buffer, boxed) case let _1 as Api.Poll: @@ -1087,6 +1079,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.EncryptedFile: _1.serialize(buffer, boxed) + case let _1 as Api.CodeSettings: + _1.serialize(buffer, boxed) case let _1 as Api.SecureValueError: _1.serialize(buffer, boxed) case let _1 as Api.NotifyPeer: @@ -1263,8 +1257,6 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.help.Support: _1.serialize(buffer, boxed) - case let _1 as Api.ReactionCount: - _1.serialize(buffer, boxed) case let _1 as Api.MessagesFilter: _1.serialize(buffer, boxed) case let _1 as Api.messages.Dialogs: @@ -1275,8 +1267,6 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.help.InviteText: _1.serialize(buffer, boxed) - case let _1 as Api.MessageUserReaction: - _1.serialize(buffer, boxed) case let _1 as Api.BotInlineMessage: _1.serialize(buffer, boxed) case let _1 as Api.InputPeerNotifySettings: diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index e8851bbe79..691815d5fa 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -1,66 +1,4 @@ public extension Api { - public enum MessageReactionsList: TypeConstructorDescription { - case messageReactionsList(flags: Int32, count: Int32, reactions: [Api.MessageUserReaction], users: [Api.User], nextOffset: String?) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .messageReactionsList(let flags, let count, let reactions, let users, let nextOffset): - if boxed { - buffer.appendInt32(-475111160) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt32(count, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(reactions.count)) - for item in reactions { - item.serialize(buffer, true) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(users.count)) - for item in users { - item.serialize(buffer, true) - } - if Int(flags) & Int(1 << 0) != 0 {serializeString(nextOffset!, buffer: buffer, boxed: false)} - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .messageReactionsList(let flags, let count, let reactions, let users, let nextOffset): - return ("messageReactionsList", [("flags", flags), ("count", count), ("reactions", reactions), ("users", users), ("nextOffset", nextOffset)]) - } - } - - public static func parse_messageReactionsList(_ reader: BufferReader) -> MessageReactionsList? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: [Api.MessageUserReaction]? - if let _ = reader.readInt32() { - _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageUserReaction.self) - } - var _4: [Api.User]? - if let _ = reader.readInt32() { - _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) - } - var _5: String? - if Int(_1!) & Int(1 << 0) != 0 {_5 = parseString(reader) } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 { - return Api.MessageReactionsList.messageReactionsList(flags: _1!, count: _2!, reactions: _3!, users: _4!, nextOffset: _5) - } - else { - return nil - } - } - - } public enum InputGeoPoint: TypeConstructorDescription { case inputGeoPointEmpty case inputGeoPoint(lat: Double, long: Double) @@ -4143,7 +4081,6 @@ public extension Api { case updatePeerLocated(peers: [Api.PeerLocated]) case updateNewScheduledMessage(message: Api.Message) case updateDeleteScheduledMessages(peer: Api.Peer, messages: [Int32]) - case updateMessageReactions(peer: Api.Peer, msgId: Int32, reactions: Api.MessageReactions) case updateTheme(theme: Api.Theme) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { @@ -4763,14 +4700,6 @@ public extension Api { serializeInt32(item, buffer: buffer, boxed: false) } break - case .updateMessageReactions(let peer, let msgId, let reactions): - if boxed { - buffer.appendInt32(357013699) - } - peer.serialize(buffer, true) - serializeInt32(msgId, buffer: buffer, boxed: false) - reactions.serialize(buffer, true) - break case .updateTheme(let theme): if boxed { buffer.appendInt32(-2112423005) @@ -4928,8 +4857,6 @@ public extension Api { return ("updateNewScheduledMessage", [("message", message)]) case .updateDeleteScheduledMessages(let peer, let messages): return ("updateDeleteScheduledMessages", [("peer", peer), ("messages", messages)]) - case .updateMessageReactions(let peer, let msgId, let reactions): - return ("updateMessageReactions", [("peer", peer), ("msgId", msgId), ("reactions", reactions)]) case .updateTheme(let theme): return ("updateTheme", [("theme", theme)]) } @@ -6177,27 +6104,6 @@ public extension Api { return nil } } - public static func parse_updateMessageReactions(_ reader: BufferReader) -> Update? { - var _1: Api.Peer? - if let signature = reader.readInt32() { - _1 = Api.parse(reader, signature: signature) as? Api.Peer - } - var _2: Int32? - _2 = reader.readInt32() - var _3: Api.MessageReactions? - if let signature = reader.readInt32() { - _3 = Api.parse(reader, signature: signature) as? Api.MessageReactions - } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.Update.updateMessageReactions(peer: _1!, msgId: _2!, reactions: _3!) - } - else { - return nil - } - } public static func parse_updateTheme(_ reader: BufferReader) -> Update? { var _1: Api.Theme? if let signature = reader.readInt32() { @@ -7166,50 +7072,6 @@ public extension Api { } } - } - public enum MessageReactions: TypeConstructorDescription { - case messageReactions(flags: Int32, results: [Api.ReactionCount]) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .messageReactions(let flags, let results): - if boxed { - buffer.appendInt32(-1199954735) - } - serializeInt32(flags, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(results.count)) - for item in results { - item.serialize(buffer, true) - } - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .messageReactions(let flags, let results): - return ("messageReactions", [("flags", flags), ("results", results)]) - } - } - - public static func parse_messageReactions(_ reader: BufferReader) -> MessageReactions? { - var _1: Int32? - _1 = reader.readInt32() - var _2: [Api.ReactionCount]? - if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ReactionCount.self) - } - let _c1 = _1 != nil - let _c2 = _2 != nil - if _c1 && _c2 { - return Api.MessageReactions.messageReactions(flags: _1!, results: _2!) - } - else { - return nil - } - } - } public enum FileLocation: TypeConstructorDescription { case fileLocationToBeDeprecated(volumeId: Int64, localId: Int32) @@ -10642,6 +10504,40 @@ public extension Api { } } + } + public enum CodeSettings: TypeConstructorDescription { + case codeSettings(flags: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .codeSettings(let flags): + if boxed { + buffer.appendInt32(-557924733) + } + serializeInt32(flags, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .codeSettings(let flags): + return ("codeSettings", [("flags", flags)]) + } + } + + public static func parse_codeSettings(_ reader: BufferReader) -> CodeSettings? { + var _1: Int32? + _1 = reader.readInt32() + let _c1 = _1 != nil + if _c1 { + return Api.CodeSettings.codeSettings(flags: _1!) + } + else { + return nil + } + } + } public enum SecureValueError: TypeConstructorDescription { case secureValueErrorData(type: Api.SecureValueType, dataHash: Buffer, field: String, text: String) @@ -14288,7 +14184,7 @@ public extension Api { public enum Message: TypeConstructorDescription { case messageEmpty(id: Int32) case messageService(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, replyToMsgId: Int32?, date: Int32, action: Api.MessageAction) - case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, reactions: Api.MessageReactions?, restrictionReason: [Api.RestrictionReason]?) + case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, restrictionReason: [Api.RestrictionReason]?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -14310,9 +14206,9 @@ public extension Api { serializeInt32(date, buffer: buffer, boxed: false) action.serialize(buffer, true) break - case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let reactions, let restrictionReason): + case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let restrictionReason): if boxed { - buffer.appendInt32(-1752573244) + buffer.appendInt32(1160515173) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -14334,7 +14230,6 @@ public extension Api { if Int(flags) & Int(1 << 15) != 0 {serializeInt32(editDate!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 16) != 0 {serializeString(postAuthor!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 17) != 0 {serializeInt64(groupedId!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 20) != 0 {reactions!.serialize(buffer, true)} if Int(flags) & Int(1 << 22) != 0 {buffer.appendInt32(481674261) buffer.appendInt32(Int32(restrictionReason!.count)) for item in restrictionReason! { @@ -14350,8 +14245,8 @@ public extension Api { return ("messageEmpty", [("id", id)]) case .messageService(let flags, let id, let fromId, let toId, let replyToMsgId, let date, let action): return ("messageService", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("replyToMsgId", replyToMsgId), ("date", date), ("action", action)]) - case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let reactions, let restrictionReason): - return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("reactions", reactions), ("restrictionReason", restrictionReason)]) + case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let restrictionReason): + return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("restrictionReason", restrictionReason)]) } } @@ -14442,13 +14337,9 @@ public extension Api { if Int(_1!) & Int(1 << 16) != 0 {_15 = parseString(reader) } var _16: Int64? if Int(_1!) & Int(1 << 17) != 0 {_16 = reader.readInt64() } - var _17: Api.MessageReactions? - if Int(_1!) & Int(1 << 20) != 0 {if let signature = reader.readInt32() { - _17 = Api.parse(reader, signature: signature) as? Api.MessageReactions - } } - var _18: [Api.RestrictionReason]? + var _17: [Api.RestrictionReason]? if Int(_1!) & Int(1 << 22) != 0 {if let _ = reader.readInt32() { - _18 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self) + _17 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self) } } let _c1 = _1 != nil let _c2 = _2 != nil @@ -14466,10 +14357,9 @@ public extension Api { let _c14 = (Int(_1!) & Int(1 << 15) == 0) || _14 != nil let _c15 = (Int(_1!) & Int(1 << 16) == 0) || _15 != nil let _c16 = (Int(_1!) & Int(1 << 17) == 0) || _16 != nil - let _c17 = (Int(_1!) & Int(1 << 20) == 0) || _17 != nil - let _c18 = (Int(_1!) & Int(1 << 22) == 0) || _18 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 { - return Api.Message.message(flags: _1!, id: _2!, fromId: _3, toId: _4!, fwdFrom: _5, viaBotId: _6, replyToMsgId: _7, date: _8!, message: _9!, media: _10, replyMarkup: _11, entities: _12, views: _13, editDate: _14, postAuthor: _15, groupedId: _16, reactions: _17, restrictionReason: _18) + let _c17 = (Int(_1!) & Int(1 << 22) == 0) || _17 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 { + return Api.Message.message(flags: _1!, id: _2!, fromId: _3, toId: _4!, fwdFrom: _5, viaBotId: _6, replyToMsgId: _7, date: _8!, message: _9!, media: _10, replyMarkup: _11, entities: _12, views: _13, editDate: _14, postAuthor: _15, groupedId: _16, restrictionReason: _17) } else { return nil @@ -15962,48 +15852,6 @@ public extension Api { } } - } - public enum ReactionCount: TypeConstructorDescription { - case reactionCount(flags: Int32, reaction: String, count: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .reactionCount(let flags, let reaction, let count): - if boxed { - buffer.appendInt32(1873957073) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeString(reaction, buffer: buffer, boxed: false) - serializeInt32(count, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .reactionCount(let flags, let reaction, let count): - return ("reactionCount", [("flags", flags), ("reaction", reaction), ("count", count)]) - } - } - - public static func parse_reactionCount(_ reader: BufferReader) -> ReactionCount? { - var _1: Int32? - _1 = reader.readInt32() - var _2: String? - _2 = parseString(reader) - var _3: Int32? - _3 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.ReactionCount.reactionCount(flags: _1!, reaction: _2!, count: _3!) - } - else { - return nil - } - } - } public enum MessagesFilter: TypeConstructorDescription { case inputMessagesFilterEmpty @@ -16316,44 +16164,6 @@ public extension Api { } } - } - public enum MessageUserReaction: TypeConstructorDescription { - case messageUserReaction(userId: Int32, reaction: String) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .messageUserReaction(let userId, let reaction): - if boxed { - buffer.appendInt32(-764945220) - } - serializeInt32(userId, buffer: buffer, boxed: false) - serializeString(reaction, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .messageUserReaction(let userId, let reaction): - return ("messageUserReaction", [("userId", userId), ("reaction", reaction)]) - } - } - - public static func parse_messageUserReaction(_ reader: BufferReader) -> MessageUserReaction? { - var _1: Int32? - _1 = reader.readInt32() - var _2: String? - _2 = parseString(reader) - let _c1 = _1 != nil - let _c2 = _2 != nil - if _c1 && _c2 { - return Api.MessageUserReaction.messageUserReaction(userId: _1!, reaction: _2!) - } - else { - return nil - } - } - } public enum BotInlineMessage: TypeConstructorDescription { case botInlineMessageText(flags: Int32, message: String, entities: [Api.MessageEntity]?, replyMarkup: Api.ReplyMarkup?) diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 5beab5564d..42bf07db5b 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -2924,33 +2924,6 @@ public extension Api { }) } - public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-637606386) - serializeInt32(flags, buffer: buffer, boxed: false) - fromPeer.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt32(item, buffer: buffer, boxed: false) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(randomId.count)) - for item in randomId { - serializeInt64(item, buffer: buffer, boxed: false) - } - toPeer.serialize(buffer, true) - if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(570955184) @@ -2971,31 +2944,6 @@ public extension Api { }) } - public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1224152952) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - serializeInt32(id, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} - if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} - if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) - buffer.appendInt32(Int32(entities!.count)) - for item in entities! { - item.serialize(buffer, true) - }} - if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia], scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-872345397) @@ -3018,6 +2966,33 @@ public extension Api { }) } + public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-637606386) + serializeInt32(flags, buffer: buffer, boxed: false) + fromPeer.serialize(buffer, true) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(randomId.count)) + for item in randomId { + serializeInt64(item, buffer: buffer, boxed: false) + } + toPeer.serialize(buffer, true) + if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func getScheduledHistory(peer: Api.InputPeer, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-490575781) @@ -3090,56 +3065,26 @@ public extension Api { }) } - public static func sendReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, reaction: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(627641572) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - serializeInt32(msgId, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {serializeString(reaction!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.sendReaction", parameters: [("flags", flags), ("peer", peer), ("msgId", msgId), ("reaction", reaction)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - - public static func getMessagesReactions(peer: Api.InputPeer, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-1950707482) - peer.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt32(item, buffer: buffer, boxed: false) - } - return (FunctionDescription(name: "messages.getMessagesReactions", parameters: [("peer", peer), ("id", id)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - - public static func getMessageReactionsList(flags: Int32, peer: Api.InputPeer, id: Int32, reaction: String?, offset: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(363935594) + buffer.appendInt32(1224152952) serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) serializeInt32(id, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {serializeString(reaction!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 1) != 0 {serializeString(offset!, buffer: buffer, boxed: false)} - serializeInt32(limit, buffer: buffer, boxed: false) - return (FunctionDescription(name: "messages.getMessageReactionsList", parameters: [("flags", flags), ("peer", peer), ("id", id), ("reaction", reaction), ("offset", offset), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.MessageReactionsList? in + if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} + if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(entities!.count)) + for item in entities! { + item.serialize(buffer, true) + }} + if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) - var result: Api.MessageReactionsList? + var result: Api.Updates? if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.MessageReactionsList + result = Api.parse(reader, signature: signature) as? Api.Updates } return result }) diff --git a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift index 15599e05ba..56420815fe 100644 --- a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift +++ b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift @@ -71,7 +71,7 @@ enum AccountStateMutationOperation { case DeleteMessages([MessageId]) case EditMessage(MessageId, StoreMessage) case UpdateMessagePoll(MediaId, Api.Poll?, Api.PollResults) - case UpdateMessageReactions(MessageId, Api.MessageReactions) + //case UpdateMessageReactions(MessageId, Api.MessageReactions) case UpdateMedia(MediaId, Media?) case ReadInbox(MessageId) case ReadOutbox(MessageId, Int32?) @@ -226,9 +226,9 @@ struct AccountMutableState { self.addOperation(.UpdateMessagePoll(id, poll, results)) } - mutating func updateMessageReactions(_ messageId: MessageId, reactions: Api.MessageReactions) { + /*mutating func updateMessageReactions(_ messageId: MessageId, reactions: Api.MessageReactions) { self.addOperation(.UpdateMessageReactions(messageId, reactions)) - } + }*/ mutating func updateMedia(_ id: MediaId, media: Media?) { self.addOperation(.UpdateMedia(id, media)) @@ -413,7 +413,7 @@ struct AccountMutableState { mutating func addOperation(_ operation: AccountStateMutationOperation) { switch operation { - case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .ReadOutbox, .ReadGroupFeedInbox, .MergePeerPresences, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdatePeerChatUnreadMark, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme: + case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, /*.UpdateMessageReactions,*/ .UpdateMedia, .ReadOutbox, .ReadGroupFeedInbox, .MergePeerPresences, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdatePeerChatUnreadMark, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme: break case let .AddMessages(messages, location): for message in messages { diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index b29190bd41..2ea2c3afa4 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -1289,8 +1289,8 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo updatedState.updateLangPack(langCode: langCode, difference: difference) case let .updateMessagePoll(_, pollId, poll, results): updatedState.updateMessagePoll(MediaId(namespace: Namespaces.Media.CloudPoll, id: pollId), poll: poll, results: results) - case let .updateMessageReactions(peer, msgId, reactions): - updatedState.updateMessageReactions(MessageId(peerId: peer.peerId, namespace: Namespaces.Message.Cloud, id: msgId), reactions: reactions) + /*case let .updateMessageReactions(peer, msgId, reactions): + updatedState.updateMessageReactions(MessageId(peerId: peer.peerId, namespace: Namespaces.Message.Cloud, id: msgId), reactions: reactions)*/ case let .updateFolderPeers(folderPeers, _, _): for folderPeer in folderPeers { switch folderPeer { @@ -2032,7 +2032,7 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation]) var currentAddScheduledMessages: OptimizeAddMessagesState? for operation in operations { switch operation { - case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .MergeApiChats, .MergeApiUsers, .MergePeerPresences, .UpdatePeer, .ReadInbox, .ReadOutbox, .ReadGroupFeedInbox, .ResetReadState, .ResetIncomingReadState, .UpdatePeerChatUnreadMark, .ResetMessageTagSummary, .UpdateNotificationSettings, .UpdateGlobalNotificationSettings, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme: + case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, /*.UpdateMessageReactions,*/ .UpdateMedia, .MergeApiChats, .MergeApiUsers, .MergePeerPresences, .UpdatePeer, .ReadInbox, .ReadOutbox, .ReadGroupFeedInbox, .ResetReadState, .ResetIncomingReadState, .UpdatePeerChatUnreadMark, .ResetMessageTagSummary, .UpdateNotificationSettings, .UpdateGlobalNotificationSettings, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme: if let currentAddMessages = currentAddMessages, !currentAddMessages.messages.isEmpty { result.append(.AddMessages(currentAddMessages.messages, currentAddMessages.location)) } @@ -2346,7 +2346,7 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP updatedPoll = updatedPoll.withUpdatedResults(TelegramMediaPollResults(apiResults: results), min: resultsMin) updateMessageMedia(transaction: transaction, id: pollId, media: updatedPoll) } - case let .UpdateMessageReactions(messageId, reactions): + /*case let .UpdateMessageReactions(messageId, reactions): transaction.updateMessage(messageId, update: { currentMessage in var storeForwardInfo: StoreMessageForwardInfo? if let forwardInfo = currentMessage.forwardInfo { @@ -2365,7 +2365,7 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP attributes.append(ReactionsMessageAttribute(apiReactions: reactions)) } return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)) - }) + })*/ case let .UpdateMedia(id, media): if let media = media as? TelegramMediaWebpage { updatedWebpages[id] = media diff --git a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift index a4f3da726e..2f691fe3e5 100644 --- a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift @@ -57,7 +57,7 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes var updatedTimestamp: Int32? if let apiMessage = apiMessage { switch apiMessage { - case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _, _): + case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _): updatedTimestamp = date case .messageEmpty: break diff --git a/submodules/TelegramCore/TelegramCore/MessageReactionList.swift b/submodules/TelegramCore/TelegramCore/MessageReactionList.swift index 85a6b34d8b..5df92f6549 100644 --- a/submodules/TelegramCore/TelegramCore/MessageReactionList.swift +++ b/submodules/TelegramCore/TelegramCore/MessageReactionList.swift @@ -82,7 +82,7 @@ private final class MessageReactionCategoryContext { self.state.loadingMore = true self.statePromise.set(self.state) - var flags: Int32 = 0 + /*var flags: Int32 = 0 var reaction: String? switch self.category { case .all: @@ -147,7 +147,7 @@ private final class MessageReactionCategoryContext { }) }, error: { _ in - })) + }))*/ } } diff --git a/submodules/TelegramCore/TelegramCore/MessageReactions.swift b/submodules/TelegramCore/TelegramCore/MessageReactions.swift index bb804ff08c..1842464c3e 100644 --- a/submodules/TelegramCore/TelegramCore/MessageReactions.swift +++ b/submodules/TelegramCore/TelegramCore/MessageReactions.swift @@ -61,7 +61,8 @@ private enum RequestUpdateMessageReactionError { } private func requestUpdateMessageReaction(postbox: Postbox, network: Network, stateManager: AccountStateManager, messageId: MessageId) -> Signal { - return postbox.transaction { transaction -> (Peer, String?)? in + return .fail(.generic) + /*return postbox.transaction { transaction -> (Peer, String?)? in guard let peer = transaction.getPeer(messageId.peerId) else { return nil } @@ -117,7 +118,7 @@ private func requestUpdateMessageReaction(postbox: Postbox, network: Network, st |> introduceError(RequestUpdateMessageReactionError.self) |> ignoreValues } - } + }*/ } private final class ManagedApplyPendingMessageReactionsActionsHelper { diff --git a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift index 92cd9f78cd..ce3ab1104c 100644 --- a/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift +++ b/submodules/TelegramCore/TelegramCore/ReactionsMessageAttribute.swift @@ -46,7 +46,7 @@ public final class ReactionsMessageAttribute: MessageAttribute { encoder.encodeObjectArray(self.reactions, forKey: "r") } - func withUpdatedResults(_ reactions: Api.MessageReactions) -> ReactionsMessageAttribute { + /*func withUpdatedResults(_ reactions: Api.MessageReactions) -> ReactionsMessageAttribute { switch reactions { case let .messageReactions(flags, results): let min = (flags & (1 << 0)) != 0 @@ -74,7 +74,7 @@ public final class ReactionsMessageAttribute: MessageAttribute { } return ReactionsMessageAttribute(reactions: reactions) } - } + }*/ } public func mergedMessageReactions(attributes: [MessageAttribute]) -> ReactionsMessageAttribute? { @@ -147,7 +147,7 @@ public final class PendingReactionsMessageAttribute: MessageAttribute { } } -extension ReactionsMessageAttribute { +/*extension ReactionsMessageAttribute { convenience init(apiReactions: Api.MessageReactions) { switch apiReactions { case let .messageReactions(_, results): @@ -159,4 +159,4 @@ extension ReactionsMessageAttribute { }) } } -} +}*/ diff --git a/submodules/TelegramCore/TelegramCore/Serialization.swift b/submodules/TelegramCore/TelegramCore/Serialization.swift index acd34716b8..06a094ff21 100644 --- a/submodules/TelegramCore/TelegramCore/Serialization.swift +++ b/submodules/TelegramCore/TelegramCore/Serialization.swift @@ -220,7 +220,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 106 + return 105 } public func parseMessage(_ data: Data!) -> Any! { diff --git a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift index 3c33ae3317..876ed6d66b 100644 --- a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift @@ -111,7 +111,7 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute], func apiMessagePeerId(_ messsage: Api.Message) -> PeerId? { switch messsage { - case let .message(flags, _, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _, _): + case let .message(flags, _, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _): switch toId { case let .peerUser(userId): return PeerId(namespace: Namespaces.Peer.CloudUser, id: (flags & Int32(2)) != 0 ? userId : (fromId ?? userId)) @@ -136,7 +136,7 @@ func apiMessagePeerId(_ messsage: Api.Message) -> PeerId? { func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] { switch message { - case let .message(flags, _, fromId, toId, fwdHeader, viaBotId, _, _, _, media, _, entities, _, _, _, _, _, _): + case let .message(flags, _, fromId, toId, fwdHeader, viaBotId, _, _, _, media, _, entities, _, _, _, _, _): let peerId: PeerId switch toId { case let .peerUser(userId): @@ -240,7 +240,7 @@ func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] { func apiMessageAssociatedMessageIds(_ message: Api.Message) -> [MessageId]? { switch message { - case let .message(flags, _, fromId, toId, _, _, replyToMsgId, _, _, _, _, _, _, _, _, _, _, _): + case let .message(flags, _, fromId, toId, _, _, replyToMsgId, _, _, _, _, _, _, _, _, _, _): if let replyToMsgId = replyToMsgId { let peerId: PeerId switch toId { @@ -382,7 +382,7 @@ func messageTextEntitiesFromApiEntities(_ entities: [Api.MessageEntity]) -> [Mes extension StoreMessage { convenience init?(apiMessage: Api.Message, namespace: MessageId.Namespace = Namespaces.Message.Cloud) { switch apiMessage { - case let .message(flags, id, fromId, toId, fwdFrom, viaBotId, replyToMsgId, date, message, media, replyMarkup, entities, views, editDate, postAuthor, groupingId, reactions, restrictionReason): + case let .message(flags, id, fromId, toId, fwdFrom, viaBotId, replyToMsgId, date, message, media, replyMarkup, entities, views, editDate, postAuthor, groupingId, restrictionReason): let peerId: PeerId var authorId: PeerId? switch toId { @@ -537,9 +537,9 @@ extension StoreMessage { attributes.append(ContentRequiresValidationMessageAttribute()) } - if let reactions = reactions { + /*if let reactions = reactions { attributes.append(ReactionsMessageAttribute(apiReactions: reactions)) - } + }*/ if let restrictionReason = restrictionReason { attributes.append(RestrictedContentMessageAttribute(rules: restrictionReason.map(RestrictionRule.init(apiReason:)))) diff --git a/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift b/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift index b493d4bc81..94d242405b 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift @@ -69,7 +69,7 @@ class UpdateMessageService: NSObject, MTMessageService { self.putNext(groups) } case let .updateShortChatMessage(flags, id, fromId, chatId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyToMsgId, entities): - let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: fromId, toId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, reactions: nil, restrictionReason: nil) + let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: fromId, toId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount) let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil) if groups.count != 0 { @@ -86,7 +86,7 @@ class UpdateMessageService: NSObject, MTMessageService { generatedToId = Api.Peer.peerUser(userId: self.peerId.id) } - let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, toId: generatedToId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, reactions: nil, restrictionReason: nil) + let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, toId: generatedToId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount) let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil) if groups.count != 0 { diff --git a/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift b/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift index 651711a391..2439756d55 100644 --- a/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift +++ b/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift @@ -100,7 +100,7 @@ extension Api.MessageMedia { extension Api.Message { var rawId: Int32 { switch self { - case let .message(_, id, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _): + case let .message(_, id, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _): return id case let .messageEmpty(id): return id @@ -111,7 +111,7 @@ extension Api.Message { func id(namespace: MessageId.Namespace = Namespaces.Message.Cloud) -> MessageId? { switch self { - case let .message(flags, id, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _, _): + case let .message(flags, id, fromId, toId, _, _, _, _, _, _, _, _, _, _, _, _, _): let peerId: PeerId switch toId { case let .peerUser(userId): @@ -146,7 +146,7 @@ extension Api.Message { var timestamp: Int32? { switch self { - case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _, _): + case let .message(_, _, _, _, _, _, _, date, _, _, _, _, _, _, _, _, _): return date case let .messageService(_, _, _, _, _, date, _): return date @@ -157,7 +157,7 @@ extension Api.Message { var preCachedResources: [(MediaResource, Data)]? { switch self { - case let .message(_, _, _, _, _, _, _, _, _, media, _, _, _, _, _, _, _, _): + case let .message(_, _, _, _, _, _, _, _, _, media, _, _, _, _, _, _, _): return media?.preCachedResources default: return nil From 12667be698f29e1e1c91ebfb5dcbfe8fd5a4bb9f Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 23:11:23 +0400 Subject: [PATCH 58/86] Adjust text selection colors --- .../Sources/DefaultDarkPresentationTheme.swift | 4 ++-- .../Sources/DefaultDarkTintedPresentationTheme.swift | 4 ++-- .../Sources/DefaultDayPresentationTheme.swift | 9 ++++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index 2a13eb2800..e1e88b0427 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -210,8 +210,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta ) let message = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628))), primaryTextColor: .white, secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.4), pendingActivityColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaPlaceholderColor: UIColor(rgb: 0x1f1f1f).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x737373), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0x000000), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff)), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor.white.withAlphaComponent(0.5), scamColor: outgoingScamColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: UIColor(rgb: 0x313131).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: outgoingPrimaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff)), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x262628), highlightedFill: UIColor(rgb: 0x353539), stroke: UIColor(rgb: 0x262628))), primaryTextColor: .white, secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.4), pendingActivityColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.5), fileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaPlaceholderColor: UIColor(rgb: 0x1f1f1f).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x737373), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0x000000), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff)), textSelectionColor: accentColor.withAlphaComponent(0.2), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleHighlightedFillColor, stroke: outgoingBubbleFillColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor.white.withAlphaComponent(0.5), scamColor: outgoingScamColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: UIColor(rgb: 0x313131).mixedWith(.white, alpha: 0.05), polls: PresentationThemeChatBubblePolls(radioButton: outgoingPrimaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xb2b2b2, alpha: 0.18)), actionButtonsTextColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff)), textSelectionColor: UIColor.white.withAlphaComponent(0.2), textSelectionKnobColor: UIColor.white), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x1f1f1f), highlightedFill: UIColor(rgb: 0x2a2a2a), stroke: UIColor(rgb: 0x1f1f1f)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0x1f1f1f), highlightedFill: UIColor(rgb: 0x2a2a2a), stroke: UIColor(rgb: 0x1f1f1f))), infoPrimaryTextColor: .white, infoLinkTextColor: accentColor, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index 34988cef6d..3c58a98a8c 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -180,8 +180,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta let buttonStrokeColor = accentColor.withMultiplied(hue: 1.014, saturation: 0.56, brightness: 0.64).withAlphaComponent(0.15) let message = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: accentColor, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.585, brightness: 0.23), polls: PresentationThemeChatBubblePolls(radioButton: accentColor.withMultiplied(hue: 0.995, saturation: 0.317, brightness: 0.51), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: mainSeparatorColor, bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: .white, accentControlColor: .white, mediaActiveControlColor: .white, mediaInactiveControlColor: UIColor(rgb: 0xffffff, alpha: 0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: .white, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.804, brightness: 0.51), polls: PresentationThemeChatBubblePolls(radioButton: .white, radioProgress: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0), highlight: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0).withAlphaComponent(0.12), separator: mainSeparatorColor, bar: .white), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: accentColor.withAlphaComponent(0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: accentColor, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.585, brightness: 0.23), polls: PresentationThemeChatBubblePolls(radioButton: accentColor.withMultiplied(hue: 0.995, saturation: 0.317, brightness: 0.51), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: mainSeparatorColor, bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.2), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleColor, highlightedFill: highlightedOutgoingBubbleColor, stroke: outgoingBubbleColor)), primaryTextColor: .white, secondaryTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), linkTextColor: accentColor, linkHighlightColor: accentColor.withAlphaComponent(0.5), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: .white, accentControlColor: .white, mediaActiveControlColor: .white, mediaInactiveControlColor: UIColor(rgb: 0xffffff, alpha: 0.5), pendingActivityColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileTitleColor: .white, fileDescriptionColor: mainSecondaryTextColor.withAlphaComponent(0.5), fileDurationColor: mainSecondaryTextColor.withAlphaComponent(0.5), mediaPlaceholderColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.804, brightness: 0.51), polls: PresentationThemeChatBubblePolls(radioButton: .white, radioProgress: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0), highlight: accentColor.withMultiplied(hue: 0.99, saturation: 0.56, brightness: 1.0).withAlphaComponent(0.12), separator: mainSeparatorColor, bar: .white), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: additionalBackgroundColor.withAlphaComponent(0.5), withoutWallpaper: additionalBackgroundColor.withAlphaComponent(0.5)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: buttonStrokeColor), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: UIColor.white.withAlphaComponent(0.2), textSelectionKnobColor: UIColor.white), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: mainBackgroundColor, highlightedFill: highlightedIncomingBubbleColor, stroke: mainBackgroundColor)), infoPrimaryTextColor: UIColor(rgb: 0xffffff), infoLinkTextColor: accentColor, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 4811caa63a..fc215e40c9 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -17,6 +17,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let outgoingControlColor: UIColor let outgoingBubbleFillColor: UIColor let outgoingBubbleStrokeColor: UIColor + let outgoingSelectionBaseColor: UIColor if accentColor.lightness > 0.705 { outgoingPrimaryTextColor = .black outgoingSecondaryTextColor = UIColor(rgb: 0x000000, alpha: 0.55) @@ -32,6 +33,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let hsv = accentColor.hsv accentColor = UIColor(hue: hsv.0, saturation: min(1.0, hsv.1 * 1.1), brightness: min(hsv.2, 0.6), alpha: 1.0) + outgoingSelectionBaseColor = accentColor } else { outgoingPrimaryTextColor = .white outgoingSecondaryTextColor = UIColor(rgb: 0xffffff, alpha: 0.65) @@ -40,6 +42,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr outgoingControlColor = outgoingPrimaryTextColor outgoingBubbleFillColor = accentColor outgoingBubbleStrokeColor = outgoingBubbleFillColor + outgoingSelectionBaseColor = .white } let rootTabBar = PresentationThemeRootTabBar( @@ -190,8 +193,8 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr ) let message = PresentationThemeChatMessage( - incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x007ee5), accentControlColor: UIColor(rgb: 0x007ee5), mediaActiveControlColor: UIColor(rgb: 0x007ee5), mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xe8ecf0), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: UIColor(rgb: 0x007ee5), highlight: UIColor(rgb: 0x007ee5).withAlphaComponent(0.08), separator: UIColor(rgb: 0xc8c7cc), bar: UIColor(rgb: 0x007ee5)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE1FFC7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xe1ffc7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x008c09, alpha: 0.8), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x00a700), accentControlColor: UIColor(rgb: 0x3fc33b), mediaActiveControlColor: UIColor(rgb: 0x3fc33b), mediaInactiveControlColor: UIColor(rgb: 0x93d987), pendingActivityColor: UIColor(rgb: 0x42b649), fileTitleColor: UIColor(rgb: 0x3faa3c), fileDescriptionColor: UIColor(rgb: 0x6fb26a), fileDurationColor: UIColor(rgb: 0x008c09, alpha: 0.8), mediaPlaceholderColor: UIColor(rgb: 0xd2f2b6), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x93d987), radioProgress: UIColor(rgb: 0x3fc33b), highlight: UIColor(rgb: 0x3fc33b).withAlphaComponent(0.08), separator: UIColor(rgb: 0x93d987), bar: UIColor(rgb: 0x3fc33b)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x007ee5), accentControlColor: UIColor(rgb: 0x007ee5), mediaActiveControlColor: UIColor(rgb: 0x007ee5), mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: UIColor(rgb: 0x0b8bed), fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xe8ecf0), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: UIColor(rgb: 0x007ee5), highlight: UIColor(rgb: 0x007ee5).withAlphaComponent(0.08), separator: UIColor(rgb: 0xc8c7cc), bar: UIColor(rgb: 0x007ee5)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: accentColor.withAlphaComponent(0.2), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE1FFC7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xe1ffc7), highlightedFill: UIColor(rgb: 0xc8ffa6), stroke: UIColor(rgb: 0x86a9c9, alpha: 0.5))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x008c09, alpha: 0.8), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: UIColor(rgb: 0x00a700), accentControlColor: UIColor(rgb: 0x3fc33b), mediaActiveControlColor: UIColor(rgb: 0x3fc33b), mediaInactiveControlColor: UIColor(rgb: 0x93d987), pendingActivityColor: UIColor(rgb: 0x42b649), fileTitleColor: UIColor(rgb: 0x3faa3c), fileDescriptionColor: UIColor(rgb: 0x6fb26a), fileDurationColor: UIColor(rgb: 0x008c09, alpha: 0.8), mediaPlaceholderColor: UIColor(rgb: 0xd2f2b6), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0x93d987), radioProgress: UIColor(rgb: 0x3fc33b), highlight: UIColor(rgb: 0x3fc33b).withAlphaComponent(0.08), separator: UIColor(rgb: 0x93d987), bar: UIColor(rgb: 0x3fc33b)), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x596e89, alpha: 0.35)), actionButtonsStrokeColor: PresentationThemeVariableColor(color: .clear), actionButtonsTextColor: PresentationThemeVariableColor(color: .white), textSelectionColor: UIColor(rgb: 0xBBDE9F), textSelectionKnobColor: UIColor(rgb: 0x3FC33B)), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xd9f4ff), stroke: UIColor(rgb: 0x86A9C9, alpha: 0.5))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), @@ -209,7 +212,7 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr let messageDay = PresentationThemeChatMessage( incoming: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xffffff), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xffffff)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xf1f1f4), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xf1f1f4))), primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x525252, alpha: 0.6), linkTextColor: UIColor(rgb: 0x004bad), linkHighlightColor: accentColor.withAlphaComponent(0.3), scamColor: destructiveColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: accentColor, accentControlColor: accentColor, mediaActiveControlColor: accentColor, mediaInactiveControlColor: UIColor(rgb: 0xcacaca), pendingActivityColor: UIColor(rgb: 0x525252, alpha: 0.6), fileTitleColor: accentColor, fileDescriptionColor: UIColor(rgb: 0x999999), fileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), mediaPlaceholderColor: UIColor(rgb: 0xffffff).withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: UIColor(rgb: 0xc8c7cc), radioProgress: accentColor, highlight: accentColor.withAlphaComponent(0.12), separator: UIColor(rgb: 0xc8c7cc), bar: accentColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), - outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleStrokeColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor), textSelectionColor: accentColor.withAlphaComponent(0.3), textSelectionKnobColor: accentColor), + outgoing: PresentationThemePartedColors(bubble: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleFillColor), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: outgoingBubbleFillColor, highlightedFill: outgoingBubbleFillColor.withMultipliedBrightnessBy(0.7), stroke: outgoingBubbleStrokeColor)), primaryTextColor: outgoingPrimaryTextColor, secondaryTextColor: outgoingSecondaryTextColor, linkTextColor: outgoingLinkTextColor, linkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.3), scamColor: outgoingPrimaryTextColor, textHighlightColor: UIColor(rgb: 0xffe438), accentTextColor: outgoingPrimaryTextColor, accentControlColor: outgoingPrimaryTextColor, mediaActiveControlColor: outgoingPrimaryTextColor, mediaInactiveControlColor: outgoingSecondaryTextColor, pendingActivityColor: outgoingSecondaryTextColor, fileTitleColor: outgoingPrimaryTextColor, fileDescriptionColor: outgoingSecondaryTextColor, fileDurationColor: outgoingSecondaryTextColor, mediaPlaceholderColor: accentColor.withMultipliedBrightnessBy(0.95), polls: PresentationThemeChatBubblePolls(radioButton: outgoingSecondaryTextColor, radioProgress: outgoingPrimaryTextColor, highlight: outgoingPrimaryTextColor.withAlphaComponent(0.12), separator: outgoingSecondaryTextColor, bar: outgoingPrimaryTextColor), actionButtonsFillColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), actionButtonsStrokeColor: PresentationThemeVariableColor(withWallpaper: .clear, withoutWallpaper: accentColor), actionButtonsTextColor: PresentationThemeVariableColor(withWallpaper: .white, withoutWallpaper: accentColor), textSelectionColor: outgoingSelectionBaseColor.withAlphaComponent(0.2), textSelectionKnobColor: outgoingSelectionBaseColor), freeform: PresentationThemeBubbleColor(withWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xDADADE), stroke: UIColor(rgb: 0xE5E5EA)), withoutWallpaper: PresentationThemeBubbleColorComponents(fill: UIColor(rgb: 0xE5E5EA), highlightedFill: UIColor(rgb: 0xdadade), stroke: UIColor(rgb: 0xE5E5EA))), infoPrimaryTextColor: UIColor(rgb: 0x000000), infoLinkTextColor: UIColor(rgb: 0x004bad), From 0ce567fe1869a4d8cf09bcc08d5c9b4e5992b7d1 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Wed, 28 Aug 2019 23:21:53 +0400 Subject: [PATCH 59/86] Fix context menu scrolling --- submodules/ContextUI/Sources/ContextController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 4625c2dae1..8caa10449c 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -684,6 +684,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let result = contentParentNode.contentNode.hitTest(contentPoint, with: event) { if result is TextSelectionNodeView { return result + } else if contentParentNode.contentRect.contains(contentPoint) { + return contentParentNode.contentNode.view } } } From 50c80f4daa1890b4c91100674e1f8cd528525366 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 04:13:04 +0400 Subject: [PATCH 60/86] Fix 3d touch --- .../Display/NavigationController.swift | 2 +- .../Display/Display/PresentationContext.swift | 105 ++++-------- .../Display/Display/StatusBarHost.swift | 4 +- .../Display/Display/StatusBarManager.swift | 31 ++-- .../Display/Display/ViewController.swift | 2 +- .../Display/Display/WindowContent.swift | 160 +++--------------- .../TelegramUI/TelegramUI/AppDelegate.swift | 6 +- 7 files changed, 70 insertions(+), 240 deletions(-) diff --git a/submodules/Display/Display/NavigationController.swift b/submodules/Display/Display/NavigationController.swift index af76cee0d4..fe6037e137 100644 --- a/submodules/Display/Display/NavigationController.swift +++ b/submodules/Display/Display/NavigationController.swift @@ -715,7 +715,7 @@ open class NavigationController: UINavigationController, ContainableController, self.loadView() } self.validLayout = layout - //transition.updateFrame(view: self.view, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) + transition.updateFrame(view: self.view, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) self.updateControllerLayouts(previousControllers: self._viewControllers, layout: layout, transition: transition) diff --git a/submodules/Display/Display/PresentationContext.swift b/submodules/Display/Display/PresentationContext.swift index 1896af3593..6421425520 100644 --- a/submodules/Display/Display/PresentationContext.swift +++ b/submodules/Display/Display/PresentationContext.swift @@ -34,8 +34,9 @@ public final class PresentationContext { } } + weak var volumeControlStatusBarNodeView: UIView? + var updateIsInteractionBlocked: ((Bool) -> Void)? - var updateHasBlocked: ((Bool) -> Void)? var updateHasOpaqueOverlay: ((Bool) -> Void)? private(set) var hasOpaqueOverlay: Bool = false { @@ -46,9 +47,6 @@ public final class PresentationContext { } } - private var modalPresentationValue: CGFloat = 0.0 - var updateModalTransition: ((CGFloat, ContainedViewLayoutTransition) -> Void)? - private var layout: ContainerViewLayout? private var ready: Bool { @@ -122,18 +120,6 @@ public final class PresentationContext { } } - private func layoutForController(containerLayout: ContainerViewLayout, controller: ContainableController) -> (ContainerViewLayout, CGRect) { - if controller.isModalWhenInOverlay { - let topInset = (containerLayout.statusBarHeight ?? 0.0) + 20.0 - var updatedLayout = containerLayout - updatedLayout.statusBarHeight = nil - updatedLayout.size.height -= topInset - return (updatedLayout, CGRect(origin: CGPoint(x: 0.0, y: topInset), size: updatedLayout.size)) - } else { - return (containerLayout, CGRect(origin: CGPoint(), size: containerLayout.size)) - } - } - public func present(_ controller: ContainableController, on level: PresentationSurfaceLevel, blockInteraction: Bool = false, completion: @escaping () -> Void) { let controllerReady = controller.ready.get() |> filter({ $0 }) @@ -154,9 +140,8 @@ public final class PresentationContext { controller.supportedOrientations = ViewControllerSupportedOrientations(regularSize: orientations, compactSize: orientations) } } - let (controllerLayout, controllerFrame) = self.layoutForController(containerLayout: initialLayout, controller: controller) - controller.view.frame = controllerFrame - controller.containerLayoutUpdated(controllerLayout, transition: .immediate) + controller.view.frame = CGRect(origin: CGPoint(), size: initialLayout.size) + controller.containerLayoutUpdated(initialLayout, transition: .immediate) var blockInteractionToken: Int? if blockInteraction { blockInteractionToken = self.addBlockInteraction() @@ -185,32 +170,37 @@ public final class PresentationContext { } strongSelf.controllers.insert((controller, level), at: insertIndex ?? strongSelf.controllers.count) if let view = strongSelf.view, let layout = strongSelf.layout { - let (updatedControllerLayout, updatedControllerFrame) = strongSelf.layoutForController(containerLayout: layout, controller: controller) - (controller as? UIViewController)?.navigation_setDismiss({ [weak controller] in if let strongSelf = self, let controller = controller { strongSelf.dismiss(controller) } }, rootController: nil) (controller as? UIViewController)?.setIgnoreAppearanceMethodInvocations(true) - if updatedControllerLayout != controllerLayout { - controller.view.frame = updatedControllerFrame + if layout != initialLayout { + controller.view.frame = CGRect(origin: CGPoint(), size: layout.size) if let topLevelSubview = strongSelf.topLevelSubview(for: level) { view.insertSubview(controller.view, belowSubview: topLevelSubview) } else { - view.addSubview(controller.view) + if let volumeControlStatusBarNodeView = strongSelf.volumeControlStatusBarNodeView { + view.insertSubview(controller.view, belowSubview: volumeControlStatusBarNodeView) + } else { + view.addSubview(controller.view) + } } - controller.containerLayoutUpdated(updatedControllerLayout, transition: .immediate) + controller.containerLayoutUpdated(layout, transition: .immediate) } else { if let topLevelSubview = strongSelf.topLevelSubview(for: level) { view.insertSubview(controller.view, belowSubview: topLevelSubview) } else { - view.addSubview(controller.view) + if let volumeControlStatusBarNodeView = strongSelf.volumeControlStatusBarNodeView { + view.insertSubview(controller.view, belowSubview: volumeControlStatusBarNodeView) + } else { + view.addSubview(controller.view) + } } } (controller as? UIViewController)?.setIgnoreAppearanceMethodInvocations(false) view.layer.invalidateUpTheTree() - strongSelf.updateViews() controller.viewWillAppear(false) if let controller = controller as? PresentableController { controller.viewDidAppear(completion: { [weak self] in @@ -221,6 +211,7 @@ public final class PresentationContext { strongSelf.notifyAccessibilityScreenChanged() } } + strongSelf.updateViews() } })) } else { @@ -234,7 +225,7 @@ public final class PresentationContext { } private func dismiss(_ controller: ContainableController) { - if let index = self.controllers.firstIndex(where: { $0.0 === controller }) { + if let index = self.controllers.index(where: { $0.0 === controller }) { self.controllers.remove(at: index) controller.viewWillDisappear(false) controller.view.removeFromSuperview() @@ -251,9 +242,7 @@ public final class PresentationContext { self.readyChanged(wasReady: wasReady) } else if self.ready { for (controller, _) in self.controllers { - let (controllerLayout, controllerFrame) = self.layoutForController(containerLayout: layout, controller: controller) - controller.view.frame = controllerFrame - controller.containerLayoutUpdated(controllerLayout, transition: transition) + controller.containerLayoutUpdated(layout, transition: transition) } } } @@ -273,11 +262,14 @@ public final class PresentationContext { if let topLevelSubview = self.topLevelSubview { view.insertSubview(controller.view, belowSubview: topLevelSubview) } else { - view.addSubview(controller.view) + if let volumeControlStatusBarNodeView = self.volumeControlStatusBarNodeView { + view.insertSubview(controller.view, belowSubview: volumeControlStatusBarNodeView) + } else { + view.addSubview(controller.view) + } } - let (controllerLayout, controllerFrame) = self.layoutForController(containerLayout: layout, controller: controller) - controller.view.frame = controllerFrame - controller.containerLayoutUpdated(controllerLayout, transition: .immediate) + controller.view.frame = CGRect(origin: CGPoint(), size: layout.size) + controller.containerLayoutUpdated(layout, transition: .immediate) if let controller = controller as? PresentableController { controller.viewDidAppear(completion: { [weak self] in self?.notifyAccessibilityScreenChanged() @@ -299,18 +291,10 @@ public final class PresentationContext { } } - private weak var currentModalController: ContainableController? - private func updateViews() { self.hasOpaqueOverlay = self.currentlyBlocksBackgroundWhenInOverlay - var modalController: ContainableController? var topHasOpaque = false for (controller, _) in self.controllers.reversed() { - if controller.isModalWhenInOverlay { - if modalController == nil { - //modalController = controller - } - } if topHasOpaque { controller.displayNode.accessibilityElementsHidden = true } else { @@ -320,47 +304,16 @@ public final class PresentationContext { controller.displayNode.accessibilityElementsHidden = false } } - - if self.currentModalController !== modalController { - if let currentModalController = self.currentModalController { - currentModalController.updateTransitionWhenPresentedAsModal = nil - if #available(iOSApplicationExtension 11.0, *) { - currentModalController.displayNode.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner] - } - currentModalController.displayNode.layer.cornerRadius = 0.0 - } - self.currentModalController = modalController - if let modalController = modalController { - if #available(iOSApplicationExtension 11.0, *) { - modalController.displayNode.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] - } - modalController.displayNode.layer.cornerRadius = 10.0 - modalController.updateTransitionWhenPresentedAsModal = { [weak self, weak modalController] value, transition in - guard let strongSelf = self, let modalController = modalController, modalController === strongSelf.currentModalController else { - return - } - if strongSelf.modalPresentationValue != value { - strongSelf.modalPresentationValue = value - strongSelf.updateModalTransition?(value, transition) - } - } - } else { - if self.modalPresentationValue != 0.0 { - self.modalPresentationValue = 0.0 - self.updateModalTransition?(0.0, .animated(duration: 0.3, curve: .spring)) - } - } - } } private func notifyAccessibilityScreenChanged() { UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: nil) } - func hitTest(view: UIView, point: CGPoint, with event: UIEvent?) -> UIView? { + func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { for (controller, _) in self.controllers.reversed() { if controller.isViewLoaded { - if let result = controller.view.hitTest(view.convert(point, to: controller.view), with: event) { + if let result = controller.view.hitTest(point, with: event) { return result } } diff --git a/submodules/Display/Display/StatusBarHost.swift b/submodules/Display/Display/StatusBarHost.swift index a6653246e3..35a7299d4e 100644 --- a/submodules/Display/Display/StatusBarHost.swift +++ b/submodules/Display/Display/StatusBarHost.swift @@ -3,7 +3,7 @@ import SwiftSignalKit public protocol StatusBarHost { var statusBarFrame: CGRect { get } - var statusBarStyle: UIStatusBarStyle { get } + var statusBarStyle: UIStatusBarStyle { get set } var statusBarWindow: UIView? { get } var statusBarView: UIView? { get } @@ -11,6 +11,4 @@ public protocol StatusBarHost { var keyboardView: UIView? { get } var handleVolumeControl: Signal { get } - - func setStatusBarStyle(_ style: UIStatusBarStyle, animated: Bool) } diff --git a/submodules/Display/Display/StatusBarManager.swift b/submodules/Display/Display/StatusBarManager.swift index 1bcb1efe08..b051951bfd 100644 --- a/submodules/Display/Display/StatusBarManager.swift +++ b/submodules/Display/Display/StatusBarManager.swift @@ -76,7 +76,7 @@ class StatusBarManager { private let volumeControlStatusBarNode: VolumeControlStatusBarNode private var surfaces: [StatusBarSurface] = [] - private var validParams: (withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, UIStatusBarStyle?)? + private var validParams: (withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool)? var inCallNavigate: (() -> Void)? @@ -111,8 +111,8 @@ class StatusBarManager { self?.volumeControlStatusBarNode.allowsGroupOpacity = false }) } - if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows, forceAppearance) = self.validParams { - self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, forceAppearance: forceAppearance, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) + if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows) = self.validParams { + self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) } } @@ -126,24 +126,24 @@ class StatusBarManager { } }) self.volumeTimer = nil - if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows, forceAppearance) = self.validParams { - self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, forceAppearance: forceAppearance, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) + if let (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows) = self.validParams { + self.updateSurfaces(self.surfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: false, alphaTransition: .animated(duration: 0.2, curve: .easeInOut)) } } - func updateState(surfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, forceAppearance: UIStatusBarStyle?, animated: Bool) { + func updateState(surfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, animated: Bool) { let previousSurfaces = self.surfaces self.surfaces = surfaces - self.updateSurfaces(previousSurfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: animated, forceAppearance: forceAppearance, alphaTransition: .immediate) + self.updateSurfaces(previousSurfaces, withSafeInsets: withSafeInsets, forceInCallStatusBarText: forceInCallStatusBarText, forceHiddenBySystemWindows: forceHiddenBySystemWindows, animated: animated, alphaTransition: .immediate) } - private func updateSurfaces(_ previousSurfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, animated: Bool, forceAppearance: UIStatusBarStyle?, alphaTransition: ContainedViewLayoutTransition) { + private func updateSurfaces(_ previousSurfaces: [StatusBarSurface], withSafeInsets: Bool, forceInCallStatusBarText: String?, forceHiddenBySystemWindows: Bool, animated: Bool, alphaTransition: ContainedViewLayoutTransition) { let statusBarFrame = self.host.statusBarFrame guard let statusBarView = self.host.statusBarView else { return } - self.validParams = (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows, forceAppearance) + self.validParams = (withSafeInsets, forceInCallStatusBarText, forceHiddenBySystemWindows) if self.host.statusBarWindow?.isUserInteractionEnabled != (forceInCallStatusBarText == nil) { self.host.statusBarWindow?.isUserInteractionEnabled = (forceInCallStatusBarText == nil) @@ -278,17 +278,6 @@ class StatusBarManager { } self.volumeControlStatusBarNode.isDark = isDark - if let forceAppearance = forceAppearance { - let style: StatusBarStyle - switch forceAppearance { - case .lightContent: - style = .White - default: - style = .Black - } - globalStatusBar = (style, 1.0, 0.0) - } - if let globalStatusBar = globalStatusBar, !forceHiddenBySystemWindows { let statusBarStyle: UIStatusBarStyle if forceInCallStatusBarText != nil { @@ -297,7 +286,7 @@ class StatusBarManager { statusBarStyle = globalStatusBar.0 == .Black ? .default : .lightContent } if self.host.statusBarStyle != statusBarStyle { - self.host.setStatusBarStyle(statusBarStyle, animated: animated) + self.host.statusBarStyle = statusBarStyle } if let statusBarWindow = self.host.statusBarWindow { alphaTransition.updateAlpha(layer: statusBarView.layer, alpha: globalStatusBar.1) diff --git a/submodules/Display/Display/ViewController.swift b/submodules/Display/Display/ViewController.swift index 67decf1bad..bdaa155448 100644 --- a/submodules/Display/Display/ViewController.swift +++ b/submodules/Display/Display/ViewController.swift @@ -340,7 +340,7 @@ open class ViewControllerPresentationArguments { if !self.isViewLoaded { self.loadView() } - //transition.updateFrame(node: self.displayNode, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) + transition.updateFrame(node: self.displayNode, frame: CGRect(origin: self.view.frame.origin, size: layout.size)) if let _ = layout.statusBarHeight { self.statusBar.frame = CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: 40.0)) } diff --git a/submodules/Display/Display/WindowContent.swift b/submodules/Display/Display/WindowContent.swift index cf0342181e..181fd6f4ca 100644 --- a/submodules/Display/Display/WindowContent.swift +++ b/submodules/Display/Display/WindowContent.swift @@ -344,6 +344,10 @@ public class Window1 { private var isInteractionBlocked = false + /*private var accessibilityElements: [Any]? { + return self.viewController?.view.accessibilityElements + }*/ + public init(hostView: WindowHostView, statusBarHost: StatusBarHost?) { self.hostView = hostView @@ -373,8 +377,6 @@ public class Window1 { self.presentationContext = PresentationContext() self.overlayPresentationContext = GlobalOverlayPresentationContext(statusBarHost: statusBarHost, parentView: self.hostView.aboveStatusBarView) - self.presentationContextContainerView = UIView() - self.presentationContext.updateIsInteractionBlocked = { [weak self] value in self?.isInteractionBlocked = value } @@ -383,10 +385,6 @@ public class Window1 { self?._rootController?.displayNode.accessibilityElementsHidden = value } - self.presentationContext.updateModalTransition = { [weak self] value, transition in - self?.updateModalTransition(value, transition: transition) - } - self.hostView.present = { [weak self] controller, level, blockInteraction, completion in self?.present(controller, on: level, blockInteraction: blockInteraction, completion: completion) } @@ -442,7 +440,12 @@ public class Window1 { }) } - self.presentationContext.view = self.presentationContextContainerView + /*self.hostView.getAccessibilityElements = { [weak self] in + return self?.accessibilityElements + }*/ + + self.presentationContext.view = self.hostView.containerView + self.presentationContext.volumeControlStatusBarNodeView = self.volumeControlStatusBarNode.view self.presentationContext.containerLayoutUpdated(containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation), transition: .immediate) self.overlayPresentationContext.containerLayoutUpdated(containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation), transition: .immediate) @@ -564,8 +567,6 @@ public class Window1 { self.windowPanRecognizer = recognizer self.hostView.containerView.addGestureRecognizer(recognizer) - self.hostView.containerView.addSubview(self.presentationContextContainerView) - self.hostView.containerView.addSubview(self.volumeControlStatusBar) self.hostView.containerView.addSubview(self.volumeControlStatusBarNode.view) } @@ -667,7 +668,7 @@ public class Window1 { } } - if let result = self.presentationContext.hitTest(view: self.hostView.containerView, point: point, with: event) { + if let result = self.presentationContext.hitTest(point, with: event) { return result } return self.viewController?.view.hitTest(point, with: event) @@ -696,19 +697,7 @@ public class Window1 { if let rootController = self._rootController { if !self.windowLayout.size.width.isZero && !self.windowLayout.size.height.isZero { - let rootLayout = containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation) - var positionOffset: CGFloat = 0.0 - if !self.appliedModalLevel.isZero { - let scale = ((rootLayout.size.width - 20.0 * 2.0) / rootLayout.size.width) - rootController.displayNode.transform = CATransform3DMakeScale(scale, scale, 1.0) - let transformedUpperBound = (self.windowLayout.size.height - rootLayout.size.height * scale) / 2.0 - let targetBound = (self.windowLayout.statusBarHeight ?? 0.0) + 20.0 - 10.0 - positionOffset = targetBound - transformedUpperBound - } - rootController.displayNode.position = CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0 + positionOffset) - rootController.displayNode.bounds = CGRect(origin: CGPoint(), size: rootLayout.size) - rootController.containerLayoutUpdated(rootLayout, transition: .immediate) - rootController.updateModalTransition(self.appliedModalLevel, transition: .immediate) + rootController.containerLayoutUpdated(containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation), transition: .immediate) } self.hostView.containerView.insertSubview(rootController.view, at: 0) @@ -718,26 +707,6 @@ public class Window1 { } } - private func insertContentViewAtTop(_ view: UIView) { - if let dimView = self.dimView { - self.hostView.containerView.insertSubview(view, belowSubview: dimView) - } else { - self.hostView.containerView.insertSubview(view, belowSubview: self.presentationContextContainerView) - } - } - - private func insertCoveringView(_ view: UIView) { - self.hostView.containerView.insertSubview(view, belowSubview: self.volumeControlStatusBarNode.view) - } - - private func insertDimView(_ view: UIView) { - if let coveringView = self.coveringView { - self.hostView.containerView.insertSubview(view, belowSubview: coveringView) - } else { - self.hostView.containerView.insertSubview(view, belowSubview: self.presentationContextContainerView) - } - } - private var _topLevelOverlayControllers: [ContainableController] = [] public var topLevelOverlayControllers: [ContainableController] { get { @@ -752,17 +721,18 @@ public class Window1 { let layout = containedLayoutForWindowLayout(self.windowLayout, hasOnScreenNavigation: self.hostView.hasOnScreenNavigation) for controller in self._topLevelOverlayControllers { controller.containerLayoutUpdated(layout, transition: .immediate) - self.insertContentViewAtTop(controller.view) + + if let coveringView = self.coveringView { + self.hostView.containerView.insertSubview(controller.view, belowSubview: coveringView) + } else { + self.hostView.containerView.insertSubview(controller.view, belowSubview: self.volumeControlStatusBarNode.view) + } } self.presentationContext.topLevelSubview = self._topLevelOverlayControllers.first?.view } } - private var dimView: UIView? = nil - - private let presentationContextContainerView: UIView - public var coveringView: WindowCoveringView? { didSet { if self.coveringView !== oldValue { @@ -776,7 +746,7 @@ public class Window1 { coveringView.layer.removeAnimation(forKey: "opacity") coveringView.layer.allowsGroupOpacity = false coveringView.alpha = 1.0 - self.insertCoveringView(coveringView) + self.hostView.containerView.insertSubview(coveringView, belowSubview: self.volumeControlStatusBarNode.view) if !self.windowLayout.size.width.isZero { coveringView.frame = CGRect(origin: CGPoint(), size: self.windowLayout.size) coveringView.updateLayout(self.windowLayout.size) @@ -786,8 +756,6 @@ public class Window1 { } } - private var appliedModalLevel: CGFloat = 0.0 - private func layoutSubviews() { var hasPreview = false var updatedHasPreview = false @@ -803,19 +771,11 @@ public class Window1 { updatedHasPreview = true } - var modalLevelUpdated = false - if self.appliedModalLevel != self.modalTransition { - modalLevelUpdated = self.appliedModalLevel.isZero != self.modalTransition.isZero - self.appliedModalLevel = self.modalTransition - } - - if self.tracingStatusBarsInvalidated || updatedHasPreview || modalLevelUpdated, let statusBarManager = statusBarManager, let keyboardManager = keyboardManager { + if self.tracingStatusBarsInvalidated || updatedHasPreview, let statusBarManager = statusBarManager, let keyboardManager = keyboardManager { self.tracingStatusBarsInvalidated = false if self.statusBarHidden { - statusBarManager.updateState(surfaces: [], withSafeInsets: false, forceInCallStatusBarText: nil, forceHiddenBySystemWindows: false, forceAppearance: nil, animated: false) - } else if !self.modalTransition.isZero || self.isInTransitionOutOfModal { - statusBarManager.updateState(surfaces: [], withSafeInsets: false, forceInCallStatusBarText: nil, forceHiddenBySystemWindows: false, forceAppearance: self.isInTransitionOutOfModal ? .default : .lightContent, animated: modalLevelUpdated) + statusBarManager.updateState(surfaces: [], withSafeInsets: false, forceInCallStatusBarText: nil, forceHiddenBySystemWindows: false, animated: false) } else { var statusBarSurfaces: [StatusBarSurface] = [] for layers in self.hostView.containerView.layer.traceableLayerSurfaces(withTag: WindowTracingTags.statusBar) { @@ -836,7 +796,7 @@ public class Window1 { } } self.cachedWindowSubviewCount = self.hostView.containerView.window?.subviews.count ?? 0 - statusBarManager.updateState(surfaces: statusBarSurfaces, withSafeInsets: !self.windowLayout.safeInsets.top.isZero, forceInCallStatusBarText: self.forceInCallStatusBarText, forceHiddenBySystemWindows: hasPreview, forceAppearance: nil, animated: animatedUpdate || modalLevelUpdated) + statusBarManager.updateState(surfaces: statusBarSurfaces, withSafeInsets: !self.windowLayout.safeInsets.top.isZero, forceInCallStatusBarText: self.forceInCallStatusBarText, forceHiddenBySystemWindows: hasPreview, animated: animatedUpdate) } var keyboardSurfaces: [KeyboardSurface] = [] @@ -1009,31 +969,13 @@ public class Window1 { let childLayoutUpdated = self.updatedContainerLayout != childLayout self.updatedContainerLayout = childLayout - updatingLayout.transition.updateFrame(view: self.presentationContextContainerView, frame: CGRect(origin: CGPoint(), size: self.windowLayout.size)) - if let dimView = self.dimView { - updatingLayout.transition.updateFrame(view: dimView, frame: CGRect(origin: CGPoint(), size: self.windowLayout.size)) - } - if childLayoutUpdated { var rootLayout = childLayout let rootTransition = updatingLayout.transition if self.presentationContext.isCurrentlyOpaque { rootLayout.inputHeight = nil } - var positionOffset: CGFloat = 0.0 - if let rootController = self._rootController { - if !self.modalTransition.isZero { - let scale = (rootLayout.size.width - 20.0 * 2.0) / rootLayout.size.width - rootTransition.updateTransformScale(node: rootController.displayNode, scale: scale) - - let transformedUpperBound = (self.windowLayout.size.height - rootLayout.size.height * scale) / 2.0 - let targetBound = (self.windowLayout.statusBarHeight ?? 0.0) + 20.0 - 10.0 - positionOffset = targetBound - transformedUpperBound - } - rootTransition.updatePosition(node: rootController.displayNode, position: CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0 + positionOffset)) - rootTransition.updateBounds(node: rootController.displayNode, bounds: CGRect(origin: CGPoint(), size: rootLayout.size)) - rootController.containerLayoutUpdated(rootLayout, transition: rootTransition) - } + self._rootController?.containerLayoutUpdated(rootLayout, transition: rootTransition) self.presentationContext.containerLayoutUpdated(childLayout, transition: updatingLayout.transition) self.overlayPresentationContext.containerLayoutUpdated(childLayout, transition: updatingLayout.transition) @@ -1066,62 +1008,6 @@ public class Window1 { } } - private var modalTransition: CGFloat = 0.0 - private var defaultBackgroundColor: UIColor? - private var isInTransitionOutOfModal: Bool = false - - private func updateModalTransition(_ value: CGFloat, transition: ContainedViewLayoutTransition) { - self.modalTransition = value - if !value.isZero { - if self.dimView == nil { - let dimView = UIView() - dimView.frame = CGRect(origin: CGPoint(), size: self.windowLayout.size) - dimView.backgroundColor = UIColor(white: 0.0, alpha: 0.5) - self.dimView = dimView - self.insertDimView(dimView) - dimView.alpha = 0.0 - transition.updateAlpha(layer: dimView.layer, alpha: 1.0) - - self.defaultBackgroundColor = self.hostView.containerView.backgroundColor - self.hostView.containerView.backgroundColor = .black - - var positionOffset: CGFloat = 0.0 - if let rootController = self._rootController { - let rootSize = rootController.displayNode.bounds.size - let scale = (rootSize.width - 20.0 * 2.0) / rootSize.width - transition.updateTransformScale(node: rootController.displayNode, scale: scale) - - let transformedUpperBound = (self.windowLayout.size.height - rootSize.height * scale) / 2.0 - let targetBound = (self.windowLayout.statusBarHeight ?? 0.0) + 20.0 - 10.0 - positionOffset = targetBound - transformedUpperBound - - transition.updatePosition(node: rootController.displayNode, position: CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0 + positionOffset)) - rootController.updateModalTransition(value, transition: transition) - } - self.layoutSubviews() - } - } else { - if let dimView = self.dimView { - self.dimView = nil - self.isInTransitionOutOfModal = true - transition.updateAlpha(layer: dimView.layer, alpha: 0.0, completion: { [weak self, weak dimView] _ in - dimView?.removeFromSuperview() - if let strongSelf = self { - strongSelf.hostView.containerView.backgroundColor = strongSelf.defaultBackgroundColor - strongSelf.isInTransitionOutOfModal = false - strongSelf.layoutSubviews() - } - }) - if let rootController = self._rootController { - transition.updateTransformScale(node: rootController.displayNode, scale: 1.0) - transition.updatePosition(node: rootController.displayNode, position: CGPoint(x: self.windowLayout.size.width / 2.0, y: self.windowLayout.size.height / 2.0)) - rootController.updateModalTransition(0.0, transition: transition) - } - self.layoutSubviews() - } - } - } - public func present(_ controller: ContainableController, on level: PresentationSurfaceLevel, blockInteraction: Bool = false, completion: @escaping () -> Void = {}) { self.presentationContext.present(controller, on: level, blockInteraction: blockInteraction, completion: completion) } diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index 7cadafdf72..d0b273b117 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -57,7 +57,11 @@ private class ApplicationStatusBarHost: StatusBarHost { return self.application.statusBarFrame } var statusBarStyle: UIStatusBarStyle { - return self.application.statusBarStyle + get { + return self.application.statusBarStyle + } set(value) { + self.setStatusBarStyle(value, animated: false) + } } func setStatusBarStyle(_ style: UIStatusBarStyle, animated: Bool) { From f3db3a29b017b07cdb8a04dcaafce366b6d76773 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 29 Aug 2019 05:31:34 +0300 Subject: [PATCH 61/86] Cloud themes improvements --- Telegram-iOS/Info.plist | 29 + .../Telegram-iOS-AppStoreLLC.entitlements | 2 - Telegram-iOS/en.lproj/Localizable.strings | 20 +- .../BotCheckoutPasswordEntryController.swift | 2 +- .../Sources/BotPaymentCardInputItemNode.swift | 2 +- .../Sources/BotPaymentFieldItemNode.swift | 4 +- .../Sources/CreatePollOptionItem.swift | 2 +- .../ContextUI/Sources/ContextController.swift | 2 +- .../ChatItemGalleryFooterContentNode.swift | 13 +- .../Items/UniversalVideoGalleryItem.swift | 2 +- .../Sources/ItemListAvatarAndNameItem.swift | 2 +- .../Items/ItemListMultilineInputItem.swift | 2 +- .../Items/ItemListSingleLineInputItem.swift | 51 +- .../project.pbxproj | 4 + .../Sources/LegacyICloudFilePicker.swift} | 36 +- .../Sources/PasscodeSetupControllerNode.swift | 2 +- .../Form/FormControllerTextInputItem.swift | 2 +- ...ecureIdAuthPasswordOptionContentNode.swift | 4 +- .../Sources/SecureIdValueFormPhoneItem.swift | 4 +- .../SetupTwoStepVerificationContentNode.swift | 4 +- .../Sources/ChannelAdminController.swift | 2 +- .../Sources/ChannelInfoController.swift | 2 +- .../ChannelOwnershipTransferController.swift | 4 +- .../Sources/ChannelStatsControllerNode.swift | 2 +- .../Sources/ChannelVisibilityController.swift | 2 +- .../GroupStickerPackSetupController.swift | 2 +- .../Sources/UserInfoEditingPhoneItem.swift | 4 +- .../SearchBarNode/Sources/SearchBarNode.swift | 2 +- .../ChangePhoneNumberControllerNode.swift | 4 +- .../TabBarAccountSwitchControllerNode.swift | 8 +- .../Sources/Themes/EditThemeController.swift | 359 +- .../Themes/ThemePreviewController.swift | 2 +- .../Themes/ThemeSettingsController.swift | 92 +- .../Themes/ThemeSettingsThemeItem.swift | 2 +- .../Themes/WallpaperColorPanelNode.swift | 4 +- .../Sources/UsernameSetupController.swift | 2 +- .../Sources/ShareInputFieldNode.swift | 2 +- .../Sources/ShareSearchBarNode.swift | 2 +- .../TelegramCore/AccountManager.swift | 1 + .../TelegramCore/Namespaces.swift | 7 + .../TelegramCore/TelegramCore/Themes.swift | 57 +- .../DefaultDarkPresentationTheme.swift | 7 +- .../DefaultDarkTintedPresentationTheme.swift | 5 +- .../Sources/DefaultDayPresentationTheme.swift | 5 +- .../Sources/MakePresentationTheme.swift | 2 +- .../Sources/PresentationStrings.swift | 5575 +++++++++-------- .../Sources/PresentationTheme.swift | 33 +- .../Sources/PresentationThemeCodable.swift | 26 +- .../Sources/PresentationThemeCoder.swift | 9 +- .../TelegramUI/ApplicationContext.swift | 4 +- ...ationSequenceCodeEntryControllerNode.swift | 2 +- ...nSequencePasswordEntryControllerNode.swift | 2 +- ...quencePasswordRecoveryControllerNode.swift | 2 +- ...tionSequencePhoneEntryControllerNode.swift | 4 +- ...rizationSequenceSignUpControllerNode.swift | 4 +- .../TelegramUI/ChatController.swift | 4 +- ...SendMessageActionSheetControllerNode.swift | 4 +- .../TelegramUI/ChatTextInputPanelNode.swift | 4 +- .../ChatTextLinkEditController.swift | 4 +- .../ContactMultiselectionControllerNode.swift | 2 +- .../TelegramUI/PaneSearchBarNode.swift | 2 +- .../Resources/PresentationStrings.mapping | Bin 125271 -> 125599 bytes .../project.pbxproj | 4 - .../Sources/PresentationThemeSettings.swift | 45 +- 64 files changed, 3452 insertions(+), 3048 deletions(-) rename submodules/{TelegramUI/TelegramUI/LegacyICloudFileController.swift => LegacyMediaPickerUI/Sources/LegacyICloudFilePicker.swift} (78%) diff --git a/Telegram-iOS/Info.plist b/Telegram-iOS/Info.plist index aa2d32990e..4de303bfb9 100644 --- a/Telegram-iOS/Info.plist +++ b/Telegram-iOS/Info.plist @@ -8,6 +8,11 @@ en CFBundleDisplayName ${APP_NAME} + CFBundleDocumentTypes + + + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIcons @@ -332,5 +337,29 @@ UIViewGroupOpacity + UTImportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Telegram iOS Color Theme File + UTTypeIconFiles + + BlueIcon@3x.png + + UTTypeIdentifier + org.telegram.Telegram-iOS.theme + UTTypeTagSpecification + + public.filename-extension + + tgios-theme + + + + diff --git a/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements b/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements index 6accd7694a..896fe795c9 100644 --- a/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements +++ b/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements @@ -33,7 +33,5 @@ merchant.privatbank.test.telergramios merchant.privatbank.prod.telergram - com.apple.developer.carplay-messaging - diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 43c3394ecd..6bdfa59924 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4660,19 +4660,27 @@ Any member of this group will be able to see messages in the channel."; "Appearance.CreateTheme" = "Create New Theme"; "Appearance.EditTheme" = "Edit Theme"; +"Appearance.ShareTheme" = "Share"; "Appearance.RemoveTheme" = "Remove"; -"Appearance.CreateThemeInfo" = "A new theme template has been created from your current theme and added to your Saved Messages."; +"Appearance.RemoveThemeConfirmation" = "Remove Theme"; "Conversation.Theme" = "Color Theme"; "Conversation.ViewTheme" = "VIEW THEME"; "Message.Theme" = "Color Theme"; -"EditTheme.Title" = "Edit Theme"; -"EditTheme.Preview" = "PREVIEW"; -"EditTheme.Title" = "Title"; -"EditTheme.ShortLink" = "Short Link"; -"EditTheme.ShortLinkInfo" = "Short Link"; +"EditTheme.CreateTitle" = "Create Theme"; +"EditTheme.EditTitle" = "Edit Theme"; +"EditTheme.Title" = "Theme Name"; +"EditTheme.ShortLink" = "link"; +"EditTheme.ShortLinkInfo" = "Short Link Info"; +"EditTheme.Preview" = "CHAT PREVIEW"; +"EditTheme.UploadNewTheme" = "Select a File..."; +"EditTheme.UploadEditedTheme" = "Select Updated File..."; +"EditTheme.UploadNewInfo" = "This theme will be based on your current theme and wallpaper. Otherwise, you can use a custom theme file if you already have one."; +"EditTheme.UploadEditedInfo" = "You can select a new file to update the theme. It will be updated for all users."; +"EditTheme.ThemeTemplateAlert" = "A copy of your theme template has been added to your Saved Messages."; +"EditTheme.FileReadError" = "Invalid theme file"; "Wallpaper.ErrorNotFound" = "Sorry, this chat background doesn't seem to exist."; "Theme.ErrorNotFound" = "Sorry, this color theme doesn't seem to exist."; diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift index a7422626cc..e089ff940b 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutPasswordEntryController.swift @@ -152,7 +152,7 @@ private final class BotCheckoutPasswordAlertContentNode: AlertContentNode { self.textFieldNode.textField.textColor = theme.actionSheet.primaryTextColor self.textFieldNode.textField.font = Font.regular(12.0) self.textFieldNode.textField.typingAttributes = [NSAttributedString.Key.font: Font.regular(12.0)] - self.textFieldNode.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textFieldNode.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.textFieldNode.textField.isSecureTextEntry = true self.textFieldNode.textField.tintColor = theme.list.itemAccentColor diff --git a/submodules/BotPaymentsUI/Sources/BotPaymentCardInputItemNode.swift b/submodules/BotPaymentsUI/Sources/BotPaymentCardInputItemNode.swift index 144944f6b2..8f89cc0093 100644 --- a/submodules/BotPaymentsUI/Sources/BotPaymentCardInputItemNode.swift +++ b/submodules/BotPaymentsUI/Sources/BotPaymentCardInputItemNode.swift @@ -42,7 +42,7 @@ final class BotPaymentCardInputItemNode: BotPaymentItemNode, STPPaymentCardTextF self.cardField.textColor = theme.list.itemPrimaryTextColor self.cardField.textErrorColor = theme.list.itemDestructiveColor self.cardField.placeholderColor = theme.list.itemPlaceholderTextColor - self.cardField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.cardField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance } self.cardField.frame = CGRect(origin: CGPoint(x: 5.0, y: 0.0), size: CGSize(width: width - 10.0, height: 44.0)) diff --git a/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift b/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift index 6226c05a11..18f8a9784d 100644 --- a/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift +++ b/submodules/BotPaymentsUI/Sources/BotPaymentFieldItemNode.swift @@ -79,7 +79,7 @@ final class BotPaymentFieldItemNode: BotPaymentItemNode, UITextFieldDelegate { self.titleNode.attributedText = NSAttributedString(string: self.title, font: titleFont, textColor: theme.list.itemPrimaryTextColor) self.textField.textField.textColor = theme.list.itemPrimaryTextColor self.textField.textField.attributedPlaceholder = NSAttributedString(string: placeholder, font: titleFont, textColor: theme.list.itemPlaceholderTextColor) - self.textField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textField.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.textField.textField.tintColor = theme.list.itemAccentColor } @@ -97,7 +97,7 @@ final class BotPaymentFieldItemNode: BotPaymentItemNode, UITextFieldDelegate { if self.theme !== theme { self.theme = theme self.titleNode.attributedText = NSAttributedString(string: self.title, font: titleFont, textColor: theme.list.itemPrimaryTextColor) - self.textField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textField.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.textField.textField.tintColor = theme.list.itemAccentColor } diff --git a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift index 6aa6af90e3..56b89d8a97 100644 --- a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift @@ -321,7 +321,7 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode, strongSelf.textNode.attributedPlaceholderText = attributedPlaceholderText } - strongSelf.textNode.keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + strongSelf.textNode.keyboardAppearance = item.theme.rootController.keyboardColor.keyboardAppearance strongSelf.textClippingNode.frame = CGRect(origin: CGPoint(x: revealOffset + leftInset, y: textTopInset), size: CGSize(width: params.width - leftInset - params.rightInset, height: textLayout.size.height)) strongSelf.textNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: params.width - leftInset - rightInset, height: textLayout.size.height + 1.0)) diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 6e7a6cc673..bd05e98474 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -93,7 +93,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi self.effectView = UIVisualEffectView() if #available(iOS 9.0, *) { } else { - if theme.chatList.searchBarKeyboardColor == .dark { + if theme.rootController.keyboardColor == .dark { self.effectView.effect = UIBlurEffect(style: .dark) } else { self.effectView.effect = UIBlurEffect(style: .light) diff --git a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift index febabad5f4..1d26d5c47d 100644 --- a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift +++ b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift @@ -17,8 +17,8 @@ import OpenInExternalAppUI private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white) -private let backwardImage = UIImage(bundleImageName: "Media Gallery/BackwardButton") -private let forwardImage = UIImage(bundleImageName: "Media Gallery/ForwardButton") +private let backwardImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/BackwardButton"), color: .white) +private let forwardImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/ForwardButton"), color: .white) private let pauseImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/PauseButton"), color: .white) private let playImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/PlayButton"), color: .white) @@ -600,8 +600,13 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.actionButton.frame = CGRect(origin: CGPoint(x: leftInset, y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) self.deleteButton.frame = CGRect(origin: CGPoint(x: width - 44.0 - rightInset, y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) - self.backwardButton.frame = CGRect(origin: CGPoint(x: floor((width - 44.0) / 2.0) - 66.0, y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) - self.forwardButton.frame = CGRect(origin: CGPoint(x: floor((width - 44.0) / 2.0) + 66.0, y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) + if let image = self.backwardButton.image(for: .normal) { + self.backwardButton.frame = CGRect(origin: CGPoint(x: floor((width - image.size.width) / 2.0) - 66.0, y: panelHeight - bottomInset - 44.0 + 7.0), size: image.size) + + } + if let image = self.forwardButton.image(for: .normal) { + self.forwardButton.frame = CGRect(origin: CGPoint(x: floor((width - image.size.width) / 2.0) + 66.0, y: panelHeight - bottomInset - 44.0 + 7.0), size: image.size) + } self.playbackControlButton.frame = CGRect(origin: CGPoint(x: floor((width - 44.0) / 2.0), y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 7281d6bfcb..f84bfaad60 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -473,7 +473,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } } - seekable = value.duration >= 45.0 + seekable = value.duration >= 30.0 } var fetching = false diff --git a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift index e16ca21c30..b730cb973e 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift +++ b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift @@ -672,7 +672,7 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo if strongSelf.inputSeparator == nil { animateIn = true } - let keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + let keyboardAppearance = item.theme.rootController.keyboardColor.keyboardAppearance switch editingName { case let .personName(firstName, lastName): if strongSelf.inputSeparator == nil { diff --git a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift index 1fb5e0f02b..28c7a274bc 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift @@ -251,7 +251,7 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod strongSelf.textNode.attributedPlaceholderText = attributedPlaceholderText } - strongSelf.textNode.keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + strongSelf.textNode.keyboardAppearance = item.theme.rootController.keyboardColor.keyboardAppearance strongSelf.textClippingNode.frame = CGRect(origin: CGPoint(x: leftInset, y: textTopInset), size: CGSize(width: params.width - leftInset - params.rightInset, height: textLayout.size.height)) strongSelf.textNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: params.width - leftInset - 16.0 - rightInset, height: textLayout.size.height + 1.0)) diff --git a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift index 8799de23b2..660d2fa35f 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift @@ -13,6 +13,21 @@ public enum ItemListSingleLineInputItemType: Equatable { case username } +public enum ItemListSingleLineInputClearType: Equatable { + case none + case always + case onFocus + + var hasButton: Bool { + switch self { + case .none: + return false + case .always, .onFocus: + return true + } + } +} + public class ItemListSingleLineInputItem: ListViewItem, ItemListItem { let theme: PresentationTheme let strings: PresentationStrings @@ -22,7 +37,7 @@ public class ItemListSingleLineInputItem: ListViewItem, ItemListItem { let type: ItemListSingleLineInputItemType let returnKeyType: UIReturnKeyType let spacing: CGFloat - let clearButton: Bool + let clearType: ItemListSingleLineInputClearType let enabled: Bool public let sectionId: ItemListSectionId let action: () -> Void @@ -32,7 +47,7 @@ public class ItemListSingleLineInputItem: ListViewItem, ItemListItem { let updatedFocus: ((Bool) -> Void)? public let tag: ItemListItemTag? - public init(theme: PresentationTheme, strings: PresentationStrings, title: NSAttributedString, text: String, placeholder: String, type: ItemListSingleLineInputItemType = .regular(capitalization: true, autocorrection: true), returnKeyType: UIReturnKeyType = .`default`, spacing: CGFloat = 0.0, clearButton: Bool = false, enabled: Bool = true, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId, textUpdated: @escaping (String) -> Void, shouldUpdateText: @escaping (String) -> Bool = { _ in return true }, processPaste: ((String) -> String)? = nil, updatedFocus: ((Bool) -> Void)? = nil, action: @escaping () -> Void) { + public init(theme: PresentationTheme, strings: PresentationStrings, title: NSAttributedString, text: String, placeholder: String, type: ItemListSingleLineInputItemType = .regular(capitalization: true, autocorrection: true), returnKeyType: UIReturnKeyType = .`default`, spacing: CGFloat = 0.0, clearType: ItemListSingleLineInputClearType = .none, enabled: Bool = true, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId, textUpdated: @escaping (String) -> Void, shouldUpdateText: @escaping (String) -> Bool = { _ in return true }, processPaste: ((String) -> String)? = nil, updatedFocus: ((Bool) -> Void)? = nil, action: @escaping () -> Void) { self.theme = theme self.strings = strings self.title = title @@ -41,7 +56,7 @@ public class ItemListSingleLineInputItem: ListViewItem, ItemListItem { self.type = type self.returnKeyType = returnKeyType self.spacing = spacing - self.clearButton = clearButton + self.clearType = clearType self.enabled = enabled self.tag = tag self.sectionId = sectionId @@ -153,7 +168,7 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg self.textNode.textField.font = Font.regular(17.0) if let item = self.item { self.textNode.textField.textColor = item.theme.list.itemPrimaryTextColor - self.textNode.textField.keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textNode.textField.keyboardAppearance = item.theme.rootController.keyboardColor.keyboardAppearance self.textNode.textField.tintColor = item.theme.list.itemAccentColor self.textNode.textField.accessibilityHint = item.placeholder } @@ -180,7 +195,7 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg let leftInset: CGFloat = 16.0 + params.leftInset var rightInset: CGFloat = 16.0 + params.rightInset - if item.clearButton { + if item.clearType.hasButton { rightInset += 32.0 } @@ -210,7 +225,7 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor strongSelf.textNode.textField.textColor = item.theme.list.itemPrimaryTextColor - strongSelf.textNode.textField.keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + strongSelf.textNode.textField.keyboardAppearance = item.theme.rootController.keyboardColor.keyboardAppearance strongSelf.textNode.textField.tintColor = item.theme.list.itemAccentColor } @@ -290,9 +305,7 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg strongSelf.clearIconNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - buttonSize.width + floor((buttonSize.width - image.size.width) / 2.0), y: floor((layout.contentSize.height - image.size.height) / 2.0)), size: image.size) } - strongSelf.clearIconNode.isHidden = !item.clearButton || item.text.isEmpty - strongSelf.clearButtonNode.isHidden = !item.clearButton || item.text.isEmpty - strongSelf.clearButtonNode.isAccessibilityElement = !strongSelf.clearButtonNode.isHidden + strongSelf.updateClearButtonVisibility() if strongSelf.backgroundNode.supernode == nil { strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) @@ -334,6 +347,24 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg } } + private func updateClearButtonVisibility() { + guard let item = self.item else { + return + } + let isHidden: Bool + switch item.clearType { + case .none: + isHidden = true + case .always: + isHidden = item.text.isEmpty + case .onFocus: + isHidden = !self.textNode.textField.isFirstResponder || item.text.isEmpty + } + self.clearIconNode.isHidden = isHidden + self.clearButtonNode.isHidden = isHidden + self.clearButtonNode.isAccessibilityElement = isHidden + } + override public func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) } @@ -392,10 +423,12 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg @objc public func textFieldDidBeginEditing(_ textField: UITextField) { self.item?.updatedFocus?(true) + self.updateClearButtonVisibility() } @objc public func textFieldDidEndEditing(_ textField: UITextField) { self.item?.updatedFocus?(false) + self.updateClearButtonVisibility() } public func animateError() { diff --git a/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI_Xcode.xcodeproj/project.pbxproj b/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI_Xcode.xcodeproj/project.pbxproj index 1438062244..bbac727a8c 100644 --- a/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/LegacyMediaPickerUI/LegacyMediaPickerUI_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 096C16E62317412A0047887D /* LegacyICloudFilePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 096C16E5231741290047887D /* LegacyICloudFilePicker.swift */; }; D03E3F6E2304C4840049C28B /* LegacyMediaPickerUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E3F6C2304C4840049C28B /* LegacyMediaPickerUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E3F802304C50E0049C28B /* LegacyMediaPickers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E3F782304C50D0049C28B /* LegacyMediaPickers.swift */; }; D03E3F812304C50E0049C28B /* LegacyImageProcessors.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E3F792304C50D0049C28B /* LegacyImageProcessors.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -32,6 +33,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 096C16E5231741290047887D /* LegacyICloudFilePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyICloudFilePicker.swift; sourceTree = ""; }; D03E3F692304C4840049C28B /* LegacyMediaPickerUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LegacyMediaPickerUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E3F6C2304C4840049C28B /* LegacyMediaPickerUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LegacyMediaPickerUI.h; sourceTree = ""; }; D03E3F6D2304C4840049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -111,6 +113,7 @@ D03E3F782304C50D0049C28B /* LegacyMediaPickers.swift */, D03E3F7B2304C50D0049C28B /* LegacySuggestionContext.swift */, D03E3F7F2304C50D0049C28B /* LegacyWallpaperPicker.swift */, + 096C16E5231741290047887D /* LegacyICloudFilePicker.swift */, D03E3F6C2304C4840049C28B /* LegacyMediaPickerUI.h */, ); path = Sources; @@ -219,6 +222,7 @@ files = ( D03E3F872304C50E0049C28B /* LegacyWallpaperPicker.swift in Sources */, D03E3F842304C50E0049C28B /* LegacyImagePicker.swift in Sources */, + 096C16E62317412A0047887D /* LegacyICloudFilePicker.swift in Sources */, D03E3F822304C50E0049C28B /* LegacyAttachmentMenu.swift in Sources */, D03E3F852304C50E0049C28B /* LegacyImageProcessors.m in Sources */, D03E3F802304C50E0049C28B /* LegacyMediaPickers.swift in Sources */, diff --git a/submodules/TelegramUI/TelegramUI/LegacyICloudFileController.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyICloudFilePicker.swift similarity index 78% rename from submodules/TelegramUI/TelegramUI/LegacyICloudFileController.swift rename to submodules/LegacyMediaPickerUI/Sources/LegacyICloudFilePicker.swift index 512b845626..ac8cd7dcef 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyICloudFileController.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyICloudFilePicker.swift @@ -30,7 +30,21 @@ private final class LegacyICloudFileController: LegacyController, UIDocumentPick } } -func legacyICloudFileController(theme: PresentationTheme, completion: @escaping ([URL]) -> Void) -> ViewController { +public enum LegacyICloudFilePickerMode { + case `default` + case `import` + + var documentPickerMode: UIDocumentPickerMode { + switch self { + case .default: + return .open + case .import: + return .import + } + } +} + +public func legacyICloudFilePicker(theme: PresentationTheme, mode: LegacyICloudFilePickerMode = .default, documentTypes: [String] = ["public.item"], completion: @escaping ([URL]) -> Void) -> ViewController { var dismissImpl: (() -> Void)? let legacyController = LegacyICloudFileController(presentation: .modal(animateIn: true), theme: theme, completion: { urls in dismissImpl?() @@ -38,25 +52,9 @@ func legacyICloudFileController(theme: PresentationTheme, completion: @escaping }) legacyController.statusBar.statusBarStyle = .Black - let documentTypes: [String] = [ - "public.item" -// "public.composite-content", -// "public.text", -// "public.image", -// "public.audio", -// "public.video", -// "public.movie", -// "public.font", -// "public.data", -// "org.telegram.Telegram.webp", -// "com.apple.iwork.pages.pages", -// "com.apple.iwork.numbers.numbers", -// "com.apple.iwork.keynote.key" - ] - - let controller = UIDocumentPickerViewController(documentTypes: documentTypes, in: .open) + let controller = UIDocumentPickerViewController(documentTypes: documentTypes, in: mode.documentPickerMode) controller.delegate = legacyController - if #available(iOSApplicationExtension 11.0, iOS 11.0, *) { + if #available(iOSApplicationExtension 11.0, iOS 11.0, *), case .default = mode { controller.allowsMultipleSelection = true } diff --git a/submodules/PasscodeUI/Sources/PasscodeSetupControllerNode.swift b/submodules/PasscodeUI/Sources/PasscodeSetupControllerNode.swift index 7b1f03cac3..e59a0f9749 100644 --- a/submodules/PasscodeUI/Sources/PasscodeSetupControllerNode.swift +++ b/submodules/PasscodeUI/Sources/PasscodeSetupControllerNode.swift @@ -82,7 +82,7 @@ final class PasscodeSetupControllerNode: ASDisplayNode { passcodeType = .digits6 } - self.inputFieldNode = PasscodeEntryInputFieldNode(color: self.presentationData.theme.list.itemPrimaryTextColor, accentColor: self.presentationData.theme.list.itemAccentColor, fieldType: passcodeType, keyboardAppearance: self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance) + self.inputFieldNode = PasscodeEntryInputFieldNode(color: self.presentationData.theme.list.itemPrimaryTextColor, accentColor: self.presentationData.theme.list.itemAccentColor, fieldType: passcodeType, keyboardAppearance: self.presentationData.theme.rootController.keyboardColor.keyboardAppearance) self.inputFieldBackgroundNode = ASImageNode() self.inputFieldBackgroundNode.alpha = passcodeType == .alphanumeric ? 1.0 : 0.0 self.inputFieldBackgroundNode.contentMode = .scaleToFill diff --git a/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift b/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift index c9b9cbc0af..adbfda5013 100644 --- a/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift +++ b/submodules/PassportUI/Sources/Form/FormControllerTextInputItem.swift @@ -143,7 +143,7 @@ final class FormControllerTextInputItemNode: FormBlockItemNode Vi } }, openStats: { let presentationData = context.sharedContext.currentPresentationData.with { $0 } - var urlSignal = channelStatsUrl(postbox: context.account.postbox, network: context.account.network, peerId: peerId, params: "", darkTheme: presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance == .dark) + var urlSignal = channelStatsUrl(postbox: context.account.postbox, network: context.account.network, peerId: peerId, params: "", darkTheme: presentationData.theme.rootController.keyboardColor.keyboardAppearance == .dark) var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in diff --git a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift index b3c127c281..3d073e2d7e 100644 --- a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift @@ -80,7 +80,7 @@ private final class ChannelOwnershipTransferPasswordFieldNode: ASDisplayNode, UI self.textInputNode.textField.textColor = self.theme.list.itemPrimaryTextColor self.textInputNode.textField.isSecureTextEntry = true self.textInputNode.textField.returnKeyType = .done - self.textInputNode.textField.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textInputNode.textField.keyboardAppearance = self.theme.rootController.keyboardColor.keyboardAppearance self.textInputNode.clipsToBounds = true self.textInputNode.textField.delegate = self self.textInputNode.textField.addTarget(self, action: #selector(self.textFieldTextChanged(_:)), for: .editingChanged) @@ -92,7 +92,7 @@ private final class ChannelOwnershipTransferPasswordFieldNode: ASDisplayNode, UI self.theme = theme self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 16.0, color: theme.actionSheet.inputHollowBackgroundColor, strokeColor: theme.actionSheet.inputBorderColor, strokeWidth: UIScreenPixel) - self.textInputNode.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textInputNode.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.textInputNode.textField.textColor = theme.list.itemPrimaryTextColor self.textInputNode.textField.typingAttributes = [NSAttributedString.Key.font: Font.regular(14.0), NSAttributedString.Key.foregroundColor: theme.actionSheet.inputTextColor] self.textInputNode.textField.tintColor = theme.list.itemAccentColor diff --git a/submodules/PeerInfoUI/Sources/ChannelStatsControllerNode.swift b/submodules/PeerInfoUI/Sources/ChannelStatsControllerNode.swift index d4fe29f707..f4f12aad5e 100644 --- a/submodules/PeerInfoUI/Sources/ChannelStatsControllerNode.swift +++ b/submodules/PeerInfoUI/Sources/ChannelStatsControllerNode.swift @@ -90,7 +90,7 @@ final class ChannelStatsControllerNode: ViewControllerTracingNode, WKNavigationD } } } - self.refreshDisposable.set((channelStatsUrl(postbox: self.context.account.postbox, network: self.context.account.network, peerId: self.peerId, params: params, darkTheme: self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance == .dark) + self.refreshDisposable.set((channelStatsUrl(postbox: self.context.account.postbox, network: self.context.account.network, peerId: self.peerId, params: params, darkTheme: self.presentationData.theme.rootController.keyboardColor.keyboardAppearance == .dark) |> deliverOnMainQueue).start(next: { [weak self] url in guard let strongSelf = self else { return diff --git a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift index a8dd5615eb..613a8e61a0 100644 --- a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift @@ -287,7 +287,7 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { } }, tag: ChannelVisibilityEntryTag.privateLink) case let .editablePublicLink(theme, strings, placeholder, currentText): - return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: "t.me/", textColor: theme.list.itemPrimaryTextColor), text: currentText, placeholder: placeholder, type: .regular(capitalization: false, autocorrection: false), clearButton: true, tag: ChannelVisibilityEntryTag.publicLink, sectionId: self.section, textUpdated: { updatedText in + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: "t.me/", textColor: theme.list.itemPrimaryTextColor), text: currentText, placeholder: placeholder, type: .regular(capitalization: false, autocorrection: false), clearType: .always, tag: ChannelVisibilityEntryTag.publicLink, sectionId: self.section, textUpdated: { updatedText in arguments.updatePublicLinkText(currentText, updatedText) }, updatedFocus: { focus in if focus { diff --git a/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift b/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift index 29a18dd5f8..3fc8a425ee 100644 --- a/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift +++ b/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift @@ -209,7 +209,7 @@ private enum GroupStickerPackEntry: ItemListNodeEntry { func item(_ arguments: GroupStickerPackSetupControllerArguments) -> ListViewItem { switch self { case let .search(theme, strings, prefix, placeholder, value): - return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: prefix, textColor: theme.list.itemPrimaryTextColor), text: value, placeholder: placeholder, type: .regular(capitalization: false, autocorrection: false), spacing: 0.0, clearButton: true, tag: nil, sectionId: self.section, textUpdated: { value in + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: prefix, textColor: theme.list.itemPrimaryTextColor), text: value, placeholder: placeholder, type: .regular(capitalization: false, autocorrection: false), spacing: 0.0, clearType: .always, tag: nil, sectionId: self.section, textUpdated: { value in arguments.updateSearchText(value) }, processPaste: { text in if let url = (URL(string: text) ?? URL(string: "http://" + text)), url.host == "t.me" || url.host == "telegram.me" { diff --git a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift index aa44c43a64..30aa46a336 100644 --- a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift +++ b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift @@ -183,7 +183,7 @@ class UserInfoEditingPhoneItemNode: ItemListRevealOptionsItemNode, ItemListItemN if let item = self.item { self.phoneNode.numberField?.textField.textColor = item.theme.list.itemPrimaryTextColor - self.phoneNode.numberField?.textField.keyboardAppearance = item.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.phoneNode.numberField?.textField.keyboardAppearance = item.theme.rootController.keyboardColor.keyboardAppearance self.phoneNode.numberField?.textField.tintColor = item.theme.list.itemAccentColor } } @@ -233,7 +233,7 @@ class UserInfoEditingPhoneItemNode: ItemListRevealOptionsItemNode, ItemListItemN strongSelf.labelSeparatorNode.backgroundColor = itemSeparatorColor strongSelf.phoneNode.numberField?.textField.textColor = updatedTheme.list.itemPrimaryTextColor - strongSelf.phoneNode.numberField?.textField.keyboardAppearance = updatedTheme.chatList.searchBarKeyboardColor.keyboardAppearance + strongSelf.phoneNode.numberField?.textField.keyboardAppearance = updatedTheme.rootController.keyboardColor.keyboardAppearance strongSelf.phoneNode.numberField?.textField.tintColor = item.theme.list.itemAccentColor strongSelf.clearButton.setImage(generateClearIcon(color: updatedTheme.list.inputClearButtonColor), for: []) diff --git a/submodules/SearchBarNode/Sources/SearchBarNode.swift b/submodules/SearchBarNode/Sources/SearchBarNode.swift index 0ca4a86aec..de5796027a 100644 --- a/submodules/SearchBarNode/Sources/SearchBarNode.swift +++ b/submodules/SearchBarNode/Sources/SearchBarNode.swift @@ -161,7 +161,7 @@ public final class SearchBarNodeTheme: Equatable { self.inputIcon = theme.rootController.navigationSearchBar.inputIconColor self.inputClear = theme.rootController.navigationSearchBar.inputClearButtonColor self.accent = theme.rootController.navigationSearchBar.accentColor - self.keyboard = theme.chatList.searchBarKeyboardColor + self.keyboard = theme.rootController.keyboardColor } public static func ==(lhs: SearchBarNodeTheme, rhs: SearchBarNodeTheme) -> Bool { diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift index 490fd4fc26..75a82714d1 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift @@ -127,10 +127,10 @@ final class ChangePhoneNumberControllerNode: ASDisplayNode { self.phoneInputNode = PhoneInputNode(fontSize: 17.0) self.phoneInputNode.countryCodeField.textField.textColor = self.presentationData.theme.list.itemPrimaryTextColor - self.phoneInputNode.countryCodeField.textField.keyboardAppearance = self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.phoneInputNode.countryCodeField.textField.keyboardAppearance = self.presentationData.theme.rootController.keyboardColor.keyboardAppearance self.phoneInputNode.countryCodeField.textField.tintColor = self.presentationData.theme.list.itemAccentColor self.phoneInputNode.numberField.textField.textColor = self.presentationData.theme.list.itemPrimaryTextColor - self.phoneInputNode.numberField.textField.keyboardAppearance = self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.phoneInputNode.numberField.textField.keyboardAppearance = self.presentationData.theme.rootController.keyboardColor.keyboardAppearance self.phoneInputNode.numberField.textField.tintColor = self.presentationData.theme.list.itemAccentColor super.init() diff --git a/submodules/SettingsUI/Sources/TabBarAccountSwitchControllerNode.swift b/submodules/SettingsUI/Sources/TabBarAccountSwitchControllerNode.swift index 2ad472985b..6929546f6a 100644 --- a/submodules/SettingsUI/Sources/TabBarAccountSwitchControllerNode.swift +++ b/submodules/SettingsUI/Sources/TabBarAccountSwitchControllerNode.swift @@ -234,7 +234,7 @@ final class TabBarAccountSwitchControllerNode: ViewControllerTracingNode { self.effectView = UIVisualEffectView() if #available(iOS 9.0, *) { } else { - if presentationData.theme.chatList.searchBarKeyboardColor == .dark { + if presentationData.theme.rootController.keyboardColor == .dark { self.effectView.effect = UIBlurEffect(style: .dark) } else { self.effectView.effect = UIBlurEffect(style: .light) @@ -244,7 +244,7 @@ final class TabBarAccountSwitchControllerNode: ViewControllerTracingNode { self.dimNode = ASDisplayNode() self.dimNode.alpha = 1.0 - if presentationData.theme.chatList.searchBarKeyboardColor == .light { + if presentationData.theme.rootController.keyboardColor == .light { self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.04) } else { self.dimNode.backgroundColor = presentationData.theme.chatList.backgroundColor.withAlphaComponent(0.2) @@ -287,7 +287,7 @@ final class TabBarAccountSwitchControllerNode: ViewControllerTracingNode { func animateIn() { UIView.animate(withDuration: 0.3, animations: { if #available(iOS 9.0, *) { - if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + if self.presentationData.theme.rootController.keyboardColor == .dark { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.effectView.effect = UIBlurEffect(style: .regular) if self.effectView.subviews.count == 2 { @@ -310,7 +310,7 @@ final class TabBarAccountSwitchControllerNode: ViewControllerTracingNode { guard let strongSelf = self else { return } - if strongSelf.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + if strongSelf.presentationData.theme.rootController.keyboardColor == .dark { if strongSelf.effectView.subviews.count == 2 { strongSelf.effectView.subviews[1].isHidden = true } diff --git a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift index f2db2b5e88..2988aeb84e 100644 --- a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift @@ -8,70 +8,79 @@ import TelegramPresentationData import TelegramUIPreferences import ItemListUI import AlertUI +import LegacyMediaPickerUI import AccountContext private final class EditThemeControllerArguments { let context: AccountContext let updateState: ((EditThemeControllerState) -> EditThemeControllerState) -> Void + let openFile: () -> Void - init(context: AccountContext, updateState: @escaping ((EditThemeControllerState) -> EditThemeControllerState) -> Void) { + init(context: AccountContext, updateState: @escaping ((EditThemeControllerState) -> EditThemeControllerState) -> Void, openFile: @escaping () -> Void) { self.context = context self.updateState = updateState + self.openFile = openFile + } +} + +private enum EditThemeEntryTag: ItemListItemTag { + case title + + func isEqual(to other: ItemListItemTag) -> Bool { + if let other = other as? EditThemeEntryTag, self == other { + return true + } else { + return false + } } } private enum EditThemeControllerSection: Int32 { - case chatPreview case info + case chatPreview } private enum EditThemeControllerEntry: ItemListNodeEntry { - case chatPreviewHeader(PresentationTheme, String) - case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder) - case title(PresentationTheme, PresentationStrings, String, String) + case title(PresentationTheme, PresentationStrings, String, String, Bool) case slug(PresentationTheme, PresentationStrings, String, String, Bool) case slugInfo(PresentationTheme, String) + case chatPreviewHeader(PresentationTheme, String) + case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder) + case uploadTheme(PresentationTheme, String) + case uploadInfo(PresentationTheme, String) var section: ItemListSectionId { switch self { - case .chatPreviewHeader, .chatPreview: - return EditThemeControllerSection.chatPreview.rawValue case .title, .slug, .slugInfo: return EditThemeControllerSection.info.rawValue + case .chatPreviewHeader, .chatPreview, .uploadTheme, .uploadInfo: + return EditThemeControllerSection.chatPreview.rawValue } } var stableId: Int32 { switch self { - case .chatPreviewHeader: - return 0 - case .chatPreview: - return 1 case .title: - return 2 + return 0 case .slug: - return 3 + return 1 case .slugInfo: + return 2 + case .chatPreviewHeader: + return 3 + case .chatPreview: return 4 + case .uploadTheme: + return 5 + case .uploadInfo: + return 6 } } static func ==(lhs: EditThemeControllerEntry, rhs: EditThemeControllerEntry) -> Bool { switch lhs { - case let .chatPreviewHeader(lhsTheme, lhsText): - if case let .chatPreviewHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { - return true - } else { - return false - } - case let .chatPreview(lhsTheme, lhsComponentTheme, lhsWallpaper, lhsFontSize, lhsStrings, lhsTimeFormat, lhsNameOrder): - if case let .chatPreview(rhsTheme, rhsComponentTheme, rhsWallpaper, rhsFontSize, rhsStrings, rhsTimeFormat, rhsNameOrder) = rhs, lhsComponentTheme === rhsComponentTheme, lhsTheme === rhsTheme, lhsWallpaper == rhsWallpaper, lhsFontSize == rhsFontSize, lhsStrings === rhsStrings, lhsTimeFormat == rhsTimeFormat, lhsNameOrder == rhsNameOrder { - return true - } else { - return false - } - case let .title(lhsTheme, lhsStrings, lhsTitle, lhsValue): - if case let .title(rhsTheme, rhsStrings, rhsTitle, rhsValue) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsTitle == rhsTitle, lhsValue == rhsValue { + case let .title(lhsTheme, lhsStrings, lhsTitle, lhsValue, lhsDone): + if case let .title(rhsTheme, rhsStrings, rhsTitle, rhsValue, rhsDone) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsTitle == rhsTitle, lhsValue == rhsValue, lhsDone == rhsDone { return true } else { return false @@ -88,6 +97,30 @@ private enum EditThemeControllerEntry: ItemListNodeEntry { } else { return false } + case let .chatPreviewHeader(lhsTheme, lhsText): + if case let .chatPreviewHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .chatPreview(lhsTheme, lhsComponentTheme, lhsWallpaper, lhsFontSize, lhsStrings, lhsTimeFormat, lhsNameOrder): + if case let .chatPreview(rhsTheme, rhsComponentTheme, rhsWallpaper, rhsFontSize, rhsStrings, rhsTimeFormat, rhsNameOrder) = rhs, lhsComponentTheme === rhsComponentTheme, lhsTheme === rhsTheme, lhsWallpaper == rhsWallpaper, lhsFontSize == rhsFontSize, lhsStrings === rhsStrings, lhsTimeFormat == rhsTimeFormat, lhsNameOrder == rhsNameOrder { + return true + } else { + return false + } + case let .uploadTheme(lhsTheme, lhsText): + if case let .uploadTheme(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .uploadInfo(lhsTheme, lhsText): + if case let .uploadInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } } } @@ -97,67 +130,109 @@ private enum EditThemeControllerEntry: ItemListNodeEntry { func item(_ arguments: EditThemeControllerArguments) -> ListViewItem { switch self { - case let .chatPreviewHeader(theme, text): - return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .chatPreview(theme, componentTheme, wallpaper, fontSize, strings, dateTimeFormat, nameDisplayOrder): - return ThemeSettingsChatPreviewItem(context: arguments.context, theme: theme, componentTheme: componentTheme, strings: strings, sectionId: self.section, fontSize: fontSize, wallpaper: wallpaper, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder) - case let .title(theme, strings, title, text): - return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(), text: text, placeholder: title, sectionId: self.section, textUpdated: { value in + case let .title(theme, strings, title, text, done): + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(), text: text, placeholder: title, type: .regular(capitalization: true, autocorrection: false), returnKeyType: done ? .done : .next, clearType: .onFocus, tag: EditThemeEntryTag.title, sectionId: self.section, textUpdated: { value in arguments.updateState { current in var state = current state.title = value return state } - }, action: {}) + }, action: { + + }) case let .slug(theme, strings, title, text, enabled): - return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: "t.me/addtheme/", textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: title, type: .username, enabled: enabled, sectionId: self.section, textUpdated: { value in + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: "t.me/addtheme/", textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: title, type: .username, clearType: .onFocus, enabled: enabled, sectionId: self.section, textUpdated: { value in arguments.updateState { current in var state = current state.slug = value return state } - }, action: {}) + }, action: { + + }) case let .slugInfo(theme, text): return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) + case let .chatPreviewHeader(theme, text): + return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .chatPreview(theme, componentTheme, wallpaper, fontSize, strings, dateTimeFormat, nameDisplayOrder): + return ThemeSettingsChatPreviewItem(context: arguments.context, theme: theme, componentTheme: componentTheme, strings: strings, sectionId: self.section, fontSize: fontSize, wallpaper: wallpaper, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder) + case let .uploadTheme(theme, text): + return ItemListActionItem(theme: theme, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { + arguments.openFile() + }) + case let .uploadInfo(theme, text): + return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) } } } -private struct EditThemeControllerState: Equatable { - var title: String - var slug: String - - var isComplete: Bool { - if self.title.isEmpty || self.slug.isEmpty { - return false - } - return true - } +public enum EditThemeControllerMode: Equatable { + case create + case edit(PresentationCloudTheme) } -private func EditThemeControllerEntries(presentationData: PresentationData, theme: PresentationTheme?, state: EditThemeControllerState) -> [EditThemeControllerEntry] { +private struct EditThemeControllerState: Equatable { + var mode: EditThemeControllerMode + var title: String + var slug: String + var previewTheme: PresentationTheme + var updatedTheme: PresentationTheme? + var updating: Bool +} + +private func editThemeControllerEntries(presentationData: PresentationData, state: EditThemeControllerState) -> [EditThemeControllerEntry] { var entries: [EditThemeControllerEntry] = [] - if let theme = theme { - entries.append(.chatPreviewHeader(presentationData.theme, presentationData.strings.EditTheme_Preview.uppercased())) - entries.append(.chatPreview(presentationData.theme, theme, theme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) + var isCreate = false + if case .create = state.mode { + isCreate = true + } + entries.append(.title(presentationData.theme, presentationData.strings, presentationData.strings.EditTheme_Title, state.title, isCreate)) + + if case .edit = state.mode { + entries.append(.slug(presentationData.theme, presentationData.strings, presentationData.strings.EditTheme_ShortLink, state.slug, true)) + entries.append(.slugInfo(presentationData.theme, presentationData.strings.EditTheme_ShortLinkInfo)) } - entries.append(.title(presentationData.theme, presentationData.strings, presentationData.strings.EditTheme_Title, state.title)) - entries.append(.slug(presentationData.theme, presentationData.strings, presentationData.strings.EditTheme_ShortLink, state.slug, true)) - entries.append(.slugInfo(presentationData.theme, presentationData.strings.EditTheme_ShortLinkInfo)) + entries.append(.chatPreviewHeader(presentationData.theme, presentationData.strings.EditTheme_Preview.uppercased())) + entries.append(.chatPreview(presentationData.theme, state.previewTheme, state.previewTheme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) + + let uploadText: String + let uploadInfo: String + switch state.mode { + case .create: + uploadText = presentationData.strings.EditTheme_UploadNewTheme + uploadInfo = presentationData.strings.EditTheme_UploadNewInfo + case let .edit(theme): + if let _ = theme.theme.file { + uploadText = presentationData.strings.EditTheme_UploadEditedTheme + uploadInfo = presentationData.strings.EditTheme_UploadEditedInfo + } else { + uploadText = presentationData.strings.EditTheme_UploadNewTheme + uploadInfo = presentationData.strings.EditTheme_UploadNewInfo + } + } + entries.append(.uploadTheme(presentationData.theme, uploadText)) + entries.append(.uploadInfo(presentationData.theme, uploadInfo)) return entries } -public enum EditThemeControllerMode { - case createNew - case createForExisting(TelegramTheme) - case edit(TelegramTheme) -} - -public func editThemeController(context: AccountContext, theme: TelegramTheme) -> ViewController { - let initialState = EditThemeControllerState(title: theme.title, slug: theme.slug) +public func editThemeController(context: AccountContext, mode: EditThemeControllerMode, navigateToChat: ((PeerId) -> Void)? = nil) -> ViewController { + let initialState: EditThemeControllerState + switch mode { + case .create: + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + initialState = EditThemeControllerState(mode: mode, title: "", slug: "", previewTheme: presentationData.theme.withUpdated(name: "", author: nil, defaultWallpaper: presentationData.chatWallpaper), updatedTheme: nil, updating: false) + case let .edit(theme): + let previewTheme: PresentationTheme + if let file = theme.theme.file, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let theme = makePresentationTheme(data: data, resolvedWallpaper: theme.resolvedWallpaper) { + previewTheme = theme + } else { + previewTheme = context.sharedContext.currentPresentationData.with { $0 }.theme + } + initialState = EditThemeControllerState(mode: mode, title: theme.theme.title, slug: theme.theme.slug, previewTheme: previewTheme, updatedTheme: nil, updating: false) + } let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) let updateState: ((EditThemeControllerState) -> EditThemeControllerState) -> Void = { f in @@ -170,28 +245,153 @@ public func editThemeController(context: AccountContext, theme: TelegramTheme) - let arguments = EditThemeControllerArguments(context: context, updateState: { f in updateState(f) + }, openFile: { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let controller = legacyICloudFilePicker(theme: presentationData.theme, mode: .import, documentTypes: ["org.telegram.Telegram-iOS.theme"], completion: { urls in + if let url = urls.first, let data = try? Data(contentsOf: url), let theme = makePresentationTheme(data: data) { + updateState { current in + var state = current + state.previewTheme = theme + state.updatedTheme = theme + return state + } + } else { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.EditTheme_FileReadError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + } + }) + presentControllerImpl?(controller, nil) }) - var previewTheme: PresentationTheme? - if let file = theme.file, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let theme = makePresentationTheme(data: data) { - previewTheme = theme - } - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get()) - |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, EditThemeControllerEntry.ItemGenerationArguments)) in - let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { - dismissImpl?() - }) - let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: state.isComplete, action: { - //let _ = (updateTheme(account: context.account, resource: resource, title: state.title, slug: state.slug) |> deliverOnMainQueue).start(completed: { - // dismissImpl?() - //}) - }) + |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, EditThemeControllerEntry.ItemGenerationArguments)) in + let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { + dismissImpl?() + }) + + var focusItemTag: ItemListItemTag? + if case .create = state.mode { + focusItemTag = EditThemeEntryTag.title + } + + let rightNavigationButton: ItemListNavigationButton + if state.updating { + rightNavigationButton = ItemListNavigationButton(content: .none, style: .activity, enabled: true, action: {}) + } else { + let isComplete: Bool + if case .create = mode { + isComplete = !state.title.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty + } else { + isComplete = !state.title.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty && !state.slug.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty + } - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.EditTheme_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) - let listState = ItemListNodeState(entries: EditThemeControllerEntries(presentationData: presentationData, theme: previewTheme, state: state), style: .blocks, emptyStateItem: nil, animateChanges: false) - - return (controllerState, (listState, arguments)) + rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: isComplete, action: { + arguments.updateState { current in + var state = current + state.updating = true + return state + } + + let saveThemeTemplateFile: (String, LocalFileMediaResource, @escaping () -> Void) -> Void = { title, resource, completion in + let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: resource.fileId), partialReference: nil, resource: resource, previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgtheme-ios", size: nil, attributes: [.FileName(fileName: "\(title).tgios-theme")]) + let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: nil, localGroupingKey: nil) + + let _ = enqueueMessages(account: context.account, peerId: context.account.peerId, messages: [message]).start() + + if let navigateToChat = navigateToChat { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.EditTheme_ThemeTemplateAlert, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { + completion() + + navigateToChat(context.account.peerId) + }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { + completion() + })], actionLayout: .vertical), nil) + } else { + completion() + } + } + + let theme: PresentationTheme? + let custom: Bool + if let updatedTheme = state.updatedTheme { + theme = updatedTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) + custom = true + } else { + if case let .edit(info) = mode, let _ = info.theme.file { + theme = nil + custom = true + } else { + theme = state.previewTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) + custom = false + } + } + + let themeResource: LocalFileMediaResource? + + if let theme = theme, let themeString = encodePresentationTheme(theme), let themeData = themeString.data(using: .utf8) { + let resource = LocalFileMediaResource(fileId: arc4random64()) + context.account.postbox.mediaBox.storeResourceData(resource.id, data: themeData) + context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: themeData) + themeResource = resource + } else { + themeResource = nil + } + + switch mode { + case .create: + if let themeResource = themeResource { + let _ = (createTheme(account: context.account, resource: themeResource, title: state.title) + |> deliverOnMainQueue).start(error: { error in + arguments.updateState { current in + var state = current + state.updating = false + return state + } + }, completed: { + if !custom { + saveThemeTemplateFile(state.title, themeResource, { + dismissImpl?() + }) + } else { + dismissImpl?() + } + }) + } + case let .edit(theme): + let _ = (updateTheme(account: context.account, theme: theme.theme, title: state.title, slug: state.slug, resource: themeResource) + |> deliverOnMainQueue).start(error: { error in + arguments.updateState { current in + var state = current + state.updating = false + return state + } + }, completed: { + if let themeResource = themeResource, !custom { + saveThemeTemplateFile(state.title, themeResource, { + dismissImpl?() + }) + } else { + dismissImpl?() + } + }) + } + }) + } + + let title: String + switch mode { + case .create: + title = presentationData.strings.EditTheme_CreateTitle + case let .edit(theme): + if theme.theme.file == nil { + title = presentationData.strings.EditTheme_CreateTitle + } else { + title = presentationData.strings.EditTheme_EditTitle + } + } + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let listState = ItemListNodeState(entries: editThemeControllerEntries(presentationData: presentationData, state: state), style: .blocks, focusItemTag: focusItemTag, emptyStateItem: nil, animateChanges: false) + + return (controllerState, (listState, arguments)) } let controller = ItemListController(context: context, state: signal) @@ -202,6 +402,7 @@ public func editThemeController(context: AccountContext, theme: TelegramTheme) - controller?.present(c, in: .window(.root), with: a) } dismissImpl = { [weak controller] in + controller?.view.endEditing(true) let _ = controller?.dismiss() } return controller diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index d8e3de98b2..a7305e0d58 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -116,7 +116,7 @@ public final class ThemePreviewController: ViewController { |> take(1) |> map { theme in if let theme = theme { - return .cloud(theme) + return .cloud(PresentationCloudTheme(theme: theme, resolvedWallpaper: nil)) } else { return nil } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index 3c98415932..f55e8585ea 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -8,6 +8,7 @@ import TelegramPresentationData import TelegramUIPreferences import ItemListUI import AlertUI +import ShareController import AccountContext func themeDisplayName(strings: PresentationStrings, reference: PresentationThemeReference) -> String { @@ -27,7 +28,7 @@ func themeDisplayName(strings: PresentationStrings, reference: PresentationTheme case let .local(theme): name = theme.title case let .cloud(theme): - name = theme.title + name = theme.theme.title } return name } @@ -372,6 +373,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The var pushControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)? + var getNavigationControllerImpl: (() -> NavigationController?)? var selectThemeImpl: ((PresentationThemeReference) -> Void)? var moreImpl: (() -> Void)? @@ -463,34 +465,44 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) var items: [ActionSheetItem] = [] - items.append(ActionSheetTextItem(title: theme.title)) - items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_EditTheme, color: .accent, action: { [weak actionSheet] in + items.append(ActionSheetTextItem(title: theme.theme.title)) + if theme.theme.isCreator { + items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_EditTheme, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + let controller = editThemeController(context: context, mode: .edit(theme), navigateToChat: { peerId in + if let navigationController = getNavigationControllerImpl?() { + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId))) + } + }) + presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + })) + } + items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_ShareTheme, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - - let controller = editThemeController(context: context, theme: theme) - presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + let controller = ShareController(context: context, subject: .url("https://t.me/addtheme/\(theme.theme.slug)"), preferredAction: .default) + presentControllerImpl?(controller, nil) })) items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_RemoveTheme, color: .destructive, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - let _ = (cloudThemes.get() - |> take(1) - |> deliverOnMainQueue).start(next: { themes in - if isCurrent, let themeIndex = themes.firstIndex(where: { $0.id == theme.id }) { - let newTheme: PresentationThemeReference - if themeIndex > 0 { - newTheme = .cloud(themes[themeIndex - 1]) - } else { - newTheme = .builtin(.nightAccent) - } - selectThemeImpl?(newTheme) - } - - let updatedThemes = themes.filter { $0.id != theme.id } - cloudThemes.set(.single(updatedThemes) |> then(updatedCloudThemes)) - - let _ = (deleteTheme(account: context.account, theme: theme)).start() - }) +// let _ = (cloudThemes.get() +// |> take(1) +// |> deliverOnMainQueue).start(next: { themes in +// if isCurrent, let themeIndex = themes.firstIndex(where: { $0.id == theme.id }) { +// let newTheme: PresentationThemeReference +// if themeIndex > 0 { +// newTheme = .cloud(themes[themeIndex - 1]) +// } else { +// newTheme = .builtin(.nightAccent) +// } +// selectThemeImpl?(newTheme) +// } +// +// let updatedThemes = themes.filter { $0.id != theme.id } +// cloudThemes.set(.single(updatedThemes) |> then(updatedCloudThemes)) +// +// let _ = (deleteTheme(account: context.account, theme: theme)).start() +// }) })) actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in @@ -524,7 +536,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The }) let defaultThemes: [PresentationThemeReference] = [.builtin(.dayClassic), .builtin(.day), .builtin(.night), .builtin(.nightAccent)] - let cloudThemes: [PresentationThemeReference] = cloudThemes.map { .cloud($0) } + let cloudThemes: [PresentationThemeReference] = cloudThemes.map { .cloud(PresentationCloudTheme(theme: $0, resolvedWallpaper: nil)) } var availableThemes = defaultThemes if !defaultThemes.contains(settings.theme) && !cloudThemes.contains(settings.theme) { @@ -544,37 +556,27 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The (controller?.navigationController as? NavigationController)?.pushViewController(c) } presentControllerImpl = { [weak controller] c, a in - controller?.present(c, in: .window(.root), with: a) + controller?.present(c, in: .window(.root), with: a, blockInteraction: true) + } + getNavigationControllerImpl = { [weak controller] in + return controller?.navigationController as? NavigationController } selectThemeImpl = { theme in arguments.selectTheme(theme) } - moreImpl = { [weak controller] in + moreImpl = { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) var items: [ActionSheetItem] = [] items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_CreateTheme, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - - var randomId: Int64 = 0 - arc4random_buf(&randomId, 8) - let path = NSTemporaryDirectory() + "\(randomId)" - guard let string = encodePresentationTheme(presentationData.theme), let _ = try? string.write(toFile: path, atomically: true, encoding: .utf8) else { - return - } - - let id = arc4random64() - let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: id), partialReference: nil, resource: LocalFileReferenceMediaResource(localFilePath: path, randomId: id), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgtheme-ios", size: nil, attributes: [.FileName(fileName: "\(presentationData.theme.name.string).tgios-theme")]) - let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: nil, localGroupingKey: nil) - - let _ = enqueueMessages(account: context.account, peerId: context.account.peerId, messages: [message]).start() - - presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.Appearance_CreateThemeInfo, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { - if let controller = controller, let navigationController = controller.navigationController as? NavigationController { - context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(context.account.peerId))) + let controller = editThemeController(context: context, mode: .create, navigateToChat: { peerId in + if let navigationController = getNavigationControllerImpl?() { + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId))) } - }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})], actionLayout: .vertical), nil) + }) + presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) })) actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift index 88810c8fd9..65533a9805 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift @@ -60,7 +60,7 @@ private func themeIconImage(context: AccountContext, theme: PresentationThemeRef if case let .local(theme) = theme { resource = theme.resource } else if case let .cloud(theme) = theme { - resource = theme.file?.resource + resource = theme.theme.file?.resource } if let resource = resource { signal = telegramThemeData(account: context.account, accountManager: context.sharedContext.accountManager, resource: resource, synchronousLoad: false) diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift index 4ae912a779..bf7eaa0834 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift @@ -104,7 +104,7 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { self.textFieldNode.textField.font = Font.regular(17.0) self.textFieldNode.textField.textColor = self.theme.chat.inputPanel.inputTextColor - self.textFieldNode.textField.keyboardAppearance = self.theme.chat.inputPanel.keyboardColor.keyboardAppearance + self.textFieldNode.textField.keyboardAppearance = self.theme.rootController.keyboardColor.keyboardAppearance self.textFieldNode.textField.autocorrectionType = .no self.textFieldNode.textField.autocapitalizationType = .allCharacters self.textFieldNode.textField.keyboardType = .asciiCapable @@ -123,7 +123,7 @@ final class WallpaperColorPanelNode: ASDisplayNode, UITextFieldDelegate { self.textBackgroundNode.image = textInputBackgroundImage(fieldColor: self.theme.chat.inputPanel.inputBackgroundColor, strokeColor: self.theme.chat.inputPanel.inputStrokeColor, diameter: 33.0) self.textFieldNode.textField.textColor = self.theme.chat.inputPanel.inputTextColor - self.textFieldNode.textField.keyboardAppearance = self.theme.chat.inputPanel.keyboardColor.keyboardAppearance + self.textFieldNode.textField.keyboardAppearance = self.theme.rootController.keyboardColor.keyboardAppearance self.textFieldNode.textField.tintColor = self.theme.list.itemAccentColor } diff --git a/submodules/SettingsUI/Sources/UsernameSetupController.swift b/submodules/SettingsUI/Sources/UsernameSetupController.swift index b50a79fb84..0fea02cbad 100644 --- a/submodules/SettingsUI/Sources/UsernameSetupController.swift +++ b/submodules/SettingsUI/Sources/UsernameSetupController.swift @@ -92,7 +92,7 @@ private enum UsernameSetupEntry: ItemListNodeEntry { func item(_ arguments: UsernameSetupControllerArguments) -> ListViewItem { switch self { case let .editablePublicLink(theme, strings, prefix, currentText, text): - return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: prefix, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .username, spacing: 10.0, clearButton: true, tag: UsernameEntryTag.username, sectionId: self.section, textUpdated: { updatedText in + return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: prefix, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .username, spacing: 10.0, clearType: .always, tag: UsernameEntryTag.username, sectionId: self.section, textUpdated: { updatedText in arguments.updatePublicLinkText(currentText, updatedText) }, action: { }) diff --git a/submodules/ShareController/Sources/ShareInputFieldNode.swift b/submodules/ShareController/Sources/ShareInputFieldNode.swift index 0bda739e24..a365ae28cf 100644 --- a/submodules/ShareController/Sources/ShareInputFieldNode.swift +++ b/submodules/ShareController/Sources/ShareInputFieldNode.swift @@ -50,7 +50,7 @@ final class ShareInputFieldNodeTheme: Equatable { extension ShareInputFieldNodeTheme { convenience init(presentationTheme theme: PresentationTheme) { - self.init(backgroundColor: theme.actionSheet.inputBackgroundColor, textColor: theme.actionSheet.inputTextColor, placeholderColor: theme.actionSheet.inputPlaceholderColor, clearButtonColor: theme.actionSheet.inputClearButtonColor, accentColor: theme.actionSheet.controlAccentColor, keyboard: theme.chatList.searchBarKeyboardColor) + self.init(backgroundColor: theme.actionSheet.inputBackgroundColor, textColor: theme.actionSheet.inputTextColor, placeholderColor: theme.actionSheet.inputPlaceholderColor, clearButtonColor: theme.actionSheet.inputClearButtonColor, accentColor: theme.actionSheet.controlAccentColor, keyboard: theme.rootController.keyboardColor) } } diff --git a/submodules/ShareController/Sources/ShareSearchBarNode.swift b/submodules/ShareController/Sources/ShareSearchBarNode.swift index 37b9294387..e623431ffc 100644 --- a/submodules/ShareController/Sources/ShareSearchBarNode.swift +++ b/submodules/ShareController/Sources/ShareSearchBarNode.swift @@ -48,7 +48,7 @@ final class ShareSearchBarNode: ASDisplayNode, UITextFieldDelegate { self.textInputNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) self.textInputNode.textField.keyboardAppearance = keyboardAppearance self.textInputNode.textField.attributedPlaceholder = NSAttributedString(string: placeholder, font: Font.regular(16.0), textColor: theme.actionSheet.inputPlaceholderColor) - self.textInputNode.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textInputNode.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.textInputNode.textField.tintColor = theme.actionSheet.controlAccentColor super.init() diff --git a/submodules/TelegramCore/TelegramCore/AccountManager.swift b/submodules/TelegramCore/TelegramCore/AccountManager.swift index 2f37b84baf..201707caef 100644 --- a/submodules/TelegramCore/TelegramCore/AccountManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountManager.swift @@ -130,6 +130,7 @@ private var declaredEncodables: Void = { declareEncodable(CachedStickerQueryResult.self, f: { CachedStickerQueryResult(decoder: $0) }) declareEncodable(TelegramWallpaper.self, f: { TelegramWallpaper(decoder: $0) }) declareEncodable(TelegramTheme.self, f: { TelegramTheme(decoder: $0) }) + declareEncodable(ThemeSettings.self, f: { ThemeSettings(decoder: $0) }) declareEncodable(SynchronizeMarkAllUnseenPersonalMessagesOperation.self, f: { SynchronizeMarkAllUnseenPersonalMessagesOperation(decoder: $0) }) declareEncodable(SynchronizeAppLogEventsOperation.self, f: { SynchronizeAppLogEventsOperation(decoder: $0) }) declareEncodable(CachedRecentPeers.self, f: { CachedRecentPeers(decoder: $0) }) diff --git a/submodules/TelegramCore/TelegramCore/Namespaces.swift b/submodules/TelegramCore/TelegramCore/Namespaces.swift index 65af9b9e27..74074db5ee 100644 --- a/submodules/TelegramCore/TelegramCore/Namespaces.swift +++ b/submodules/TelegramCore/TelegramCore/Namespaces.swift @@ -268,6 +268,7 @@ private enum SharedDataKeyValues: Int32 { case localizationSettings = 3 case proxySettings = 4 case autodownloadSettings = 5 + case themeSettings = 6 } public struct SharedDataKeys { @@ -300,6 +301,12 @@ public struct SharedDataKeys { key.setInt32(0, value: SharedDataKeyValues.autodownloadSettings.rawValue) return key }() + + public static let themeSettings: ValueBoxKey = { + let key = ValueBoxKey(length: 4) + key.setInt32(0, value: SharedDataKeyValues.themeSettings.rawValue) + return key + }() } public func applicationSpecificItemCacheCollectionId(_ value: Int8) -> Int8 { diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index 2edb021f17..057dbbfd07 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -140,12 +140,12 @@ private func saveUnsaveTheme(account: Account, theme: TelegramTheme, unsave: Boo } } -public func installTheme(account: Account, theme: TelegramTheme) -> Signal { +private func installTheme(account: Account, theme: TelegramTheme) -> Signal { return account.network.request(Api.functions.account.installTheme(format: themeFormat, theme: Api.InputTheme.inputTheme(id: theme.id, accessHash: theme.accessHash))) |> `catch` { _ -> Signal in return .complete() } - |> mapToSignal { _ -> Signal in + |> mapToSignal { _ -> Signal in return .complete() } } @@ -233,7 +233,11 @@ public func createTheme(account: Account, resource: MediaResource, title: String |> mapError { _ in return CreateThemeError.generic } |> mapToSignal { apiTheme -> Signal in if let theme = TelegramTheme(apiTheme: apiTheme) { - return .single(.result(theme)) + return account.postbox.transaction { transaction -> CreateThemeResult in + + return .result(theme) + } + |> introduceError(CreateThemeError.self) } else { return .fail(.generic) } @@ -299,3 +303,50 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, } } } + +public final class ThemeSettings: PreferencesEntry, Equatable { + public let currentTheme: TelegramTheme? + + public init(currentTheme: TelegramTheme?) { + self.currentTheme = currentTheme + } + + public init(decoder: PostboxDecoder) { + self.currentTheme = decoder.decodeObjectForKey("t", decoder: { TelegramTheme(decoder: $0) }) as? TelegramTheme + } + + public func encode(_ encoder: PostboxEncoder) { + if let currentTheme = currentTheme { + encoder.encodeObject(currentTheme, forKey: "t") + } else { + encoder.encodeNil(forKey: "t") + } + } + + public func isEqual(to: PreferencesEntry) -> Bool { + if let to = to as? ThemeSettings { + return self == to + } else { + return false + } + } + + public static func ==(lhs: ThemeSettings, rhs: ThemeSettings) -> Bool { + return lhs.currentTheme == rhs.currentTheme + } +} + +public func applyTheme(accountManager: AccountManager, account: Account, theme: TelegramTheme?) -> Signal { + return accountManager.transaction { transaction -> Signal in + transaction.updateSharedData(SharedDataKeys.themeSettings, { _ in + return ThemeSettings(currentTheme: theme) + }) + + if let theme = theme { + return installTheme(account: account, theme: theme) + } else { + return .complete() + } + } + |> switchToLatest +} diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index b70572f3a2..5b0d034b2d 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -113,7 +113,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta statusBarStyle: .white, tabBar: rootTabBar, navigationBar: rootNavigationBar, - navigationSearchBar: navigationSearchBar + navigationSearchBar: navigationSearchBar, + keyboardColor: .dark ) let switchColors = PresentationThemeSwitch( @@ -138,7 +139,7 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta itemHighlightedBackgroundColor: UIColor(rgb: 0x313135), itemBlocksSeparatorColor: UIColor(rgb: 0x3d3d40), itemPlainSeparatorColor: UIColor(rgb: 0x3d3d40), - disclosureArrowColor: UIColor(rgb: 0x5a5a5e), + disclosureArrowColor: UIColor(rgb: 0xffffff, alpha: 0.28), sectionHeaderTextColor: UIColor(rgb: 0x8d8e93), freeTextColor: UIColor(rgb: 0x8d8e93), freeTextErrorColor: UIColor(rgb: 0xcf3030), @@ -200,7 +201,6 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta regularSearchBarColor: UIColor(rgb: 0x272728), sectionHeaderFillColor: UIColor(rgb: 0x1c1c1d), sectionHeaderTextColor: UIColor(rgb: 0xffffff), - searchBarKeyboardColor: .dark, verifiedIconFillColor: accentColor, verifiedIconForegroundColor: badgeTextColor, secretIconColor: secretColor, @@ -258,7 +258,6 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta primaryTextColor: .white, secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaRecordingDotColor: destructiveColor, - keyboardColor: .dark, mediaRecordingControl: inputPanelMediaRecordingControl ) diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index ff7dd74cc6..c131bbf879 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -81,7 +81,8 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta statusBarStyle: .white, tabBar: rootTabBar, navigationBar: rootNavigationBar, - navigationSearchBar: navigationSearchBar + navigationSearchBar: navigationSearchBar, + keyboardColor: .dark ) let switchColors = PresentationThemeSwitch( @@ -168,7 +169,6 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta regularSearchBarColor: accentColor.withMultiplied(hue: 1.029, saturation: 0.609, brightness: 0.12), sectionHeaderFillColor: mainBackgroundColor, sectionHeaderTextColor: mainSecondaryTextColor.withAlphaComponent(0.5), - searchBarKeyboardColor: .dark, verifiedIconFillColor: accentColor, verifiedIconForegroundColor: .white, secretIconColor: secretColor, @@ -228,7 +228,6 @@ private func makeDarkPresentationTheme(accentColor: UIColor, baseColor: Presenta primaryTextColor: UIColor(rgb: 0xffffff), secondaryTextColor: UIColor(rgb: 0xffffff, alpha: 0.5), mediaRecordingDotColor: accentColor, - keyboardColor: .dark, mediaRecordingControl: inputPanelMediaRecordingControl ) diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index cda4734426..c87d4f52b5 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -93,7 +93,8 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr statusBarStyle: .black, tabBar: rootTabBar, navigationBar: rootNavigationBar, - navigationSearchBar: navigationSearchBar + navigationSearchBar: navigationSearchBar, + keyboardColor: .light ) let switchColors = PresentationThemeSwitch( @@ -180,7 +181,6 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr regularSearchBarColor: UIColor(rgb: 0xe9e9e9), sectionHeaderFillColor: UIColor(rgb: 0xf7f7f7), sectionHeaderTextColor: UIColor(rgb: 0x8e8e93), - searchBarKeyboardColor: .light, verifiedIconFillColor: accentColor, verifiedIconForegroundColor: .white, secretIconColor: secretColor, @@ -264,7 +264,6 @@ private func makeDefaultDayPresentationTheme(accentColor: UIColor, serviceBackgr primaryTextColor: .black, secondaryTextColor: UIColor(rgb: 0x8e8e93), mediaRecordingDotColor: UIColor(rgb: 0xed2521), - keyboardColor: .light, mediaRecordingControl: inputPanelMediaRecordingControl ) diff --git a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift index 48b5afefd2..8ebaa39e47 100644 --- a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift @@ -30,7 +30,7 @@ public func makePresentationTheme(mediaBox: MediaBox, themeReference: Presentati theme = makeDefaultPresentationTheme(reference: .dayClassic, accentColor: nil, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, preview: preview) } case let .cloud(info): - if let file = info.file, let path = mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let loadedTheme = makePresentationTheme(data: data) { + if let file = info.theme.file, let path = mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let loadedTheme = makePresentationTheme(data: data, resolvedWallpaper: info.resolvedWallpaper) { theme = loadedTheme } else { theme = makeDefaultPresentationTheme(reference: .dayClassic, accentColor: nil, serviceBackgroundColor: serviceBackgroundColor, baseColor: baseColor, preview: preview) diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index cbaee85e28..3edd08d9c2 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -934,3378 +934,3392 @@ public final class PresentationStrings { } public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[683]! } public var Passport_Language_ro: String { return self._s[684]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[685]! } + public var EditTheme_UploadNewTheme: String { return self._s[685]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[686]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[686]!, self._r[686]!, [_0]) + return formatWithArgumentRanges(self._s[687]!, self._r[687]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[687]! } - public var State_ConnectingToProxy: String { return self._s[688]! } - public var Calls_RatingTitle: String { return self._s[689]! } - public var Generic_ErrorMoreInfo: String { return self._s[690]! } - public var Appearance_PreviewReplyText: String { return self._s[691]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[692]! } - public var SharedMedia_CategoryLinks: String { return self._s[693]! } - public var Calls_Missed: String { return self._s[694]! } - public var Cache_Photos: String { return self._s[698]! } - public var GroupPermission_NoAddMembers: String { return self._s[699]! } - public var ScheduledMessages_Title: String { return self._s[700]! } + public var Login_CancelPhoneVerification: String { return self._s[688]! } + public var State_ConnectingToProxy: String { return self._s[689]! } + public var Calls_RatingTitle: String { return self._s[690]! } + public var Generic_ErrorMoreInfo: String { return self._s[691]! } + public var Appearance_PreviewReplyText: String { return self._s[692]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[693]! } + public var SharedMedia_CategoryLinks: String { return self._s[694]! } + public var Calls_Missed: String { return self._s[695]! } + public var Cache_Photos: String { return self._s[699]! } + public var GroupPermission_NoAddMembers: String { return self._s[700]! } + public var ScheduledMessages_Title: String { return self._s[701]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[701]!, self._r[701]!, [_0]) + return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[702]! } - public var Settings_ProxyDisabled: String { return self._s[703]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[703]! } + public var Settings_ProxyDisabled: String { return self._s[704]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[705]!, self._r[705]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[705]!, self._r[705]!, [_0]) + return formatWithArgumentRanges(self._s[706]!, self._r[706]!, [_0]) } - public var Appearance_Title: String { return self._s[707]! } + public var Appearance_Title: String { return self._s[708]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[709]!, self._r[709]!, [_0]) + return formatWithArgumentRanges(self._s[710]!, self._r[710]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[710]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[711]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[712]! } - public var Preview_DeletePhoto: String { return self._s[713]! } - public var Appearance_AppIconFilledX: String { return self._s[714]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[715]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[711]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[712]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[713]! } + public var Preview_DeletePhoto: String { return self._s[714]! } + public var Appearance_AppIconFilledX: String { return self._s[715]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[716]! } public func Conversation_BotInteractiveUrlAlert(_ _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 Coub_TapForSound: String { return self._s[718]! } - public var Map_LocatingError: String { return self._s[719]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[721]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[722]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[723]! } - public var Passport_ForgottenPassword: String { return self._s[724]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[725]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[726]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[728]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[729]! } - public var Message_Location: String { return self._s[730]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[731]! } - public var Channel_Management_Title: String { return self._s[732]! } - public var DialogList_SearchSectionDialogs: String { return self._s[734]! } - public var Compose_NewChannel_Members: String { return self._s[735]! } + public var Coub_TapForSound: String { return self._s[719]! } + public var Map_LocatingError: String { return self._s[720]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[722]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[723]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[724]! } + public var Passport_ForgottenPassword: String { return self._s[725]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[726]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[727]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[729]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[730]! } + public var Message_Location: String { return self._s[731]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[732]! } + public var Channel_Management_Title: String { return self._s[733]! } + public var DialogList_SearchSectionDialogs: String { return self._s[735]! } + public var Compose_NewChannel_Members: String { return self._s[736]! } public func DialogList_SingleUploadingFileSuffix(_ _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_Location: String { return self._s[737]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[738]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[739]! } - public var PhotoEditor_WarmthTool: String { return self._s[740]! } - public var Passport_Language_tr: String { return self._s[741]! } + public var GroupInfo_Location: String { return self._s[738]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[739]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[740]! } + public var PhotoEditor_WarmthTool: String { return self._s[741]! } + public var Passport_Language_tr: String { return self._s[742]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[742]!, self._r[742]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[743]!, self._r[743]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[744]! } - public var Watch_PhotoView_Title: String { return self._s[745]! } - public var Passport_Phone_Delete: String { return self._s[746]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[747]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[748]! } - public var GroupInfo_Permissions: String { return self._s[749]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[750]! } - public var Profile_ShareContactButton: String { return self._s[751]! } - public var ChatSettings_Other: String { return self._s[752]! } - public var UserInfo_NotificationsDisabled: String { return self._s[753]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[754]! } - public var LastSeen_WithinAMonth: String { return self._s[755]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[756]! } - public var Conversation_ReportGroupLocation: String { return self._s[757]! } - public var Conversation_EncryptionCanceled: String { return self._s[758]! } - public var MediaPicker_GroupDescription: String { return self._s[759]! } - public var WebSearch_Images: String { return self._s[760]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[745]! } + public var Watch_PhotoView_Title: String { return self._s[746]! } + public var Passport_Phone_Delete: String { return self._s[747]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[748]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[749]! } + public var GroupInfo_Permissions: String { return self._s[750]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[751]! } + public var Profile_ShareContactButton: String { return self._s[752]! } + public var ChatSettings_Other: String { return self._s[753]! } + public var UserInfo_NotificationsDisabled: String { return self._s[754]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[755]! } + public var LastSeen_WithinAMonth: String { return self._s[756]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[757]! } + public var Conversation_ReportGroupLocation: String { return self._s[758]! } + public var Conversation_EncryptionCanceled: String { return self._s[759]! } + public var MediaPicker_GroupDescription: String { return self._s[760]! } + public var WebSearch_Images: String { return self._s[761]! } public func Channel_Management_PromotedBy(_ _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 Message_Photo: String { return self._s[762]! } - public var PasscodeSettings_HelpBottom: String { return self._s[763]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[764]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[765]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[766]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[767]! } - public var NotificationsSound_Calypso: String { return self._s[768]! } - public var Map_Map: String { return self._s[769]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[771]! } - public var ChatSettings_TextSizeUnits: String { return self._s[772]! } + public var Message_Photo: String { return self._s[763]! } + public var PasscodeSettings_HelpBottom: String { return self._s[764]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[765]! } + public var EditTheme_ThemeTemplateAlert: String { return self._s[766]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[767]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[768]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[769]! } + public var NotificationsSound_Calypso: String { return self._s[770]! } + public var Map_Map: String { return self._s[771]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[773]! } + public var ChatSettings_TextSizeUnits: String { return self._s[774]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[773]!, self._r[773]!, [_0]) + return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_0]) } - public var Common_of: String { return self._s[774]! } - public var Conversation_ForwardContacts: String { return self._s[777]! } + public var Common_of: String { return self._s[776]! } + public var Conversation_ForwardContacts: String { return self._s[779]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[779]!, self._r[779]!, [_0]) + return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_0]) } - public var Passport_Language_hy: String { return self._s[780]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[781]! } - public var AutoDownloadSettings_Reset: String { return self._s[782]! } - public var Paint_ClearConfirm: String { return self._s[783]! } - public var Camera_VideoMode: String { return self._s[784]! } + public var Passport_Language_hy: String { return self._s[782]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[783]! } + public var AutoDownloadSettings_Reset: String { return self._s[784]! } + public var Paint_ClearConfirm: String { return self._s[785]! } + public var Camera_VideoMode: String { return self._s[786]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[785]!, self._r[785]!, [_0]) + return formatWithArgumentRanges(self._s[787]!, self._r[787]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[786]! } - public var Conversation_ViewBackground: String { return self._s[787]! } - public var Passport_Language_el: String { return self._s[788]! } - public var PhotoEditor_Original: String { return self._s[789]! } - public var Settings_FAQ_Button: String { return self._s[791]! } - public var Channel_Setup_PublicNoLink: String { return self._s[793]! } - public var Conversation_UnsupportedMedia: String { return self._s[794]! } - public var Conversation_SlideToCancel: String { return self._s[795]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[796]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[797]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[798]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[799]! } - public var AutoNightTheme_NotAvailable: String { return self._s[800]! } - public var Conversation_Owner: String { return self._s[801]! } - public var Common_Create: String { return self._s[802]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[803]! } - public var Localization_ChooseLanguage: String { return self._s[805]! } - public var Settings_Proxy: String { return self._s[808]! } - public var Privacy_TopPeersHelp: String { return self._s[809]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[810]! } - public var Chat_UnsendMyMessages: String { return self._s[811]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[788]! } + public var Conversation_ViewBackground: String { return self._s[789]! } + public var Passport_Language_el: String { return self._s[790]! } + public var PhotoEditor_Original: String { return self._s[791]! } + public var Settings_FAQ_Button: String { return self._s[793]! } + public var Channel_Setup_PublicNoLink: String { return self._s[795]! } + public var Conversation_UnsupportedMedia: String { return self._s[796]! } + public var Conversation_SlideToCancel: String { return self._s[797]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[798]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[799]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[800]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[801]! } + public var AutoNightTheme_NotAvailable: String { return self._s[802]! } + public var Conversation_Owner: String { return self._s[803]! } + public var Common_Create: String { return self._s[804]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[805]! } + public var Localization_ChooseLanguage: String { return self._s[807]! } + public var Settings_Proxy: String { return self._s[810]! } + public var Privacy_TopPeersHelp: String { return self._s[811]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[812]! } + public var Chat_UnsendMyMessages: String { return self._s[813]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[812]!, self._r[812]!, [_0]) + return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[813]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[815]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) + return formatWithArgumentRanges(self._s[817]!, self._r[817]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[816]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[817]! } - public var Cache_Title: String { return self._s[818]! } + public var Contacts_SortedByPresence: String { return self._s[818]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[819]! } + public var Cache_Title: String { return self._s[820]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[819]!, self._r[819]!, [_0]) + return formatWithArgumentRanges(self._s[821]!, self._r[821]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[820]! } - public var Channel_Moderator_Title: String { return self._s[821]! } - public var InstantPage_AutoNightTheme: String { return self._s[823]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[822]! } + public var Channel_Moderator_Title: String { return self._s[823]! } + public var InstantPage_AutoNightTheme: String { return self._s[825]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[826]!, self._r[826]!, [_1]) + return formatWithArgumentRanges(self._s[828]!, self._r[828]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[827]! } - public var Undo_Undo: String { return self._s[829]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[830]! } - public var TwoStepAuth_RemovePassword: String { return self._s[831]! } - public var Common_Delete: String { return self._s[832]! } - public var Contacts_AddPeopleNearby: String { return self._s[834]! } - public var Conversation_ContextMenuDelete: String { return self._s[835]! } - public var SocksProxySetup_Credentials: String { return self._s[836]! } - public var Appearance_EditTheme: String { return self._s[838]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[839]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[842]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[843]! } - public var Passport_Language_id: String { return self._s[845]! } - public var WallpaperSearch_ColorTeal: String { return self._s[846]! } - public var ChannelIntro_Title: String { return self._s[847]! } + public var Passport_Scans_Upload: String { return self._s[829]! } + public var Undo_Undo: String { return self._s[831]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[832]! } + public var TwoStepAuth_RemovePassword: String { return self._s[833]! } + public var Common_Delete: String { return self._s[834]! } + public var Contacts_AddPeopleNearby: String { return self._s[836]! } + public var Conversation_ContextMenuDelete: String { return self._s[837]! } + public var SocksProxySetup_Credentials: String { return self._s[838]! } + public var Appearance_EditTheme: String { return self._s[840]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[841]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[844]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[845]! } + public var Passport_Language_id: String { return self._s[847]! } + public var WallpaperSearch_ColorTeal: String { return self._s[848]! } + public var ChannelIntro_Title: String { return self._s[849]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[848]!, self._r[848]!, [_0]) + return formatWithArgumentRanges(self._s[850]!, self._r[850]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[850]! } - public var VoiceOver_Chat_Reply: String { return self._s[851]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[852]! } - public var Channel_Info_Description: String { return self._s[853]! } - public var Stickers_FavoriteStickers: String { return self._s[854]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[855]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[856]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[857]! } - public var Group_PublicLink_Placeholder: String { return self._s[858]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[859]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[852]! } + public var VoiceOver_Chat_Reply: String { return self._s[853]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[854]! } + public var Channel_Info_Description: String { return self._s[855]! } + public var Stickers_FavoriteStickers: String { return self._s[856]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[857]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[858]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[859]! } + public var Group_PublicLink_Placeholder: String { return self._s[860]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[861]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1]) + return formatWithArgumentRanges(self._s[862]!, self._r[862]!, [_1]) } - public var TextFormat_Underline: String { return self._s[861]! } + public var TextFormat_Underline: String { return self._s[863]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[862]!, self._r[862]!, [_1, _2]) + return formatWithArgumentRanges(self._s[864]!, self._r[864]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[863]!, self._r[863]!, [_0]) + return formatWithArgumentRanges(self._s[865]!, self._r[865]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[864]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[866]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[865]!, self._r[865]!, [_1, _2]) + return formatWithArgumentRanges(self._s[867]!, self._r[867]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[866]! } - public var Passport_Language_uk: String { return self._s[867]! } - public var StickerPack_HideStickers: String { return self._s[869]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[870]! } + public var GroupPermission_Delete: String { return self._s[868]! } + public var Passport_Language_uk: String { return self._s[869]! } + public var StickerPack_HideStickers: String { return self._s[871]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[872]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_1, _2]) + return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[872]! } + public var Activity_UploadingVideoMessage: String { return self._s[874]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_0]) + return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[874]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[875]! } - public var Settings_CallSettings: String { return self._s[876]! } - public var Camera_SquareMode: String { return self._s[877]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[878]! } - public var GroupInfo_SharedMediaNone: String { return self._s[879]! } + public var Channel_TitleInfo: String { return self._s[876]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[877]! } + public var Settings_CallSettings: String { return self._s[878]! } + public var Camera_SquareMode: String { return self._s[879]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[880]! } + public var GroupInfo_SharedMediaNone: String { return self._s[881]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[880]!, self._r[880]!, [_1]) + return formatWithArgumentRanges(self._s[882]!, self._r[882]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[881]! } - public var Application_Update: String { return self._s[883]! } - public var Month_ShortJanuary: String { return self._s[884]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[885]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[886]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[887]! } - public var Passport_Address_Street2Placeholder: String { return self._s[888]! } + public var Bot_GenericBotStatus: String { return self._s[883]! } + public var Application_Update: String { return self._s[885]! } + public var Month_ShortJanuary: String { return self._s[886]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[887]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[888]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[889]! } + public var Passport_Address_Street2Placeholder: String { return self._s[890]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[889]!, self._r[889]!, [_0]) + return formatWithArgumentRanges(self._s[891]!, self._r[891]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[890]! } - public var Appearance_PreviewOutgoingText: String { return self._s[891]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[892]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[894]! } - public var Map_Directions: String { return self._s[895]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[897]! } - public var Appearance_ThemeDay: String { return self._s[898]! } - public var LogoutOptions_LogOut: String { return self._s[899]! } - public var Group_PublicLink_Title: String { return self._s[901]! } - public var Channel_AddBotErrorNoRights: String { return self._s[902]! } - public var Passport_Identity_AddPassport: String { return self._s[903]! } - public var LocalGroup_ButtonTitle: String { return self._s[904]! } - public var Call_Message: String { return self._s[905]! } - public var PhotoEditor_ExposureTool: String { return self._s[906]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[908]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[910]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[911]! } - public var Appearance_Preview: String { return self._s[912]! } - public var Compose_ChannelMembers: String { return self._s[913]! } - public var Conversation_DeleteManyMessages: String { return self._s[914]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[915]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[916]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[917]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[920]! } - public var Conversation_UpdateTelegram: String { return self._s[921]! } + public var NetworkUsageSettings_Cellular: String { return self._s[892]! } + public var Appearance_PreviewOutgoingText: String { return self._s[893]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[894]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[896]! } + public var Map_Directions: String { return self._s[897]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[899]! } + public var Appearance_ThemeDay: String { return self._s[900]! } + public var LogoutOptions_LogOut: String { return self._s[901]! } + public var Group_PublicLink_Title: String { return self._s[903]! } + public var Channel_AddBotErrorNoRights: String { return self._s[904]! } + public var Passport_Identity_AddPassport: String { return self._s[905]! } + public var LocalGroup_ButtonTitle: String { return self._s[906]! } + public var Call_Message: String { return self._s[907]! } + public var PhotoEditor_ExposureTool: String { return self._s[908]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[910]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[912]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[913]! } + public var Appearance_Preview: String { return self._s[914]! } + public var Compose_ChannelMembers: String { return self._s[915]! } + public var Conversation_DeleteManyMessages: String { return self._s[916]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[917]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[918]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[919]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[922]! } + public var Conversation_UpdateTelegram: String { return self._s[923]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[922]!, self._r[922]!, [_0]) + return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_1]) + return formatWithArgumentRanges(self._s[925]!, self._r[925]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[924]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[925]! } + public var GroupInfo_Administrators_Title: String { return self._s[926]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[927]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_0]) + return formatWithArgumentRanges(self._s[928]!, self._r[928]!, [_0]) } - public var Tour_Title3: String { return self._s[927]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[928]! } - public var Clipboard_SendPhoto: String { return self._s[932]! } - public var MediaPicker_Videos: String { return self._s[933]! } - public var Passport_Email_Title: String { return self._s[934]! } + public var Tour_Title3: String { return self._s[929]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[930]! } + public var Clipboard_SendPhoto: String { return self._s[934]! } + public var MediaPicker_Videos: String { return self._s[935]! } + public var Passport_Email_Title: String { return self._s[936]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_0]) + return formatWithArgumentRanges(self._s[937]!, self._r[937]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[936]! } - public var Conversation_MessageDialogDelete: String { return self._s[937]! } - public var Privacy_Calls_CustomHelp: String { return self._s[939]! } - public var Message_Wallpaper: String { return self._s[940]! } - public var MemberSearch_BotSection: String { return self._s[941]! } - public var GroupInfo_SetSound: String { return self._s[942]! } - public var Core_ServiceUserStatus: String { return self._s[943]! } - public var LiveLocationUpdated_JustNow: String { return self._s[944]! } - public var Call_StatusFailed: String { return self._s[945]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[946]! } - public var TwoStepAuth_SetPassword: String { return self._s[947]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[948]! } + public var StickerPacksSettings_Title: String { return self._s[938]! } + public var Conversation_MessageDialogDelete: String { return self._s[939]! } + public var Privacy_Calls_CustomHelp: String { return self._s[941]! } + public var Message_Wallpaper: String { return self._s[942]! } + public var MemberSearch_BotSection: String { return self._s[943]! } + public var GroupInfo_SetSound: String { return self._s[944]! } + public var Core_ServiceUserStatus: String { return self._s[945]! } + public var LiveLocationUpdated_JustNow: String { return self._s[946]! } + public var Call_StatusFailed: String { return self._s[947]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[948]! } + public var TwoStepAuth_SetPassword: String { return self._s[949]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[950]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[950]!, self._r[950]!, [_0]) + return formatWithArgumentRanges(self._s[952]!, self._r[952]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[951]! } - public var Profile_Username: String { return self._s[952]! } - public var Bot_DescriptionTitle: String { return self._s[953]! } - public var MaskStickerSettings_Title: String { return self._s[954]! } - public var SharedMedia_CategoryOther: String { return self._s[955]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[956]! } - public var Common_NotNow: String { return self._s[957]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[958]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[959]! } - public var Map_Location: String { return self._s[960]! } - public var Invitation_JoinGroup: String { return self._s[961]! } - public var AutoDownloadSettings_Title: String { return self._s[963]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[964]! } - public var Channel_ErrorAddBlocked: String { return self._s[965]! } - public var Conversation_UnblockUser: String { return self._s[966]! } - public var Watch_Bot_Restart: String { return self._s[967]! } - public var TwoStepAuth_Title: String { return self._s[968]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[969]! } - public var Checkout_ShippingMethod: String { return self._s[970]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[971]! } + public var Calls_SubmitRating: String { return self._s[953]! } + public var Profile_Username: String { return self._s[954]! } + public var Bot_DescriptionTitle: String { return self._s[955]! } + public var MaskStickerSettings_Title: String { return self._s[956]! } + public var SharedMedia_CategoryOther: String { return self._s[957]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[958]! } + public var Common_NotNow: String { return self._s[959]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[960]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[961]! } + public var Map_Location: String { return self._s[962]! } + public var Invitation_JoinGroup: String { return self._s[963]! } + public var AutoDownloadSettings_Title: String { return self._s[965]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[966]! } + public var Channel_ErrorAddBlocked: String { return self._s[967]! } + public var Conversation_UnblockUser: String { return self._s[968]! } + public var Watch_Bot_Restart: String { return self._s[969]! } + public var TwoStepAuth_Title: String { return self._s[970]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[971]! } + public var Checkout_ShippingMethod: String { return self._s[972]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[973]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[974]!, self._r[974]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[974]!, self._r[974]!, [_0]) + return formatWithArgumentRanges(self._s[976]!, self._r[976]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[975]!, self._r[975]!, [_0]) + return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[976]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[977]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[978]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[979]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[980]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[981]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[982]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[983]! } - public var Checkout_PaymentMethod_Title: String { return self._s[984]! } - public var SocksProxySetup_Connection: String { return self._s[985]! } - public var Group_MessagePhotoRemoved: String { return self._s[986]! } - public var Channel_Stickers_NotFound: String { return self._s[988]! } - public var Group_About_Help: String { return self._s[989]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[990]! } - public var PeopleNearby_Title: String { return self._s[992]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[978]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[979]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[980]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[981]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[982]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[983]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[984]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[985]! } + public var Checkout_PaymentMethod_Title: String { return self._s[986]! } + public var SocksProxySetup_Connection: String { return self._s[987]! } + public var Group_MessagePhotoRemoved: String { return self._s[988]! } + public var Channel_Stickers_NotFound: String { return self._s[990]! } + public var Group_About_Help: String { return self._s[991]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[992]! } + public var PeopleNearby_Title: String { return self._s[994]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[993]!, self._r[993]!, [_1]) + return formatWithArgumentRanges(self._s[995]!, self._r[995]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[995]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[996]! } - public var SocksProxySetup_Password: String { return self._s[997]! } - public var Notifications_PermissionsEnable: String { return self._s[998]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[1000]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[997]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[998]! } + public var SocksProxySetup_Password: String { return self._s[999]! } + public var Notifications_PermissionsEnable: String { return self._s[1000]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1002]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1001]!, self._r[1001]!, [_1]) + return formatWithArgumentRanges(self._s[1003]!, self._r[1003]!, [_1]) } - public var EditTheme_ShortLinkInfo: String { return self._s[1002]! } + public var EditTheme_ShortLinkInfo: String { return self._s[1004]! } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_0]) + return formatWithArgumentRanges(self._s[1006]!, self._r[1006]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1005]! } - public var ArchivedPacksAlert_Title: String { return self._s[1006]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1007]! } + public var ArchivedPacksAlert_Title: String { return self._s[1008]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1007]!, self._r[1007]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1009]!, self._r[1009]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1008]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1010]! } - public var Conversation_StatusTyping: String { return self._s[1011]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1012]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1013]! } - public var UserInfo_CreateNewContact: String { return self._s[1014]! } - public var Passport_Identity_FrontSide: String { return self._s[1015]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1016]! } - public var Calls_CallTabTitle: String { return self._s[1017]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1018]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1010]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1012]! } + public var Conversation_StatusTyping: String { return self._s[1013]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1014]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1015]! } + public var UserInfo_CreateNewContact: String { return self._s[1016]! } + public var Passport_Identity_FrontSide: String { return self._s[1017]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1018]! } + public var Calls_CallTabTitle: String { return self._s[1019]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1020]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1020]!, self._r[1020]!, [_0]) + return formatWithArgumentRanges(self._s[1022]!, self._r[1022]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1021]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1022]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1023]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1024]! } - public var Paint_Stickers: String { return self._s[1025]! } - public var Privacy_GroupsAndChannels: String { return self._s[1026]! } - public var UserInfo_AddContact: String { return self._s[1028]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1023]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1024]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1025]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1026]! } + public var Paint_Stickers: String { return self._s[1027]! } + public var Privacy_GroupsAndChannels: String { return self._s[1028]! } + public var UserInfo_AddContact: String { return self._s[1030]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_0]) + return formatWithArgumentRanges(self._s[1031]!, self._r[1031]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1031]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1033]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1033]!, self._r[1033]!, [_0]) + return formatWithArgumentRanges(self._s[1035]!, self._r[1035]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1034]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1035]! } - public var BlockedUsers_BlockUser: String { return self._s[1036]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1037]! } - public var MediaPicker_UngroupDescription: String { return self._s[1038]! } - public var Watch_NoConnection: String { return self._s[1039]! } - public var Month_GenSeptember: String { return self._s[1040]! } - public var Conversation_ViewGroup: String { return self._s[1041]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1044]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1045]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1046]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1047]! } - public var MediaPicker_CameraRoll: String { return self._s[1049]! } - public var Month_GenAugust: String { return self._s[1050]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1051]! } - public var SharedMedia_EmptyText: String { return self._s[1052]! } - public var Map_ShareLiveLocation: String { return self._s[1053]! } - public var Calls_All: String { return self._s[1054]! } - public var Appearance_ThemeNight: String { return self._s[1057]! } - public var Conversation_HoldForAudio: String { return self._s[1058]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1061]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1062]! } - public var SocksProxySetup_Secret: String { return self._s[1063]! } + public var DialogList_NoMessagesTitle: String { return self._s[1036]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1037]! } + public var BlockedUsers_BlockUser: String { return self._s[1038]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1039]! } + public var MediaPicker_UngroupDescription: String { return self._s[1040]! } + public var Watch_NoConnection: String { return self._s[1041]! } + public var Month_GenSeptember: String { return self._s[1042]! } + public var Conversation_ViewGroup: String { return self._s[1043]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1046]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1047]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1048]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1049]! } + public var MediaPicker_CameraRoll: String { return self._s[1051]! } + public var Month_GenAugust: String { return self._s[1052]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1053]! } + public var SharedMedia_EmptyText: String { return self._s[1054]! } + public var Map_ShareLiveLocation: String { return self._s[1055]! } + public var Calls_All: String { return self._s[1056]! } + public var Appearance_ThemeNight: String { return self._s[1059]! } + public var Conversation_HoldForAudio: String { return self._s[1060]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1063]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1064]! } + public var SocksProxySetup_Secret: String { return self._s[1065]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1064]!, self._r[1064]!, [_0]) + return formatWithArgumentRanges(self._s[1066]!, self._r[1066]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1066]! } - public var Conversation_Location: String { return self._s[1067]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1068]! } + public var Conversation_Location: String { return self._s[1069]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1068]!, self._r[1068]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1070]!, self._r[1070]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1070]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1071]! } - public var Notifications_PermissionsText: String { return self._s[1072]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1073]! } - public var Call_Flip: String { return self._s[1074]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1076]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1077]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1079]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1081]! } - public var Channel_TooMuchBots: String { return self._s[1083]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1084]! } - public var Login_InvalidCodeError: String { return self._s[1085]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1086]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1072]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1073]! } + public var Notifications_PermissionsText: String { return self._s[1074]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1075]! } + public var Call_Flip: String { return self._s[1076]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1078]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1079]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1081]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1083]! } + public var Channel_TooMuchBots: String { return self._s[1085]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1086]! } + public var Login_InvalidCodeError: String { return self._s[1087]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1088]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1087]!, self._r[1087]!, [_0]) + return formatWithArgumentRanges(self._s[1089]!, self._r[1089]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1088]!, self._r[1088]!, [_0]) + return formatWithArgumentRanges(self._s[1090]!, self._r[1090]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1089]! } - public var Call_CallInProgressTitle: String { return self._s[1090]! } - public var Month_ShortSeptember: String { return self._s[1091]! } - public var Watch_ChannelInfo_Title: String { return self._s[1092]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1095]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1096]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1097]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1098]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1099]! } - public var PhotoEditor_CropReset: String { return self._s[1100]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1102]! } - public var Channel_Management_LabelEditor: String { return self._s[1103]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1105]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1106]! } - public var UserInfo_Title: String { return self._s[1107]! } - public var ChatList_HideAction: String { return self._s[1108]! } - public var AccessDenied_Title: String { return self._s[1109]! } - public var DialogList_SearchLabel: String { return self._s[1110]! } - public var Group_Setup_HistoryHidden: String { return self._s[1111]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1112]! } - public var State_Updating: String { return self._s[1114]! } - public var Contacts_TabTitle: String { return self._s[1115]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1117]! } - public var GroupInfo_GroupHistory: String { return self._s[1118]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1119]! } - public var Wallpaper_SetColor: String { return self._s[1120]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1121]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1122]! } - public var Chat_AttachmentLimitReached: String { return self._s[1123]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1124]! } - public var Contacts_NotRegisteredSection: String { return self._s[1125]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1091]! } + public var Call_CallInProgressTitle: String { return self._s[1092]! } + public var Month_ShortSeptember: String { return self._s[1093]! } + public var Watch_ChannelInfo_Title: String { return self._s[1094]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1097]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1098]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1099]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1100]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1101]! } + public var PhotoEditor_CropReset: String { return self._s[1102]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1104]! } + public var Channel_Management_LabelEditor: String { return self._s[1105]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1107]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1108]! } + public var UserInfo_Title: String { return self._s[1109]! } + public var ChatList_HideAction: String { return self._s[1110]! } + public var AccessDenied_Title: String { return self._s[1111]! } + public var DialogList_SearchLabel: String { return self._s[1112]! } + public var Group_Setup_HistoryHidden: String { return self._s[1113]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1114]! } + public var State_Updating: String { return self._s[1116]! } + public var Contacts_TabTitle: String { return self._s[1117]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1119]! } + public var GroupInfo_GroupHistory: String { return self._s[1120]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1121]! } + public var Wallpaper_SetColor: String { return self._s[1122]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1123]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1124]! } + public var Chat_AttachmentLimitReached: String { return self._s[1125]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1126]! } + public var Contacts_NotRegisteredSection: String { return self._s[1127]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1126]!, self._r[1126]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1128]!, self._r[1128]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1127]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1128]! } - public var SocksProxySetup_Connecting: String { return self._s[1129]! } - public var ExplicitContent_AlertChannel: String { return self._s[1130]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1131]! } - public var Conversation_Contact: String { return self._s[1132]! } - public var Login_CodeExpired: String { return self._s[1133]! } - public var Passport_DiscardMessageAction: String { return self._s[1134]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1135]! } + public var Paint_Clear: String { return self._s[1129]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1130]! } + public var SocksProxySetup_Connecting: String { return self._s[1131]! } + public var ExplicitContent_AlertChannel: String { return self._s[1132]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1133]! } + public var Conversation_Contact: String { return self._s[1134]! } + public var Login_CodeExpired: String { return self._s[1135]! } + public var Passport_DiscardMessageAction: String { return self._s[1136]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1137]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1136]!, self._r[1136]!, [_0]) + return formatWithArgumentRanges(self._s[1138]!, self._r[1138]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1137]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1138]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1139]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1140]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1139]!, self._r[1139]!, [_0]) + return formatWithArgumentRanges(self._s[1141]!, self._r[1141]!, [_0]) } - public var Month_ShortApril: String { return self._s[1140]! } - public var AuthSessions_CurrentSession: String { return self._s[1141]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1144]! } - public var WallpaperPreview_CropTopText: String { return self._s[1146]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1147]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1148]! } + public var Month_ShortApril: String { return self._s[1142]! } + public var AuthSessions_CurrentSession: String { return self._s[1143]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1146]! } + public var WallpaperPreview_CropTopText: String { return self._s[1148]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1149]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1150]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1149]!, self._r[1149]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1151]!, self._r[1151]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1150]! } - public var Channel_Setup_TypePrivate: String { return self._s[1152]! } - public var Forward_ChannelReadOnly: String { return self._s[1155]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1156]! } - public var AddContact_SharedContactException: String { return self._s[1157]! } - public var UserInfo_BotPrivacy: String { return self._s[1159]! } - public var Notification_PassportValueEmail: String { return self._s[1160]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1161]! } - public var GroupPermission_NewTitle: String { return self._s[1162]! } - public var CallFeedback_ReasonDropped: String { return self._s[1163]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1164]! } - public var Channel_SignMessages_Help: String { return self._s[1166]! } - public var Undo_ChatDeleted: String { return self._s[1168]! } - public var Conversation_ChatBackground: String { return self._s[1169]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1170]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1171]! } - public var Passport_Language_pt: String { return self._s[1172]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1173]! } - public var NotificationsSound_Popcorn: String { return self._s[1176]! } - public var AutoNightTheme_Disabled: String { return self._s[1177]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1178]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1179]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1180]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1181]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1152]! } + public var Channel_Setup_TypePrivate: String { return self._s[1154]! } + public var Forward_ChannelReadOnly: String { return self._s[1157]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1158]! } + public var AddContact_SharedContactException: String { return self._s[1159]! } + public var UserInfo_BotPrivacy: String { return self._s[1161]! } + public var Notification_PassportValueEmail: String { return self._s[1162]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1163]! } + public var GroupPermission_NewTitle: String { return self._s[1164]! } + public var CallFeedback_ReasonDropped: String { return self._s[1165]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1166]! } + public var Channel_SignMessages_Help: String { return self._s[1168]! } + public var Undo_ChatDeleted: String { return self._s[1170]! } + public var Conversation_ChatBackground: String { return self._s[1171]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1172]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1173]! } + public var Passport_Language_pt: String { return self._s[1174]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1175]! } + public var NotificationsSound_Popcorn: String { return self._s[1178]! } + public var AutoNightTheme_Disabled: String { return self._s[1179]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1180]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1181]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1182]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1183]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1182]!, self._r[1182]!, [_0]) + return formatWithArgumentRanges(self._s[1184]!, self._r[1184]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1183]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1184]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1186]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1185]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1186]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1188]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1187]!, self._r[1187]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1189]!, self._r[1189]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1190]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1191]! } - public var Compose_NewEncryptedChat: String { return self._s[1192]! } - public var Login_CodeFloodError: String { return self._s[1193]! } - public var Calls_TabTitle: String { return self._s[1194]! } - public var Privacy_ProfilePhoto: String { return self._s[1195]! } - public var Passport_Language_he: String { return self._s[1196]! } + public var SocksProxySetup_Hostname: String { return self._s[1192]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1193]! } + public var Compose_NewEncryptedChat: String { return self._s[1194]! } + public var Login_CodeFloodError: String { return self._s[1195]! } + public var Calls_TabTitle: String { return self._s[1196]! } + public var Privacy_ProfilePhoto: String { return self._s[1197]! } + public var Passport_Language_he: String { return self._s[1198]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1197]!, self._r[1197]!, [_0]) - } - public var GroupPermission_Title: String { return self._s[1198]! } - public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1199]!, self._r[1199]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1200]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1201]! } - public var Tour_Text1: String { return self._s[1202]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1203]! } - public var Month_ShortFebruary: String { return self._s[1204]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1205]! } - public var NotificationsSound_Glass: String { return self._s[1206]! } - public var Appearance_ThemeNightBlue: String { return self._s[1207]! } - public var CheckoutInfo_Pay: String { return self._s[1208]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1210]! } - public var Call_CallAgain: String { return self._s[1212]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1213]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1214]! } - public var Passport_InvalidPasswordError: String { return self._s[1215]! } - public var Watch_Message_Game: String { return self._s[1216]! } - public var Stickers_Install: String { return self._s[1217]! } - public var VoiceOver_Chat_Message: String { return self._s[1218]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1219]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1221]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1222]! } - public var AuthSessions_OtherSessions: String { return self._s[1223]! } - public var Channel_Username_Help: String { return self._s[1224]! } - public var Camera_Title: String { return self._s[1225]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1227]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1228]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1229]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1230]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1231]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1232]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1233]! } - public var Conversation_RestrictedStickers: String { return self._s[1234]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1236]! } - public var UserInfo_TelegramCall: String { return self._s[1238]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1239]! } - public var CreatePoll_OptionsHeader: String { return self._s[1240]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1241]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1242]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1243]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1244]! } + public var GroupPermission_Title: String { return self._s[1200]! } + public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1201]!, self._r[1201]!, [_0]) + } + public var GroupPermission_NoChangeInfo: String { return self._s[1202]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1203]! } + public var Tour_Text1: String { return self._s[1204]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1205]! } + public var Month_ShortFebruary: String { return self._s[1206]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1207]! } + public var NotificationsSound_Glass: String { return self._s[1208]! } + public var Appearance_ThemeNightBlue: String { return self._s[1209]! } + public var CheckoutInfo_Pay: String { return self._s[1210]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1212]! } + public var Call_CallAgain: String { return self._s[1214]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1215]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1216]! } + public var Passport_InvalidPasswordError: String { return self._s[1217]! } + public var Watch_Message_Game: String { return self._s[1218]! } + public var Stickers_Install: String { return self._s[1219]! } + public var VoiceOver_Chat_Message: String { return self._s[1220]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1221]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1223]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1224]! } + public var AuthSessions_OtherSessions: String { return self._s[1225]! } + public var Channel_Username_Help: String { return self._s[1226]! } + public var Camera_Title: String { return self._s[1227]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1229]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1230]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1231]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1232]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1233]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1234]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1235]! } + public var Conversation_RestrictedStickers: String { return self._s[1236]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1238]! } + public var UserInfo_TelegramCall: String { return self._s[1240]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1241]! } + public var CreatePoll_OptionsHeader: String { return self._s[1242]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1243]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1244]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1245]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1246]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1245]!, self._r[1245]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1247]!, self._r[1247]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1246]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1247]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1248]! } - public var Conversation_MessageDialogRetry: String { return self._s[1249]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1250]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1251]! } - public var Group_Setup_TypeHeader: String { return self._s[1252]! } - public var Paint_RecentStickers: String { return self._s[1253]! } - public var PhotoEditor_GrainTool: String { return self._s[1254]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1255]! } - public var EmptyGroupInfo_Line4: String { return self._s[1256]! } - public var Watch_AuthRequired: String { return self._s[1258]! } + public var Settings_SaveEditedPhotos: String { return self._s[1248]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1249]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1250]! } + public var Conversation_MessageDialogRetry: String { return self._s[1251]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1252]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1253]! } + public var Group_Setup_TypeHeader: String { return self._s[1254]! } + public var Paint_RecentStickers: String { return self._s[1255]! } + public var PhotoEditor_GrainTool: String { return self._s[1256]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1257]! } + public var EmptyGroupInfo_Line4: String { return self._s[1258]! } + public var Watch_AuthRequired: String { return self._s[1260]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1259]!, self._r[1259]!, [_0]) + return formatWithArgumentRanges(self._s[1261]!, self._r[1261]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1260]! } - public var ChannelIntro_Text: String { return self._s[1261]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1262]! } - public var GroupPermission_NoSendMedia: String { return self._s[1263]! } - public var Calls_AddTab: String { return self._s[1264]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1265]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1266]! } - public var Notification_MessageLifetime1d: String { return self._s[1267]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1268]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1269]! } - public var Passport_Identity_GenderFemale: String { return self._s[1270]! } - public var BlockedUsers_BlockTitle: String { return self._s[1271]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1262]! } + public var ChannelIntro_Text: String { return self._s[1263]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1264]! } + public var GroupPermission_NoSendMedia: String { return self._s[1265]! } + public var Calls_AddTab: String { return self._s[1266]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1267]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1268]! } + public var Notification_MessageLifetime1d: String { return self._s[1269]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1270]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1271]! } + public var Passport_Identity_GenderFemale: String { return self._s[1272]! } + public var BlockedUsers_BlockTitle: String { return self._s[1273]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1272]!, self._r[1272]!, [_1]) + return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1273]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1274]! } - public var ChatList_ArchiveAction: String { return self._s[1275]! } - public var AutoNightTheme_Scheduled: String { return self._s[1276]! } + public var Weekday_Yesterday: String { return self._s[1275]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1276]! } + public var ChatList_ArchiveAction: String { return self._s[1277]! } + public var AutoNightTheme_Scheduled: String { return self._s[1278]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1278]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1280]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1280]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1281]! } + public var CreatePoll_Create: String { return self._s[1282]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1283]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1284]!, self._r[1284]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1283]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1284]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1286]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1285]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1286]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1288]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1]) + return formatWithArgumentRanges(self._s[1289]!, self._r[1289]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1288]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1289]! } + public var Preview_OpenInInstagram: String { return self._s[1290]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1291]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1290]!, self._r[1290]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1292]!, self._r[1292]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1291]!, self._r[1291]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1292]! } - public var ArchivedChats_IntroText3: String { return self._s[1293]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1294]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1295]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1296]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1294]! } + public var ArchivedChats_IntroText3: String { return self._s[1295]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1296]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1297]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1298]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1297]!, self._r[1297]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1299]!, self._r[1299]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1299]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1300]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1301]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1302]! } - public var Gif_NoGifsFound: String { return self._s[1303]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1304]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1305]! } - public var EditTheme_Preview: String { return self._s[1306]! } - public var GroupInfo_ActionPromote: String { return self._s[1307]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1308]! } - public var GroupInfo_Permissions_Title: String { return self._s[1309]! } - public var Permissions_ContactsText_v0: String { return self._s[1310]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1311]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1312]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1315]! } - public var Passport_FieldEmailHelp: String { return self._s[1316]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1301]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1302]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1303]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1304]! } + public var Gif_NoGifsFound: String { return self._s[1305]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1306]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1307]! } + public var EditTheme_Preview: String { return self._s[1308]! } + public var GroupInfo_ActionPromote: String { return self._s[1309]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1310]! } + public var GroupInfo_Permissions_Title: String { return self._s[1311]! } + public var Permissions_ContactsText_v0: String { return self._s[1312]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1313]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1314]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1317]! } + public var Passport_FieldEmailHelp: String { return self._s[1318]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1317]!, self._r[1317]!, [_0]) + return formatWithArgumentRanges(self._s[1319]!, self._r[1319]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1318]! } - public var Weekday_ShortSaturday: String { return self._s[1319]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1320]! } - public var Watch_Conversation_UserInfo: String { return self._s[1321]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1322]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1323]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1324]! } - public var PhotoEditor_VignetteTool: String { return self._s[1325]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1326]! } - public var Passport_Language_et: String { return self._s[1327]! } - public var AppUpgrade_Running: String { return self._s[1328]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1330]! } - public var Passport_Language_bg: String { return self._s[1331]! } - public var Stickers_NoStickersFound: String { return self._s[1333]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1320]! } + public var Weekday_ShortSaturday: String { return self._s[1321]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1322]! } + public var Watch_Conversation_UserInfo: String { return self._s[1323]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1324]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1325]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1326]! } + public var PhotoEditor_VignetteTool: String { return self._s[1327]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1328]! } + public var Passport_Language_et: String { return self._s[1329]! } + public var AppUpgrade_Running: String { return self._s[1330]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1332]! } + public var Passport_Language_bg: String { return self._s[1333]! } + public var Stickers_NoStickersFound: String { return self._s[1335]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1335]!, self._r[1335]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1337]!, self._r[1337]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1336]!, self._r[1336]!, [_0]) + return formatWithArgumentRanges(self._s[1338]!, self._r[1338]!, [_0]) } - public var Settings_About: String { return self._s[1337]! } + public var Settings_About: String { return self._s[1339]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1338]!, self._r[1338]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1340]!, self._r[1340]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1340]! } - public var Group_ErrorAddBlocked: String { return self._s[1341]! } + public var KeyCommand_NewMessage: String { return self._s[1342]! } + public var Group_ErrorAddBlocked: String { return self._s[1343]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_0]) + return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1343]! } - public var ReportGroupLocation_Title: String { return self._s[1344]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1345]! } - public var Cache_ClearProgress: String { return self._s[1346]! } + public var Map_LocationTitle: String { return self._s[1345]! } + public var ReportGroupLocation_Title: String { return self._s[1346]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1347]! } + public var Cache_ClearProgress: String { return self._s[1348]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_0]) + return formatWithArgumentRanges(self._s[1349]!, self._r[1349]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1348]! } - public var Passport_UpdateRequiredError: String { return self._s[1349]! } + public var GroupRemoved_AddToGroup: String { return self._s[1350]! } + public var Passport_UpdateRequiredError: String { return self._s[1351]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_1]) + return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1352]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1353]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1354]! } - public var Passport_Language_ka: String { return self._s[1355]! } - public var Call_Decline: String { return self._s[1356]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1357]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1354]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1355]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1356]! } + public var Passport_Language_ka: String { return self._s[1357]! } + public var Call_Decline: String { return self._s[1358]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1359]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1360]!, self._r[1360]!, [_0]) + return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1361]! } + public var CallFeedback_Send: String { return self._s[1363]! } + public var EditTheme_EditTitle: String { return self._s[1364]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1365]!, self._r[1365]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1363]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1365]! } - public var Passport_DeletePassport: String { return self._s[1366]! } - public var Appearance_AppIconFilled: String { return self._s[1367]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1368]! } - public var Month_ShortDecember: String { return self._s[1369]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1371]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1366]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1368]! } + public var Passport_DeletePassport: String { return self._s[1369]! } + public var Appearance_AppIconFilled: String { return self._s[1370]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1371]! } + public var Month_ShortDecember: String { return self._s[1372]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1374]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_0]) + return formatWithArgumentRanges(self._s[1375]!, self._r[1375]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1373]! } - public var Conversation_EncryptedDescription1: String { return self._s[1374]! } - public var Conversation_EncryptedDescription2: String { return self._s[1375]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1376]! } - public var Conversation_EncryptedDescription3: String { return self._s[1377]! } - public var PhotoEditor_SharpenTool: String { return self._s[1378]! } + public var Channel_Stickers_Searching: String { return self._s[1376]! } + public var Conversation_EncryptedDescription1: String { return self._s[1377]! } + public var Conversation_EncryptedDescription2: String { return self._s[1378]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1379]! } + public var Conversation_EncryptedDescription3: String { return self._s[1380]! } + public var PhotoEditor_SharpenTool: String { return self._s[1381]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1379]!, self._r[1379]!, [_0]) + return formatWithArgumentRanges(self._s[1382]!, self._r[1382]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1381]! } - public var Channel_Members_AddMembers: String { return self._s[1382]! } - public var Wallpaper_Search: String { return self._s[1383]! } - public var Weekday_Friday: String { return self._s[1384]! } - public var Privacy_ContactsSync: String { return self._s[1385]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1386]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1387]! } + public var Conversation_EncryptedDescription4: String { return self._s[1384]! } + public var Channel_Members_AddMembers: String { return self._s[1385]! } + public var Wallpaper_Search: String { return self._s[1386]! } + public var Weekday_Friday: String { return self._s[1387]! } + public var Privacy_ContactsSync: String { return self._s[1388]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1389]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1390]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1388]!, self._r[1388]!, [_0]) - } - public var GroupInfo_Permissions_Removed: String { return self._s[1389]! } - public var Passport_Identity_GenderMale: String { return self._s[1390]! } - public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1391]!, self._r[1391]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1392]! } - public var Conversation_JumpToDate: String { return self._s[1393]! } - public var Contacts_GlobalSearch: String { return self._s[1394]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1395]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1396]! } - public var Profile_MessageLifetime1d: String { return self._s[1397]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1392]! } + public var Passport_Identity_GenderMale: String { return self._s[1393]! } + public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_0]) + } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1395]! } + public var Conversation_JumpToDate: String { return self._s[1396]! } + public var Contacts_GlobalSearch: String { return self._s[1397]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1398]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1399]! } + public var Profile_MessageLifetime1d: String { return self._s[1400]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1401]!, self._r[1401]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1401]! } + public var StickerPack_BuiltinPackName: String { return self._s[1404]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1405]!, self._r[1405]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1403]! } - public var Passport_InfoTitle: String { return self._s[1405]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1406]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1406]! } + public var Passport_InfoTitle: String { return self._s[1408]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1409]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1410]!, self._r[1410]!, [_0]) + return formatWithArgumentRanges(self._s[1413]!, self._r[1413]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1411]!, self._r[1411]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1414]!, self._r[1414]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1412]! } - public var Profile_BotInfo: String { return self._s[1413]! } - public var Watch_Compose_CreateMessage: String { return self._s[1414]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1415]! } - public var Month_ShortNovember: String { return self._s[1416]! } - public var Conversation_ScamWarning: String { return self._s[1417]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1418]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1419]! } - public var NotificationsSound_Chime: String { return self._s[1420]! } - public var Passport_Language_ko: String { return self._s[1422]! } - public var InviteText_URL: String { return self._s[1423]! } - public var TextFormat_Monospace: String { return self._s[1424]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1415]! } + public var Profile_BotInfo: String { return self._s[1416]! } + public var Watch_Compose_CreateMessage: String { return self._s[1417]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1418]! } + public var Month_ShortNovember: String { return self._s[1419]! } + public var Conversation_ScamWarning: String { return self._s[1420]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1421]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1422]! } + public var NotificationsSound_Chime: String { return self._s[1423]! } + public var Passport_Language_ko: String { return self._s[1425]! } + public var InviteText_URL: String { return self._s[1426]! } + public var TextFormat_Monospace: String { return self._s[1427]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1425]!, self._r[1425]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1428]!, self._r[1428]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1426]!, self._r[1426]!, [_0]) + return formatWithArgumentRanges(self._s[1429]!, self._r[1429]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1430]!, self._r[1430]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1429]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1430]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1431]! } - public var Your_card_has_expired: String { return self._s[1432]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1433]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1434]! } - public var Conversation_Report: String { return self._s[1438]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1439]! } - public var Notification_MessageLifetime1m: String { return self._s[1440]! } - public var Privacy_ContactsTitle: String { return self._s[1441]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1442]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1443]! } - public var Channel_Members_Title: String { return self._s[1444]! } - public var Map_OpenInWaze: String { return self._s[1445]! } - public var Login_PhoneBannedError: String { return self._s[1446]! } + public var EditTheme_CreateTitle: String { return self._s[1432]! } + public var Passport_InfoLearnMore: String { return self._s[1433]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1434]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1435]! } + public var Your_card_has_expired: String { return self._s[1436]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1437]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1438]! } + public var Conversation_Report: String { return self._s[1442]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1443]! } + public var Notification_MessageLifetime1m: String { return self._s[1444]! } + public var Privacy_ContactsTitle: String { return self._s[1445]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1446]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1447]! } + public var Channel_Members_Title: String { return self._s[1448]! } + public var Map_OpenInWaze: String { return self._s[1449]! } + public var Login_PhoneBannedError: String { return self._s[1450]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_0]) + return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1448]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1449]! } - public var Common_OK: String { return self._s[1450]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1451]! } - public var Cache_Music: String { return self._s[1452]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1453]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1454]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1455]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1452]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1453]! } + public var Common_OK: String { return self._s[1454]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1455]! } + public var Cache_Music: String { return self._s[1456]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1457]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1458]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1459]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1456]!, self._r[1456]!, [_1]) + return formatWithArgumentRanges(self._s[1460]!, self._r[1460]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1457]!, self._r[1457]!, [_0]) + return formatWithArgumentRanges(self._s[1461]!, self._r[1461]!, [_0]) } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1458]!, self._r[1458]!, [_0]) + return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1460]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1461]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1463]! } - public var State_ConnectingToProxyInfo: String { return self._s[1464]! } - public var Message_VideoMessage: String { return self._s[1466]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1467]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1468]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1469]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1470]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1471]! } - public var Activity_RecordingAudio: String { return self._s[1472]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1473]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1474]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1464]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1465]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1467]! } + public var State_ConnectingToProxyInfo: String { return self._s[1468]! } + public var Message_VideoMessage: String { return self._s[1470]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1471]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1472]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1473]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1474]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1475]! } + public var Activity_RecordingAudio: String { return self._s[1476]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1477]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1478]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0]) - } - public var Conversation_ApplyLocalization: String { return self._s[1481]! } - public var UserInfo_AddPhone: String { return self._s[1482]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1483]! } - public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1484]!, self._r[1484]!, [_0]) } - public var Passport_Scans: String { return self._s[1486]! } - public var BlockedUsers_Unblock: String { return self._s[1487]! } + public var Conversation_ApplyLocalization: String { return self._s[1485]! } + public var UserInfo_AddPhone: String { return self._s[1486]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1487]! } + public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1488]!, self._r[1488]!, [_0]) + } + public var Passport_Scans: String { return self._s[1490]! } + public var BlockedUsers_Unblock: String { return self._s[1491]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1488]!, self._r[1488]!, [_1]) + return formatWithArgumentRanges(self._s[1492]!, self._r[1492]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1489]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1490]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1491]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1492]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1493]! } + public var Channel_Management_LabelCreator: String { return self._s[1493]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1494]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1495]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1496]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1497]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1494]!, self._r[1494]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1498]!, self._r[1498]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1495]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1496]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1497]! } - public var ChannelIntro_CreateChannel: String { return self._s[1498]! } - public var Conversation_UnreadMessages: String { return self._s[1499]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1500]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1501]! } - public var Notification_GroupActivated: String { return self._s[1502]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1503]! } + public var Login_PhoneNumberHelp: String { return self._s[1499]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1500]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1501]! } + public var ChannelIntro_CreateChannel: String { return self._s[1502]! } + public var Conversation_UnreadMessages: String { return self._s[1503]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1504]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1505]! } + public var Notification_GroupActivated: String { return self._s[1506]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1507]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_0]) - } - public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0, _1]) - } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1507]! } - public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1509]! } - public var CallFeedback_AddComment: String { return self._s[1510]! } + public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1509]!, self._r[1509]!, [_0, _1]) + } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1511]! } + public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1512]!, self._r[1512]!, [_0]) + } + public var Undo_DeletedChannel: String { return self._s[1513]! } + public var CallFeedback_AddComment: String { return self._s[1514]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_0]) + return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1512]! } + public var Document_TargetConfirmationFormat: String { return self._s[1516]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_0]) + return formatWithArgumentRanges(self._s[1517]!, self._r[1517]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1514]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1518]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_1, _2, _3, _4]) } - public var Theme_ErrorNotFound: String { return self._s[1516]! } - public var Contacts_SortByName: String { return self._s[1517]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1518]! } + public var Theme_ErrorNotFound: String { return self._s[1520]! } + public var Contacts_SortByName: String { return self._s[1521]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1522]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1524]!, self._r[1524]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1521]! } - public var ScheduledMessages_EditTime: String { return self._s[1522]! } - public var Conversation_ClearSelfHistory: String { return self._s[1523]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1524]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1525]! } - public var Stickers_SuggestNone: String { return self._s[1526]! } - public var ChatSettings_Cache: String { return self._s[1527]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1528]! } - public var Media_ShareThisPhoto: String { return self._s[1529]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1530]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1531]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1532]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1533]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1534]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1535]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1536]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1538]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1539]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1540]! } - public var Map_OpenIn: String { return self._s[1541]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1525]! } + public var ScheduledMessages_EditTime: String { return self._s[1526]! } + public var Conversation_ClearSelfHistory: String { return self._s[1527]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1528]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1529]! } + public var Stickers_SuggestNone: String { return self._s[1530]! } + public var ChatSettings_Cache: String { return self._s[1531]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1532]! } + public var Media_ShareThisPhoto: String { return self._s[1533]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1534]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1535]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1536]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1537]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1538]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1539]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1540]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1542]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1543]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1544]! } + public var Map_OpenIn: String { return self._s[1545]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1544]!, self._r[1544]!, [_1]) + return formatWithArgumentRanges(self._s[1548]!, self._r[1548]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_0]) + return formatWithArgumentRanges(self._s[1549]!, self._r[1549]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1546]! } - public var MessagePoll_LabelClosed: String { return self._s[1547]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1549]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1550]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1551]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1552]! } - public var Login_SelectCountry_Title: String { return self._s[1553]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1554]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1550]! } + public var MessagePoll_LabelClosed: String { return self._s[1551]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1553]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1554]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1555]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1556]! } + public var Login_SelectCountry_Title: String { return self._s[1557]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1558]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1556]! } - public var Watch_Suggestion_BRB: String { return self._s[1557]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1558]! } - public var Contacts_PermissionsTitle: String { return self._s[1559]! } - public var Conversation_RestrictedInline: String { return self._s[1560]! } - public var StickerPack_ViewPack: String { return self._s[1562]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1560]! } + public var Watch_Suggestion_BRB: String { return self._s[1561]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1562]! } + public var Contacts_PermissionsTitle: String { return self._s[1563]! } + public var Conversation_RestrictedInline: String { return self._s[1564]! } + public var StickerPack_ViewPack: String { return self._s[1566]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1563]!, self._r[1563]!, [_0]) + return formatWithArgumentRanges(self._s[1567]!, self._r[1567]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1565]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1568]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1570]! } - public var Channel_Info_Stickers: String { return self._s[1571]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1572]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1573]! } - public var Passport_DeletePersonalDetails: String { return self._s[1574]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1575]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1576]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1577]! } - public var Conversation_SearchNoResults: String { return self._s[1579]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1580]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1581]! } - public var Login_Code: String { return self._s[1582]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1583]! } - public var Weekday_ShortThursday: String { return self._s[1584]! } - public var Resolve_ErrorNotFound: String { return self._s[1586]! } - public var LastSeen_Offline: String { return self._s[1587]! } - public var PeopleNearby_NoMembers: String { return self._s[1588]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1589]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1590]! } - public var GroupInfo_Title: String { return self._s[1592]! } - public var NotificationsSound_Note: String { return self._s[1593]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1594]! } - public var Watch_Message_Poll: String { return self._s[1595]! } - public var Privacy_Calls: String { return self._s[1596]! } + public var Compose_NewChannel: String { return self._s[1569]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1572]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1574]! } + public var Channel_Info_Stickers: String { return self._s[1575]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1576]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1577]! } + public var Passport_DeletePersonalDetails: String { return self._s[1578]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1579]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1580]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1581]! } + public var Conversation_SearchNoResults: String { return self._s[1583]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1584]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1585]! } + public var Login_Code: String { return self._s[1586]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1587]! } + public var Weekday_ShortThursday: String { return self._s[1588]! } + public var Resolve_ErrorNotFound: String { return self._s[1590]! } + public var LastSeen_Offline: String { return self._s[1591]! } + public var PeopleNearby_NoMembers: String { return self._s[1592]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1593]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1594]! } + public var GroupInfo_Title: String { return self._s[1596]! } + public var NotificationsSound_Note: String { return self._s[1597]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1598]! } + public var Watch_Message_Poll: String { return self._s[1599]! } + public var Privacy_Calls: String { return self._s[1600]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1597]!, self._r[1597]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1601]!, self._r[1601]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1598]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1599]! } - public var Notifications_Reset: String { return self._s[1600]! } - public var Conversation_Pin: String { return self._s[1601]! } - public var Passport_Language_lv: String { return self._s[1602]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1603]! } - public var BlockedUsers_Info: String { return self._s[1604]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1606]! } - public var Watch_Conversation_Unblock: String { return self._s[1608]! } + public var Month_ShortAugust: String { return self._s[1602]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1603]! } + public var Notifications_Reset: String { return self._s[1604]! } + public var Conversation_Pin: String { return self._s[1605]! } + public var Passport_Language_lv: String { return self._s[1606]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1607]! } + public var BlockedUsers_Info: String { return self._s[1608]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1610]! } + public var Watch_Conversation_Unblock: String { return self._s[1612]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_0]) + return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1610]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1611]! } + public var CloudStorage_Title: String { return self._s[1614]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1615]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_0]) + return formatWithArgumentRanges(self._s[1616]!, self._r[1616]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1613]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1614]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1615]! } - public var Passport_Address_EditBankStatement: String { return self._s[1616]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1617]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1618]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1619]! } + public var Passport_Address_EditBankStatement: String { return self._s[1620]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1617]!, self._r[1617]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1621]!, self._r[1621]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1618]! } - public var ShareMenu_Comment: String { return self._s[1619]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1620]! } - public var Notifications_PermissionsTitle: String { return self._s[1621]! } - public var GroupPermission_NoSendLinks: String { return self._s[1622]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1623]! } - public var Settings_Support: String { return self._s[1624]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1625]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1626]! } - public var Privacy_Forwards_Preview: String { return self._s[1627]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1628]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1629]! } - public var Common_Select: String { return self._s[1631]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1632]! } - public var WallpaperSearch_ColorGray: String { return self._s[1634]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1635]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1636]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1637]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1638]! } - public var Widget_AuthRequired: String { return self._s[1639]! } - public var Camera_FlashOn: String { return self._s[1640]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1641]! } - public var Watch_Suggestion_OK: String { return self._s[1642]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1622]! } + public var ShareMenu_Comment: String { return self._s[1623]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1624]! } + public var Notifications_PermissionsTitle: String { return self._s[1625]! } + public var GroupPermission_NoSendLinks: String { return self._s[1626]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1627]! } + public var Settings_Support: String { return self._s[1628]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1629]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1630]! } + public var Privacy_Forwards_Preview: String { return self._s[1631]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1632]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1633]! } + public var Common_Select: String { return self._s[1635]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1636]! } + public var WallpaperSearch_ColorGray: String { return self._s[1638]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1639]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1640]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1641]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1642]! } + public var Widget_AuthRequired: String { return self._s[1643]! } + public var Camera_FlashOn: String { return self._s[1644]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1645]! } + public var Watch_Suggestion_OK: String { return self._s[1646]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1644]!, self._r[1644]!, [_0]) + return formatWithArgumentRanges(self._s[1648]!, self._r[1648]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1646]!, self._r[1646]!, [_0]) + return formatWithArgumentRanges(self._s[1650]!, self._r[1650]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1647]! } - public var DialogList_AdLabel: String { return self._s[1648]! } - public var WatchRemote_NotificationText: String { return self._s[1649]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1650]! } - public var Conversation_ReportSpam: String { return self._s[1651]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1652]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1654]! } - public var PhoneLabel_Title: String { return self._s[1655]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1656]! } - public var Settings_ChangePhoneNumber: String { return self._s[1657]! } - public var Notifications_ExceptionsTitle: String { return self._s[1658]! } - public var Notifications_AlertTones: String { return self._s[1659]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1660]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1661]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1662]! } - public var VoiceOver_Chat_Photo: String { return self._s[1664]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1665]! } - public var ReportPeer_ReasonOther: String { return self._s[1666]! } - public var KeyCommand_ScrollDown: String { return self._s[1668]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1669]! } + public var TextFormat_Strikethrough: String { return self._s[1651]! } + public var DialogList_AdLabel: String { return self._s[1652]! } + public var WatchRemote_NotificationText: String { return self._s[1653]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1654]! } + public var Conversation_ReportSpam: String { return self._s[1655]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1656]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1658]! } + public var PhoneLabel_Title: String { return self._s[1659]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1660]! } + public var Settings_ChangePhoneNumber: String { return self._s[1661]! } + public var Notifications_ExceptionsTitle: String { return self._s[1662]! } + public var Notifications_AlertTones: String { return self._s[1663]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1664]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1665]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1666]! } + public var VoiceOver_Chat_Photo: String { return self._s[1668]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1669]! } + public var ReportPeer_ReasonOther: String { return self._s[1670]! } + public var KeyCommand_ScrollDown: String { return self._s[1672]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1673]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1670]!, self._r[1670]!, [_0]) + return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1671]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1672]! } - public var AuthSessions_LogOut: String { return self._s[1673]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1674]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1675]! } - public var Passport_Phone_Title: String { return self._s[1676]! } - public var Settings_PhoneNumber: String { return self._s[1677]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1675]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1676]! } + public var AuthSessions_LogOut: String { return self._s[1677]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1678]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1679]! } + public var Passport_Phone_Title: String { return self._s[1680]! } + public var Settings_PhoneNumber: String { return self._s[1681]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_0]) + return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1679]! } - public var WebSearch_SearchNoResults: String { return self._s[1680]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1682]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1683]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1684]! } - public var PhotoEditor_CurvesTool: String { return self._s[1685]! } - public var Checkout_PaymentMethod: String { return self._s[1687]! } + public var NotificationsSound_Alert: String { return self._s[1683]! } + public var WebSearch_SearchNoResults: String { return self._s[1684]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1686]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1687]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1688]! } + public var PhotoEditor_CurvesTool: String { return self._s[1689]! } + public var Checkout_PaymentMethod: String { return self._s[1691]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1692]!, self._r[1692]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1689]! } - public var Camera_PhotoMode: String { return self._s[1692]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1694]! } - public var CallSettings_OnMobile: String { return self._s[1695]! } - public var Tour_Text2: String { return self._s[1696]! } + public var Contacts_AccessDeniedError: String { return self._s[1693]! } + public var Camera_PhotoMode: String { return self._s[1696]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1698]! } + public var CallSettings_OnMobile: String { return self._s[1699]! } + public var Tour_Text2: String { return self._s[1700]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1697]!, self._r[1697]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1699]! } - public var Permissions_Skip: String { return self._s[1700]! } - public var SecretImage_Title: String { return self._s[1701]! } - public var Watch_MessageView_Title: String { return self._s[1702]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1703]! } - public var AttachmentMenu_Poll: String { return self._s[1704]! } + public var DialogList_EncryptionProcessing: String { return self._s[1703]! } + public var Permissions_Skip: String { return self._s[1704]! } + public var SecretImage_Title: String { return self._s[1705]! } + public var Watch_MessageView_Title: String { return self._s[1706]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1707]! } + public var AttachmentMenu_Poll: String { return self._s[1708]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_0]) + return formatWithArgumentRanges(self._s[1709]!, self._r[1709]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1710]!, self._r[1710]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1707]! } - public var WallpaperPreview_Title: String { return self._s[1708]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1709]! } - public var Settings_ProxyConnecting: String { return self._s[1710]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1712]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1713]! } - public var Profile_MessageLifetime5s: String { return self._s[1714]! } - public var Username_InvalidCharacters: String { return self._s[1715]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1716]! } - public var ScheduledMessages_ClearAll: String { return self._s[1717]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1718]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1719]! } - public var Settings_AddAccount: String { return self._s[1720]! } - public var Notification_CreatedChannel: String { return self._s[1723]! } + public var Notification_CallCanceled: String { return self._s[1711]! } + public var WallpaperPreview_Title: String { return self._s[1712]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1713]! } + public var Settings_ProxyConnecting: String { return self._s[1714]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1716]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1717]! } + public var Profile_MessageLifetime5s: String { return self._s[1718]! } + public var Username_InvalidCharacters: String { return self._s[1719]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1720]! } + public var ScheduledMessages_ClearAll: String { return self._s[1721]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1722]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1723]! } + public var Settings_AddAccount: String { return self._s[1724]! } + public var Notification_CreatedChannel: String { return self._s[1727]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1724]!, self._r[1724]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1726]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1727]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1728]! } - public var Contacts_TopSection: String { return self._s[1729]! } + public var Passcode_AppLockedAlert: String { return self._s[1730]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1731]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1732]! } + public var Contacts_TopSection: String { return self._s[1733]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1730]!, self._r[1730]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1731]!, self._r[1731]!, [_0]) + return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1732]! } - public var UserInfo_TapToCall: String { return self._s[1733]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1735]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1736]! } - public var Common_Search: String { return self._s[1737]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1738]! } + public var ReportPeer_ReasonSpam: String { return self._s[1736]! } + public var UserInfo_TapToCall: String { return self._s[1737]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1739]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1740]! } + public var Common_Search: String { return self._s[1741]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1742]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0]) + return formatWithArgumentRanges(self._s[1743]!, self._r[1743]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1740]! } - public var Message_InvoiceLabel: String { return self._s[1741]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1742]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1743]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1744]! } + public var Message_InvoiceLabel: String { return self._s[1745]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1746]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1747]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1744]!, self._r[1744]!, [_0]) + return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_0]) } - public var Conversation_Info: String { return self._s[1745]! } - public var Login_InfoDeletePhoto: String { return self._s[1746]! } - public var Passport_Language_vi: String { return self._s[1748]! } - public var UserInfo_ScamUserWarning: String { return self._s[1749]! } - public var Conversation_Search: String { return self._s[1750]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1751]! } - public var ReportPeer_ReasonPornography: String { return self._s[1752]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1753]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1754]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1755]! } - public var Channel_Setup_TypeHeader: String { return self._s[1756]! } - public var AuthSessions_LoggedIn: String { return self._s[1757]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1758]! } - public var Login_SmsRequestState3: String { return self._s[1759]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1760]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1761]! } - public var Join_ChannelsTooMuch: String { return self._s[1762]! } - public var Channel_Edit_LinkItem: String { return self._s[1763]! } - public var Privacy_Calls_P2PNever: String { return self._s[1764]! } - public var Conversation_AddToReadingList: String { return self._s[1766]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1767]! } - public var Message_Animation: String { return self._s[1768]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1769]! } - public var Map_Unknown: String { return self._s[1770]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1771]! } + public var Conversation_Info: String { return self._s[1749]! } + public var Login_InfoDeletePhoto: String { return self._s[1750]! } + public var Passport_Language_vi: String { return self._s[1752]! } + public var UserInfo_ScamUserWarning: String { return self._s[1753]! } + public var Conversation_Search: String { return self._s[1754]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1755]! } + public var ReportPeer_ReasonPornography: String { return self._s[1756]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1757]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1758]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1759]! } + public var Channel_Setup_TypeHeader: String { return self._s[1760]! } + public var AuthSessions_LoggedIn: String { return self._s[1761]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1762]! } + public var Login_SmsRequestState3: String { return self._s[1763]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1764]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1765]! } + public var Join_ChannelsTooMuch: String { return self._s[1766]! } + public var Channel_Edit_LinkItem: String { return self._s[1767]! } + public var Privacy_Calls_P2PNever: String { return self._s[1768]! } + public var Conversation_AddToReadingList: String { return self._s[1770]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1771]! } + public var Message_Animation: String { return self._s[1772]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1773]! } + public var Map_Unknown: String { return self._s[1774]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1775]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1776]!, self._r[1776]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_1, _2]) - } - public var Call_StatusRequesting: String { return self._s[1774]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1775]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1776]! } - public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_1, _2]) } + public var Call_StatusRequesting: String { return self._s[1778]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1779]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1780]! } + public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1781]!, self._r[1781]!, [_1, _2]) + } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_0]) + return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) } - public var Update_Skip: String { return self._s[1779]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1780]! } - public var Message_PinnedPollMessage: String { return self._s[1781]! } - public var BlockedUsers_Title: String { return self._s[1782]! } + public var Update_Skip: String { return self._s[1783]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1784]! } + public var Message_PinnedPollMessage: String { return self._s[1785]! } + public var BlockedUsers_Title: String { return self._s[1786]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_1]) + return formatWithArgumentRanges(self._s[1787]!, self._r[1787]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1784]! } - public var NotificationsSound_Bell: String { return self._s[1785]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1786]! } - public var Weekday_Monday: String { return self._s[1787]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1788]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1789]! } - public var ChatSettings_Groups: String { return self._s[1790]! } + public var Username_CheckingUsername: String { return self._s[1788]! } + public var NotificationsSound_Bell: String { return self._s[1789]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1790]! } + public var Weekday_Monday: String { return self._s[1791]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1792]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1793]! } + public var ChatSettings_Groups: String { return self._s[1794]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1791]!, self._r[1791]!, [_0]) + return formatWithArgumentRanges(self._s[1795]!, self._r[1795]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1792]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1794]! } - public var ChatList_Unmute: String { return self._s[1795]! } - public var PhotoEditor_CurvesAll: String { return self._s[1796]! } - public var Weekday_ShortTuesday: String { return self._s[1797]! } - public var DialogList_Read: String { return self._s[1798]! } - public var Appearance_AppIconClassic: String { return self._s[1799]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1800]! } - public var Passport_Identity_Gender: String { return self._s[1801]! } + public var Your_card_was_declined: String { return self._s[1796]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1798]! } + public var ChatList_Unmute: String { return self._s[1799]! } + public var PhotoEditor_CurvesAll: String { return self._s[1800]! } + public var Weekday_ShortTuesday: String { return self._s[1801]! } + public var DialogList_Read: String { return self._s[1802]! } + public var Appearance_AppIconClassic: String { return self._s[1803]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1804]! } + public var Passport_Identity_Gender: String { return self._s[1805]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1802]!, self._r[1802]!, [_0]) + return formatWithArgumentRanges(self._s[1806]!, self._r[1806]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1803]! } + public var Target_SelectGroup: String { return self._s[1807]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1805]!, self._r[1805]!, [_0]) + return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_0]) } - public var Passport_Language_en: String { return self._s[1806]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1807]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1808]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1809]! } - public var ScheduledMessages_SendNow: String { return self._s[1810]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1812]! } - public var Login_InfoHelp: String { return self._s[1813]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1814]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1815]! } + public var Passport_Language_en: String { return self._s[1810]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1811]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1812]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1813]! } + public var ScheduledMessages_SendNow: String { return self._s[1814]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1816]! } + public var Login_InfoHelp: String { return self._s[1817]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1818]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1819]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1816]!, self._r[1816]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1820]!, self._r[1820]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1819]! } - public var CreatePoll_Title: String { return self._s[1820]! } - public var Conversation_ViewTheme: String { return self._s[1821]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1822]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1823]! } - public var UserInfo_GroupsInCommon: String { return self._s[1824]! } - public var Call_AudioRouteHide: String { return self._s[1825]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1827]! } + public var SocksProxySetup_AddProxy: String { return self._s[1823]! } + public var CreatePoll_Title: String { return self._s[1824]! } + public var Conversation_ViewTheme: String { return self._s[1825]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1826]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1827]! } + public var UserInfo_GroupsInCommon: String { return self._s[1828]! } + public var Call_AudioRouteHide: String { return self._s[1829]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1831]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1828]!, self._r[1828]!, [_0]) + return formatWithArgumentRanges(self._s[1832]!, self._r[1832]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1829]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1830]! } - public var Notifications_Title: String { return self._s[1831]! } - public var Group_Username_InvalidTooShort: String { return self._s[1832]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1833]! } + public var TextFormat_Bold: String { return self._s[1833]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1834]! } + public var Notifications_Title: String { return self._s[1835]! } + public var Group_Username_InvalidTooShort: String { return self._s[1836]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1837]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1834]!, self._r[1834]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1836]! } - public var Stickers_SuggestAdded: String { return self._s[1837]! } - public var Login_CountryCode: String { return self._s[1838]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1839]! } - public var Map_GetDirections: String { return self._s[1840]! } - public var Login_PhoneFloodError: String { return self._s[1841]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1840]! } + public var Stickers_SuggestAdded: String { return self._s[1841]! } + public var Login_CountryCode: String { return self._s[1842]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1843]! } + public var Map_GetDirections: String { return self._s[1844]! } + public var Login_PhoneFloodError: String { return self._s[1845]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1842]!, self._r[1842]!, [_0]) + return formatWithArgumentRanges(self._s[1846]!, self._r[1846]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1844]! } - public var Group_Location_ChangeLocation: String { return self._s[1845]! } - public var Notification_GroupInviterSelf: String { return self._s[1846]! } - public var InstantPage_TapToOpenLink: String { return self._s[1847]! } + public var Settings_SetUsername: String { return self._s[1848]! } + public var Group_Location_ChangeLocation: String { return self._s[1849]! } + public var Notification_GroupInviterSelf: String { return self._s[1850]! } + public var InstantPage_TapToOpenLink: String { return self._s[1851]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_0]) + return formatWithArgumentRanges(self._s[1852]!, self._r[1852]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1849]! } - public var SecretChat_Title: String { return self._s[1850]! } - public var Group_UpgradeNoticeText1: String { return self._s[1851]! } - public var AuthSessions_Title: String { return self._s[1852]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1853]! } + public var SecretChat_Title: String { return self._s[1854]! } + public var Group_UpgradeNoticeText1: String { return self._s[1855]! } + public var AuthSessions_Title: String { return self._s[1856]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_0]) + return formatWithArgumentRanges(self._s[1857]!, self._r[1857]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1854]! } - public var Channel_About_Title: String { return self._s[1855]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1856]! } + public var PhotoEditor_CropAuto: String { return self._s[1858]! } + public var Channel_About_Title: String { return self._s[1859]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1860]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1859]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1861]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1862]! } + public var VoiceOver_MessageContextReport: String { return self._s[1863]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1865]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1866]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1863]!, self._r[1863]!, [_1]) + return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1865]!, self._r[1865]!, [_0]) + return formatWithArgumentRanges(self._s[1869]!, self._r[1869]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1866]!, self._r[1866]!, [_0]) + return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1867]! } - public var Presence_online: String { return self._s[1869]! } - public var PasscodeSettings_Title: String { return self._s[1870]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1871]! } - public var Web_OpenExternal: String { return self._s[1872]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1874]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1875]! } - public var LocalGroup_Title: String { return self._s[1876]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1871]! } + public var Presence_online: String { return self._s[1873]! } + public var PasscodeSettings_Title: String { return self._s[1874]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1875]! } + public var Web_OpenExternal: String { return self._s[1876]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1878]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1879]! } + public var LocalGroup_Title: String { return self._s[1880]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1878]! } - public var Map_YouAreHere: String { return self._s[1879]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1880]!, self._r[1880]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1882]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1883]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1882]! } + public var Map_YouAreHere: String { return self._s[1883]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1886]! } - public var Bot_Start: String { return self._s[1887]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1886]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1887]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1888]!, self._r[1888]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1890]! } - public var AccentColor_Title: String { return self._s[1892]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1893]! } + public var SocksProxySetup_Username: String { return self._s[1890]! } + public var Bot_Start: String { return self._s[1891]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1892]!, self._r[1892]!, [_0]) + } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1893]!, self._r[1893]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[1894]! } + public var AccentColor_Title: String { return self._s[1896]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1897]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1894]!, self._r[1894]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1898]!, self._r[1898]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1895]!, self._r[1895]!, [_0]) + return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1896]!, self._r[1896]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1900]!, self._r[1900]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1897]! } - public var Login_InfoAvatarPhoto: String { return self._s[1898]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1899]! } - public var Tour_Title4: String { return self._s[1900]! } - public var Passport_Identity_Translation: String { return self._s[1901]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1902]! } - public var Login_TermsOfServiceLabel: String { return self._s[1904]! } - public var Passport_Language_it: String { return self._s[1905]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1906]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1907]! } - public var Conversation_ClearAll: String { return self._s[1909]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1911]! } - public var TwoStepAuth_FloodError: String { return self._s[1912]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1901]! } + public var Login_InfoAvatarPhoto: String { return self._s[1902]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1903]! } + public var Tour_Title4: String { return self._s[1904]! } + public var Passport_Identity_Translation: String { return self._s[1905]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1906]! } + public var Login_TermsOfServiceLabel: String { return self._s[1908]! } + public var Passport_Language_it: String { return self._s[1909]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1910]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1911]! } + public var Conversation_ClearAll: String { return self._s[1913]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1915]! } + public var TwoStepAuth_FloodError: String { return self._s[1916]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_1]) + return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_1]) } - public var Paint_Delete: String { return self._s[1914]! } - public var Privacy_AddNewPeer: String { return self._s[1915]! } + public var Paint_Delete: String { return self._s[1918]! } + public var Privacy_AddNewPeer: String { return self._s[1919]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1916]!, self._r[1916]!, [_1]) + return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1917]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1921]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1918]!, self._r[1918]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1919]! } + public var Message_PinnedAudioMessage: String { return self._s[1923]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0]) + return formatWithArgumentRanges(self._s[1924]!, self._r[1924]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1921]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1922]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1923]! } - public var Conversation_MessageEditedLabel: String { return self._s[1924]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1925]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1926]! } + public var Notification_Mute1hMin: String { return self._s[1925]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1926]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1927]! } + public var Conversation_MessageEditedLabel: String { return self._s[1928]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1929]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1930]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1927]!, self._r[1927]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1931]!, self._r[1931]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1928]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1932]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1929]!, self._r[1929]!, [_1]) + return formatWithArgumentRanges(self._s[1933]!, self._r[1933]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1930]! } - public var Month_GenOctober: String { return self._s[1931]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1932]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1933]! } - public var MediaPicker_TimerTooltip: String { return self._s[1935]! } - public var SharedMedia_TitleAll: String { return self._s[1936]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1939]! } - public var Conversation_RestrictedMedia: String { return self._s[1940]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1941]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1943]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1944]! } + public var AccessDenied_LocationTracking: String { return self._s[1934]! } + public var Month_GenOctober: String { return self._s[1935]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1936]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1937]! } + public var MediaPicker_TimerTooltip: String { return self._s[1939]! } + public var SharedMedia_TitleAll: String { return self._s[1940]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1943]! } + public var Conversation_RestrictedMedia: String { return self._s[1944]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1945]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1947]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1948]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1945]!, self._r[1945]!, [_0]) + return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1948]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1950]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1951]! } + public var Conversation_SavedMessages: String { return self._s[1952]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1954]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1955]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0]) + return formatWithArgumentRanges(self._s[1957]!, self._r[1957]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1954]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1958]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1955]!, self._r[1955]!, [_0]) + return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1956]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1957]! } + public var ReportPeer_AlertSuccess: String { return self._s[1960]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1961]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1958]!, self._r[1958]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1962]!, self._r[1962]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1959]! } - public var PhotoEditor_FadeTool: String { return self._s[1960]! } - public var Privacy_ContactsReset: String { return self._s[1961]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1963]! } + public var PhotoEditor_FadeTool: String { return self._s[1964]! } + public var Privacy_ContactsReset: String { return self._s[1965]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_0]) + return formatWithArgumentRanges(self._s[1967]!, self._r[1967]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1964]! } - public var ChatList_Mute: String { return self._s[1965]! } - public var Permissions_CellularDataText_v0: String { return self._s[1966]! } - public var ShareMenu_SelectChats: String { return self._s[1968]! } - public var MusicPlayer_VoiceNote: String { return self._s[1969]! } - public var Conversation_RestrictedText: String { return self._s[1970]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1971]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1972]! } - public var Cache_Videos: String { return self._s[1973]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1974]! } - public var FeatureDisabled_Oops: String { return self._s[1976]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1977]! } + public var Message_PinnedVideoMessage: String { return self._s[1968]! } + public var ChatList_Mute: String { return self._s[1969]! } + public var Permissions_CellularDataText_v0: String { return self._s[1970]! } + public var ShareMenu_SelectChats: String { return self._s[1972]! } + public var MusicPlayer_VoiceNote: String { return self._s[1973]! } + public var Conversation_RestrictedText: String { return self._s[1974]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1975]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1976]! } + public var Cache_Videos: String { return self._s[1977]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1978]! } + public var FeatureDisabled_Oops: String { return self._s[1980]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1981]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_0]) + return formatWithArgumentRanges(self._s[1982]!, self._r[1982]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1979]! } - public var GroupPermission_NoSendPolls: String { return self._s[1980]! } - public var Message_VideoExpired: String { return self._s[1982]! } - public var Notifications_Badge: String { return self._s[1983]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1984]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1985]! } - public var Username_InvalidTooShort: String { return self._s[1986]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1987]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1988]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1989]! } + public var Stickers_GroupStickersHelp: String { return self._s[1983]! } + public var GroupPermission_NoSendPolls: String { return self._s[1984]! } + public var Message_VideoExpired: String { return self._s[1986]! } + public var Notifications_Badge: String { return self._s[1987]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1988]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1989]! } + public var Username_InvalidTooShort: String { return self._s[1990]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1991]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1992]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1993]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1990]!, self._r[1990]!, [_1]) + return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1991]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1992]! } - public var SharedMedia_CategoryDocs: String { return self._s[1995]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1995]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1996]! } + public var SharedMedia_CategoryDocs: String { return self._s[1999]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1996]!, self._r[1996]!, [_1]) + return formatWithArgumentRanges(self._s[2000]!, self._r[2000]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[1998]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2002]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1999]!, self._r[1999]!, [_1]) + return formatWithArgumentRanges(self._s[2003]!, self._r[2003]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2000]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2004]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2001]!, self._r[2001]!, [_0]) + return formatWithArgumentRanges(self._s[2005]!, self._r[2005]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2002]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2003]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2004]! } - public var Channel_UpdatePhotoItem: String { return self._s[2005]! } - public var GroupInfo_LeftStatus: String { return self._s[2006]! } - public var Watch_MessageView_Forward: String { return self._s[2008]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2009]! } - public var Cache_ClearEmpty: String { return self._s[2011]! } - public var Localization_LanguageName: String { return self._s[2012]! } - public var WebSearch_GIFs: String { return self._s[2013]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2014]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2015]! } - public var Common_Back: String { return self._s[2016]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2017]! } + public var ChatSettings_PrivateChats: String { return self._s[2006]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2007]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2008]! } + public var Channel_UpdatePhotoItem: String { return self._s[2009]! } + public var GroupInfo_LeftStatus: String { return self._s[2010]! } + public var Watch_MessageView_Forward: String { return self._s[2012]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2013]! } + public var Cache_ClearEmpty: String { return self._s[2015]! } + public var Localization_LanguageName: String { return self._s[2016]! } + public var WebSearch_GIFs: String { return self._s[2017]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2018]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2019]! } + public var Common_Back: String { return self._s[2020]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2021]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2018]!, self._r[2018]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2019]! } - public var Watch_Conversation_Reply: String { return self._s[2021]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2023]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2024]! } - public var Channel_BanUser_Unban: String { return self._s[2026]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2027]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2028]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2030]! } - public var Passport_Identity_Name: String { return self._s[2031]! } + public var Passport_Email_Help: String { return self._s[2023]! } + public var Watch_Conversation_Reply: String { return self._s[2025]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2027]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2028]! } + public var Channel_BanUser_Unban: String { return self._s[2030]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2031]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2032]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2034]! } + public var Passport_Identity_Name: String { return self._s[2035]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2032]!, self._r[2032]!, [_0]) + return formatWithArgumentRanges(self._s[2036]!, self._r[2036]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2033]! } - public var Conversation_BlockUser: String { return self._s[2034]! } - public var Month_GenJanuary: String { return self._s[2035]! } - public var ChatSettings_TextSize: String { return self._s[2036]! } - public var Notification_PassportValuePhone: String { return self._s[2037]! } - public var Passport_Language_ne: String { return self._s[2038]! } - public var Notification_CallBack: String { return self._s[2039]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2040]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2037]! } + public var Conversation_BlockUser: String { return self._s[2038]! } + public var Month_GenJanuary: String { return self._s[2039]! } + public var ChatSettings_TextSize: String { return self._s[2040]! } + public var Notification_PassportValuePhone: String { return self._s[2041]! } + public var Passport_Language_ne: String { return self._s[2042]! } + public var Notification_CallBack: String { return self._s[2043]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2044]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_0]) + return formatWithArgumentRanges(self._s[2045]!, self._r[2045]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2042]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2043]! } - public var Stickers_FrequentlyUsed: String { return self._s[2044]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2045]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2047]! } + public var Channel_Info_Management: String { return self._s[2046]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2047]! } + public var Stickers_FrequentlyUsed: String { return self._s[2048]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2049]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2051]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2049]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2050]! } - public var CreatePoll_TextHeader: String { return self._s[2051]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2053]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2054]! } + public var CreatePoll_TextHeader: String { return self._s[2055]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_0]) + return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2053]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2054]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2056]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2057]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2058]! } + public var PhotoEditor_QualityMedium: String { return self._s[2057]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2058]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2060]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2061]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2062]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2059]!, self._r[2059]!, [_0]) + return formatWithArgumentRanges(self._s[2063]!, self._r[2063]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2060]!, self._r[2060]!, [_1]) + return formatWithArgumentRanges(self._s[2064]!, self._r[2064]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2062]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2063]! } - public var Settings_Username: String { return self._s[2065]! } - public var Conversation_Block: String { return self._s[2067]! } - public var Wallpaper_Wallpaper: String { return self._s[2068]! } - public var SocksProxySetup_UseProxy: String { return self._s[2070]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2071]! } - public var MessageTimer_Forever: String { return self._s[2072]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2073]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2074]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2075]! } - public var Passport_Language_da: String { return self._s[2076]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2077]! } + public var Conversation_LinkDialogOpen: String { return self._s[2066]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2067]! } + public var Settings_Username: String { return self._s[2069]! } + public var Conversation_Block: String { return self._s[2071]! } + public var Wallpaper_Wallpaper: String { return self._s[2072]! } + public var SocksProxySetup_UseProxy: String { return self._s[2074]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2075]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2076]! } + public var MessageTimer_Forever: String { return self._s[2077]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2078]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2079]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2080]! } + public var Passport_Language_da: String { return self._s[2081]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2082]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2078]!, self._r[2078]!, [_0]) + return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2079]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2084]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2081]!, self._r[2081]!, [_0]) + return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2083]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2084]! } - public var Conversation_PinnedPoll: String { return self._s[2085]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2086]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2088]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2089]! } + public var Conversation_PinnedPoll: String { return self._s[2090]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2091]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_1]) + return formatWithArgumentRanges(self._s[2092]!, self._r[2092]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2088]! } - public var Cache_ByPeerHeader: String { return self._s[2089]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2093]! } + public var Cache_ByPeerHeader: String { return self._s[2094]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_0]) + return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2091]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2094]! } - public var Notification_PinnedMessage: String { return self._s[2095]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2097]! } - public var Contacts_SortBy: String { return self._s[2098]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2096]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2099]! } + public var Notification_PinnedMessage: String { return self._s[2100]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2102]! } + public var Contacts_SortBy: String { return self._s[2103]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2099]!, self._r[2099]!, [_1]) + return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2101]!, self._r[2101]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2102]! } - public var Watch_UserInfo_Service: String { return self._s[2103]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2105]! } - public var Conversation_Unpin: String { return self._s[2107]! } - public var CancelResetAccount_Title: String { return self._s[2108]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2109]! } + public var Call_EncryptionKey_Title: String { return self._s[2107]! } + public var Watch_UserInfo_Service: String { return self._s[2108]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2110]! } + public var Conversation_Unpin: String { return self._s[2112]! } + public var CancelResetAccount_Title: String { return self._s[2113]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2114]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2112]! } - public var CallSettings_Title: String { return self._s[2113]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2114]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2116]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2117]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2117]! } + public var CallSettings_Title: String { return self._s[2118]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2119]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2121]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2122]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2118]!, self._r[2118]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2123]!, self._r[2123]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2119]! } - public var LoginPassword_PasswordHelp: String { return self._s[2120]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2121]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2122]! } - public var Checkout_TotalPaidAmount: String { return self._s[2123]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2124]! } + public var LoginPassword_PasswordHelp: String { return self._s[2125]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2126]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2127]! } + public var Checkout_TotalPaidAmount: String { return self._s[2128]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2124]!, self._r[2124]!, [_0]) + return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2125]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2127]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2128]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2130]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2132]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2133]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_1]) + return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2130]! } - public var Contacts_InviteFriends: String { return self._s[2132]! } - public var Map_ChooseLocationTitle: String { return self._s[2133]! } - public var Conversation_StopPoll: String { return self._s[2135]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2135]! } + public var Contacts_InviteFriends: String { return self._s[2137]! } + public var Map_ChooseLocationTitle: String { return self._s[2138]! } + public var Conversation_StopPoll: String { return self._s[2140]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2136]!, self._r[2136]!, [_0]) + return formatWithArgumentRanges(self._s[2141]!, self._r[2141]!, [_0]) } - public var Call_Camera: String { return self._s[2137]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2138]! } - public var Calls_RatingFeedback: String { return self._s[2139]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2140]! } - public var NotificationsSound_Pulse: String { return self._s[2141]! } - public var Watch_LastSeen_Lately: String { return self._s[2142]! } - public var ReportGroupLocation_Report: String { return self._s[2145]! } - public var Widget_NoUsers: String { return self._s[2146]! } - public var Conversation_UnvotePoll: String { return self._s[2147]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2149]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2150]! } - public var NotificationsSound_Circles: String { return self._s[2151]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2153]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2154]! } - public var Proxy_TooltipUnavailable: String { return self._s[2155]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2157]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2159]! } - public var Conversation_FileDropbox: String { return self._s[2160]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2161]! } - public var Tour_Text3: String { return self._s[2163]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2165]! } - public var GroupPermission_NoSendMessages: String { return self._s[2166]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2167]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2168]! } + public var Call_Camera: String { return self._s[2142]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2143]! } + public var Calls_RatingFeedback: String { return self._s[2144]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2145]! } + public var NotificationsSound_Pulse: String { return self._s[2146]! } + public var Watch_LastSeen_Lately: String { return self._s[2147]! } + public var ReportGroupLocation_Report: String { return self._s[2150]! } + public var Widget_NoUsers: String { return self._s[2151]! } + public var Conversation_UnvotePoll: String { return self._s[2152]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2154]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2155]! } + public var NotificationsSound_Circles: String { return self._s[2156]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2158]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2159]! } + public var Proxy_TooltipUnavailable: String { return self._s[2160]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2162]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2164]! } + public var Conversation_FileDropbox: String { return self._s[2165]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2166]! } + public var Tour_Text3: String { return self._s[2168]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2170]! } + public var GroupPermission_NoSendMessages: String { return self._s[2171]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2172]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2173]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) - } - public var GroupInfo_AddParticipantTitle: String { return self._s[2171]! } - public var Checkout_ShippingOption_Title: String { return self._s[2172]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2173]! } - public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2174]!, self._r[2174]!, [_0]) - } - public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2175]!, self._r[2175]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2176]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2177]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2178]! } - public var AutoDownloadSettings_Photos: String { return self._s[2180]! } - public var Appearance_PreviewIncomingText: String { return self._s[2181]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2182]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2183]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2184]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2185]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2186]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2187]! } - public var Notification_SecretChatScreenshot: String { return self._s[2188]! } - public var AccessDenied_Wallpapers: String { return self._s[2189]! } - public var Passport_Address_City: String { return self._s[2191]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2192]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2193]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2194]! } - public var AccessDenied_LocationDisabled: String { return self._s[2195]! } - public var Group_Location_Title: String { return self._s[2196]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2198]! } - public var GroupInfo_Sound: String { return self._s[2199]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2200]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2201]! } - public var Contacts_Title: String { return self._s[2202]! } - public var Passport_Language_fr: String { return self._s[2203]! } - public var Notifications_ResetAllNotifications: String { return self._s[2204]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2207]! } - public var Checkout_NewCard_Title: String { return self._s[2208]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2209]! } - public var Conversation_ForwardChats: String { return self._s[2210]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2212]! } - public var Settings_FAQ: String { return self._s[2214]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2215]! } - public var Conversation_ContextMenuForward: String { return self._s[2216]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2219]! } - public var PrivacyPolicy_Title: String { return self._s[2222]! } - public var Notifications_TextTone: String { return self._s[2223]! } - public var Profile_CreateNewContact: String { return self._s[2224]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2225]! } - public var Call_Speaker: String { return self._s[2227]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2228]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2230]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2231]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2176]! } + public var Checkout_ShippingOption_Title: String { return self._s[2177]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2178]! } + public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_0]) + } + public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2180]!, self._r[2180]!, [_0]) + } + public var Channel_Management_LabelAdministrator: String { return self._s[2181]! } + public var EditTheme_FileReadError: String { return self._s[2182]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2183]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2184]! } + public var AutoDownloadSettings_Photos: String { return self._s[2186]! } + public var Appearance_PreviewIncomingText: String { return self._s[2187]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2188]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2189]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2190]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2191]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2192]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2193]! } + public var Notification_SecretChatScreenshot: String { return self._s[2194]! } + public var AccessDenied_Wallpapers: String { return self._s[2195]! } + public var Passport_Address_City: String { return self._s[2197]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2198]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2199]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2200]! } + public var AccessDenied_LocationDisabled: String { return self._s[2201]! } + public var Group_Location_Title: String { return self._s[2202]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2204]! } + public var GroupInfo_Sound: String { return self._s[2205]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2206]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2207]! } + public var Contacts_Title: String { return self._s[2208]! } + public var Passport_Language_fr: String { return self._s[2209]! } + public var Notifications_ResetAllNotifications: String { return self._s[2210]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2213]! } + public var Checkout_NewCard_Title: String { return self._s[2214]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2215]! } + public var Conversation_ForwardChats: String { return self._s[2216]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2218]! } + public var Settings_FAQ: String { return self._s[2220]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2221]! } + public var Conversation_ContextMenuForward: String { return self._s[2222]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2225]! } + public var PrivacyPolicy_Title: String { return self._s[2228]! } + public var Notifications_TextTone: String { return self._s[2229]! } + public var Profile_CreateNewContact: String { return self._s[2230]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2231]! } + public var Call_Speaker: String { return self._s[2233]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2234]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2236]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2237]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2232]!, self._r[2232]!, [_0]) + return formatWithArgumentRanges(self._s[2238]!, self._r[2238]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2233]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2234]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2235]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2236]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2237]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2238]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2239]! } - public var Bot_Unblock: String { return self._s[2240]! } - public var TextFormat_Italic: String { return self._s[2241]! } - public var WallpaperSearch_ColorPink: String { return self._s[2242]! } - public var Settings_About_Help: String { return self._s[2243]! } - public var SearchImages_Title: String { return self._s[2244]! } - public var Weekday_Wednesday: String { return self._s[2245]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2246]! } - public var ExplicitContent_AlertTitle: String { return self._s[2247]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2239]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2240]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2241]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2242]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2243]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2244]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2245]! } + public var Bot_Unblock: String { return self._s[2246]! } + public var TextFormat_Italic: String { return self._s[2247]! } + public var WallpaperSearch_ColorPink: String { return self._s[2248]! } + public var Settings_About_Help: String { return self._s[2249]! } + public var SearchImages_Title: String { return self._s[2250]! } + public var Weekday_Wednesday: String { return self._s[2251]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2252]! } + public var ExplicitContent_AlertTitle: String { return self._s[2253]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2248]!, self._r[2248]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2254]!, self._r[2254]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2249]! } - public var Weekday_Thursday: String { return self._s[2250]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2251]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2252]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2255]! } + public var Weekday_Thursday: String { return self._s[2256]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2257]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2258]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2253]!, self._r[2253]!, [_0]) + return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2254]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2255]! } - public var Passport_RequestedInformation: String { return self._s[2256]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2257]! } - public var Conversation_EncryptionProcessing: String { return self._s[2259]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2260]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2262]! } - public var Channel_Setup_Title: String { return self._s[2263]! } - public var Conversation_SearchPlaceholder: String { return self._s[2264]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2265]! } - public var Checkout_ErrorGeneric: String { return self._s[2266]! } - public var Passport_Language_hu: String { return self._s[2267]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2260]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2261]! } + public var Passport_RequestedInformation: String { return self._s[2262]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2263]! } + public var Conversation_EncryptionProcessing: String { return self._s[2265]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2266]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2268]! } + public var Channel_Setup_Title: String { return self._s[2269]! } + public var Conversation_SearchPlaceholder: String { return self._s[2270]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2271]! } + public var Checkout_ErrorGeneric: String { return self._s[2272]! } + public var Passport_Language_hu: String { return self._s[2273]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) + return formatWithArgumentRanges(self._s[2275]!, self._r[2275]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_1]) + return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2273]!, self._r[2273]!, [_0]) + return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_0]) } - public var Group_Location_Info: String { return self._s[2274]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2275]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2276]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2277]! } + public var Group_Location_Info: String { return self._s[2280]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2281]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2282]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2283]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_0]) + return formatWithArgumentRanges(self._s[2284]!, self._r[2284]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2279]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2280]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2281]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2285]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2286]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2287]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2288]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2282]!, self._r[2282]!, [_0]) + return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2283]! } - public var Message_PinnedAnimationMessage: String { return self._s[2285]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2287]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2288]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2290]! } - public var Embed_PlayingInPIP: String { return self._s[2291]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2292]! } + public var Passport_Language_cs: String { return self._s[2290]! } + public var Message_PinnedAnimationMessage: String { return self._s[2292]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2294]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2295]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2297]! } + public var Embed_PlayingInPIP: String { return self._s[2298]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2299]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2293]!, self._r[2293]!, [_0]) + return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2294]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2301]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2295]!, self._r[2295]!, [_1]) + return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2296]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2297]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2298]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2299]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2300]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2301]! } + public var Notification_PaymentSent: String { return self._s[2303]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2304]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2305]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2306]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2307]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2308]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2304]!, self._r[2304]!, [_1]) + return formatWithArgumentRanges(self._s[2311]!, self._r[2311]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2305]!, self._r[2305]!, [_1]) + return formatWithArgumentRanges(self._s[2312]!, self._r[2312]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2306]!, self._r[2306]!, [_1]) + return formatWithArgumentRanges(self._s[2313]!, self._r[2313]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2308]! } - public var PasscodeSettings_HelpTop: String { return self._s[2309]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2310]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2311]! } - public var EditTheme_ShortLink: String { return self._s[2312]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2313]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2314]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2315]! } - public var Call_Accept: String { return self._s[2317]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2318]! } - public var Month_GenMarch: String { return self._s[2320]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2321]! } - public var LoginPassword_Title: String { return self._s[2322]! } - public var Call_End: String { return self._s[2323]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2324]! } - public var VoiceOver_Chat_Contact: String { return self._s[2325]! } - public var CallSettings_Always: String { return self._s[2326]! } - public var CallFeedback_Success: String { return self._s[2327]! } - public var TwoStepAuth_SetupHint: String { return self._s[2328]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2315]! } + public var PasscodeSettings_HelpTop: String { return self._s[2316]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2317]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2318]! } + public var EditTheme_ShortLink: String { return self._s[2319]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2320]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2321]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2322]! } + public var Call_Accept: String { return self._s[2324]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2325]! } + public var Month_GenMarch: String { return self._s[2327]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2328]! } + public var LoginPassword_Title: String { return self._s[2329]! } + public var Call_End: String { return self._s[2330]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2331]! } + public var VoiceOver_Chat_Contact: String { return self._s[2332]! } + public var CallSettings_Always: String { return self._s[2333]! } + public var CallFeedback_Success: String { return self._s[2334]! } + public var TwoStepAuth_SetupHint: String { return self._s[2335]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2329]!, self._r[2329]!, [_1]) + return formatWithArgumentRanges(self._s[2336]!, self._r[2336]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2330]! } - public var Login_PhoneTitle: String { return self._s[2331]! } - public var Passport_FieldPhoneHelp: String { return self._s[2332]! } - public var Weekday_ShortSunday: String { return self._s[2333]! } - public var Passport_InfoFAQ_URL: String { return self._s[2334]! } - public var ContactInfo_Job: String { return self._s[2336]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2337]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2338]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2339]! } - public var Invite_ChannelsTooMuch: String { return self._s[2340]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2341]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2342]! } - public var CallFeedback_ReasonNoise: String { return self._s[2343]! } - public var Appearance_AppIconDefault: String { return self._s[2345]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2346]! } - public var MediaPicker_AddCaption: String { return self._s[2347]! } - public var CallSettings_TabIconDescription: String { return self._s[2348]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2337]! } + public var Login_PhoneTitle: String { return self._s[2338]! } + public var Passport_FieldPhoneHelp: String { return self._s[2339]! } + public var Weekday_ShortSunday: String { return self._s[2340]! } + public var Passport_InfoFAQ_URL: String { return self._s[2341]! } + public var ContactInfo_Job: String { return self._s[2343]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2344]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2345]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2346]! } + public var Invite_ChannelsTooMuch: String { return self._s[2347]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2348]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2349]! } + public var CallFeedback_ReasonNoise: String { return self._s[2350]! } + public var Appearance_AppIconDefault: String { return self._s[2352]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2353]! } + public var MediaPicker_AddCaption: String { return self._s[2354]! } + public var CallSettings_TabIconDescription: String { return self._s[2355]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2349]!, self._r[2349]!, [_0]) + return formatWithArgumentRanges(self._s[2356]!, self._r[2356]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2350]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2351]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2352]! } - public var DialogList_SearchSectionRecent: String { return self._s[2353]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2354]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2357]! } - public var LastSeen_WithinAWeek: String { return self._s[2358]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2359]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2361]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2362]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2357]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2358]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2359]! } + public var DialogList_SearchSectionRecent: String { return self._s[2360]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2361]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2364]! } + public var LastSeen_WithinAWeek: String { return self._s[2365]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2366]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2368]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2369]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_0]) + return formatWithArgumentRanges(self._s[2370]!, self._r[2370]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2364]! } - public var Conversation_StatusLeftGroup: String { return self._s[2365]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2366]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2368]! } - public var GroupPermission_AddSuccess: String { return self._s[2369]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2371]! } - public var Conversation_ContextMenuCopy: String { return self._s[2372]! } - public var AccessDenied_CallMicrophone: String { return self._s[2373]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2371]! } + public var Conversation_StatusLeftGroup: String { return self._s[2372]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2373]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2375]! } + public var GroupPermission_AddSuccess: String { return self._s[2376]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2378]! } + public var Conversation_ContextMenuCopy: String { return self._s[2379]! } + public var AccessDenied_CallMicrophone: String { return self._s[2380]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2374]!, self._r[2374]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2381]!, self._r[2381]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2375]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2376]! } - public var Checkout_PaymentMethod_New: String { return self._s[2377]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2378]! } - public var PhotoEditor_QualityTool: String { return self._s[2379]! } - public var Login_SendCodeViaSms: String { return self._s[2380]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2381]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2382]! } - public var Login_EmailNotConfiguredError: String { return self._s[2383]! } - public var SocksProxySetup_Status: String { return self._s[2384]! } - public var PrivacyPolicy_Accept: String { return self._s[2385]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2386]! } - public var Appearance_AppIconClassicX: String { return self._s[2387]! } + public var Login_InvalidFirstNameError: String { return self._s[2382]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2383]! } + public var Checkout_PaymentMethod_New: String { return self._s[2384]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2385]! } + public var PhotoEditor_QualityTool: String { return self._s[2386]! } + public var Login_SendCodeViaSms: String { return self._s[2387]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2388]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2389]! } + public var Login_EmailNotConfiguredError: String { return self._s[2390]! } + public var SocksProxySetup_Status: String { return self._s[2391]! } + public var PrivacyPolicy_Accept: String { return self._s[2392]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2393]! } + public var Appearance_AppIconClassicX: String { return self._s[2394]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2388]!, self._r[2388]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2395]!, self._r[2395]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2389]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2390]! } - public var AutoNightTheme_Automatic: String { return self._s[2391]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2392]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2393]! } - public var Cache_Help: String { return self._s[2394]! } - public var Group_ErrorAccessDenied: String { return self._s[2395]! } - public var Passport_Language_fa: String { return self._s[2396]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2397]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2398]! } - public var PrivacySettings_LastSeen: String { return self._s[2399]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2396]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2397]! } + public var AutoNightTheme_Automatic: String { return self._s[2398]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2399]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2400]! } + public var Cache_Help: String { return self._s[2401]! } + public var Group_ErrorAccessDenied: String { return self._s[2402]! } + public var Passport_Language_fa: String { return self._s[2403]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2404]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2405]! } + public var PrivacySettings_LastSeen: String { return self._s[2406]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2400]!, self._r[2400]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2407]!, self._r[2407]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2404]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2405]! } - public var Profile_About: String { return self._s[2406]! } - public var Channel_About_Placeholder: String { return self._s[2407]! } - public var Login_InfoTitle: String { return self._s[2408]! } + public var Preview_SaveGif: String { return self._s[2411]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2412]! } + public var Profile_About: String { return self._s[2413]! } + public var Channel_About_Placeholder: String { return self._s[2414]! } + public var Login_InfoTitle: String { return self._s[2415]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2409]!, self._r[2409]!, [_0]) + return formatWithArgumentRanges(self._s[2416]!, self._r[2416]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2411]! } - public var ContactInfo_Title: String { return self._s[2412]! } - public var Media_ShareThisVideo: String { return self._s[2413]! } - public var Weekday_ShortFriday: String { return self._s[2414]! } - public var AccessDenied_Contacts: String { return self._s[2416]! } - public var Notification_CallIncomingShort: String { return self._s[2417]! } - public var Group_Setup_TypePublic: String { return self._s[2418]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2419]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2420]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2423]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2424]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2425]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2426]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2427]! } - public var DialogList_Typing: String { return self._s[2428]! } - public var CallFeedback_IncludeLogs: String { return self._s[2430]! } - public var Checkout_Phone: String { return self._s[2432]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2435]! } - public var Privacy_Calls_Integration: String { return self._s[2436]! } - public var Notifications_PermissionsAllow: String { return self._s[2437]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2441]! } - public var Settings_ChatSettings: String { return self._s[2442]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2418]! } + public var ContactInfo_Title: String { return self._s[2419]! } + public var Media_ShareThisVideo: String { return self._s[2420]! } + public var Weekday_ShortFriday: String { return self._s[2421]! } + public var AccessDenied_Contacts: String { return self._s[2423]! } + public var Notification_CallIncomingShort: String { return self._s[2424]! } + public var Group_Setup_TypePublic: String { return self._s[2425]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2426]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2427]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2430]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2431]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2432]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2433]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2434]! } + public var DialogList_Typing: String { return self._s[2435]! } + public var CallFeedback_IncludeLogs: String { return self._s[2437]! } + public var Checkout_Phone: String { return self._s[2439]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2442]! } + public var Privacy_Calls_Integration: String { return self._s[2443]! } + public var Notifications_PermissionsAllow: String { return self._s[2444]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2448]! } + public var Settings_ChatSettings: String { return self._s[2449]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2445]! } + public var GroupRemoved_DeleteUser: String { return self._s[2452]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2446]!, self._r[2446]!, [_0]) + return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2447]!, self._r[2447]!, [_1]) + return formatWithArgumentRanges(self._s[2454]!, self._r[2454]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2448]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2449]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2451]! } - public var Conversation_Unblock: String { return self._s[2452]! } - public var PrivacySettings_DataSettings: String { return self._s[2453]! } - public var Group_PublicLink_Info: String { return self._s[2454]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2455]! } + public var Login_ContinueWithLocalization: String { return self._s[2455]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2456]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2458]! } + public var Conversation_Unblock: String { return self._s[2459]! } + public var PrivacySettings_DataSettings: String { return self._s[2460]! } + public var Group_PublicLink_Info: String { return self._s[2461]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2462]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2456]!, self._r[2456]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2459]! } - public var Call_Mute: String { return self._s[2460]! } - public var Passport_Language_dz: String { return self._s[2461]! } - public var Passport_Language_tk: String { return self._s[2462]! } + public var PrivacySettings_Passcode: String { return self._s[2466]! } + public var Call_Mute: String { return self._s[2467]! } + public var Passport_Language_dz: String { return self._s[2468]! } + public var Passport_Language_tk: String { return self._s[2469]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) + return formatWithArgumentRanges(self._s[2470]!, self._r[2470]!, [_0]) } - public var Settings_Search: String { return self._s[2464]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2465]! } - public var Conversation_ContextMenuReply: String { return self._s[2466]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2467]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2468]! } - public var Tour_Title1: String { return self._s[2469]! } - public var Conversation_ClearGroupHistory: String { return self._s[2471]! } - public var WallpaperPreview_Motion: String { return self._s[2472]! } + public var Settings_Search: String { return self._s[2471]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2472]! } + public var Conversation_ContextMenuReply: String { return self._s[2473]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2474]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2475]! } + public var Tour_Title1: String { return self._s[2476]! } + public var Conversation_ClearGroupHistory: String { return self._s[2478]! } + public var WallpaperPreview_Motion: String { return self._s[2479]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_0]) + return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, [_0]) } - public var Call_RateCall: String { return self._s[2474]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2475]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2476]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2477]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2479]! } + public var Call_RateCall: String { return self._s[2481]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2482]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2483]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2484]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2486]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2481]!, self._r[2481]!, [_0]) + return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) } - public var Compose_Create: String { return self._s[2482]! } - public var Contacts_InviteToTelegram: String { return self._s[2483]! } - public var GroupInfo_Notifications: String { return self._s[2484]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2486]! } - public var Month_GenApril: String { return self._s[2487]! } - public var Appearance_AutoNightTheme: String { return self._s[2488]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2490]! } - public var Login_CodeSentSms: String { return self._s[2492]! } + public var Compose_Create: String { return self._s[2489]! } + public var Contacts_InviteToTelegram: String { return self._s[2490]! } + public var GroupInfo_Notifications: String { return self._s[2491]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2493]! } + public var Month_GenApril: String { return self._s[2494]! } + public var Appearance_AutoNightTheme: String { return self._s[2495]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2497]! } + public var Login_CodeSentSms: String { return self._s[2499]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2493]!, self._r[2493]!, [_0]) + return formatWithArgumentRanges(self._s[2500]!, self._r[2500]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2494]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2495]! } - public var Passport_Language_hr: String { return self._s[2496]! } - public var Common_ActionNotAllowedError: String { return self._s[2497]! } + public var EmptyGroupInfo_Line3: String { return self._s[2501]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2502]! } + public var Passport_Language_hr: String { return self._s[2503]! } + public var Common_ActionNotAllowedError: String { return self._s[2504]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2498]!, self._r[2498]!, [_0]) + return formatWithArgumentRanges(self._s[2505]!, self._r[2505]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2499]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2500]! } - public var Privacy_SecretChatsTitle: String { return self._s[2501]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2503]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2504]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2505]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2506]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2507]! } - public var Preview_DeleteGif: String { return self._s[2508]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2509]! } - public var Group_ErrorNotMutualContact: String { return self._s[2510]! } - public var Notification_MessageLifetime5s: String { return self._s[2511]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2506]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2507]! } + public var Privacy_SecretChatsTitle: String { return self._s[2508]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2510]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2511]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2512]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2513]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2514]! } + public var Preview_DeleteGif: String { return self._s[2515]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2516]! } + public var Group_ErrorNotMutualContact: String { return self._s[2517]! } + public var Notification_MessageLifetime5s: String { return self._s[2518]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2512]!, self._r[2512]!, [_0]) + return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2513]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2515]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2516]! } - public var Passport_Address_AddBankStatement: String { return self._s[2517]! } - public var Notification_CallIncoming: String { return self._s[2518]! } - public var Compose_NewGroupTitle: String { return self._s[2519]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2521]! } - public var Passport_Address_Postcode: String { return self._s[2523]! } + public var VoiceOver_Chat_Video: String { return self._s[2520]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2522]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2523]! } + public var Passport_Address_AddBankStatement: String { return self._s[2524]! } + public var Notification_CallIncoming: String { return self._s[2525]! } + public var Compose_NewGroupTitle: String { return self._s[2526]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2528]! } + public var Passport_Address_Postcode: String { return self._s[2530]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_0]) - } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2525]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2526]! } - public var WallpaperColors_Title: String { return self._s[2527]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2528]! } - public var VoiceOver_MessageContextForward: String { return self._s[2529]! } - public var GroupPermission_Duration: String { return self._s[2530]! } - public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2531]!, self._r[2531]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2532]! } - public var Username_Placeholder: String { return self._s[2533]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2534]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2535]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2536]! } - public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_1, _2]) + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2532]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2533]! } + public var WallpaperColors_Title: String { return self._s[2534]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2535]! } + public var VoiceOver_MessageContextForward: String { return self._s[2536]! } + public var GroupPermission_Duration: String { return self._s[2537]! } + public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_0]) } - public var Passport_PasswordDescription: String { return self._s[2539]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2540]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2541]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2542]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2543]! } - public var Conversation_ContextMenuMore: String { return self._s[2544]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2545]! } - public var CallSettings_TabIcon: String { return self._s[2546]! } - public var KeyCommand_Find: String { return self._s[2547]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2548]! } - public var Message_PinnedGame: String { return self._s[2549]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2550]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2552]! } - public var Login_CallRequestState2: String { return self._s[2554]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2556]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2539]! } + public var Username_Placeholder: String { return self._s[2540]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2541]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2542]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2543]! } + public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2545]!, self._r[2545]!, [_1, _2]) + } + public var Passport_PasswordDescription: String { return self._s[2546]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2547]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2548]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2549]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2550]! } + public var Conversation_ContextMenuMore: String { return self._s[2551]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2552]! } + public var CallSettings_TabIcon: String { return self._s[2553]! } + public var KeyCommand_Find: String { return self._s[2554]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2555]! } + public var Message_PinnedGame: String { return self._s[2556]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2557]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2559]! } + public var Login_CallRequestState2: String { return self._s[2561]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2563]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_0]) + return formatWithArgumentRanges(self._s[2564]!, self._r[2564]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2559]!, self._r[2559]!, [_0]) + return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2560]! } - public var Conversation_InstantPagePreview: String { return self._s[2561]! } + public var WallpaperPreview_Blurred: String { return self._s[2567]! } + public var Conversation_InstantPagePreview: String { return self._s[2568]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2562]!, self._r[2562]!, [_0]) + return formatWithArgumentRanges(self._s[2569]!, self._r[2569]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2565]! } - public var WallpaperSearch_ColorRed: String { return self._s[2566]! } - public var GroupPermission_NoPinMessages: String { return self._s[2567]! } - public var Passport_Language_es: String { return self._s[2568]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2570]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2571]! } + public var SecretTimer_VideoDescription: String { return self._s[2572]! } + public var WallpaperSearch_ColorRed: String { return self._s[2573]! } + public var GroupPermission_NoPinMessages: String { return self._s[2574]! } + public var Passport_Language_es: String { return self._s[2575]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2577]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2578]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2572]!, self._r[2572]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2579]!, self._r[2579]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2573]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2574]! } - public var Watch_UserInfo_Unmute: String { return self._s[2575]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2576]! } - public var AccessDenied_CameraRestricted: String { return self._s[2578]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2580]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2581]! } + public var Watch_UserInfo_Unmute: String { return self._s[2582]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2583]! } + public var AccessDenied_CameraRestricted: String { return self._s[2585]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2579]!, self._r[2579]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2586]!, self._r[2586]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2581]! } - public var Settings_CopyUsername: String { return self._s[2582]! } - public var Contacts_SearchLabel: String { return self._s[2583]! } - public var Map_OpenInYandexNavigator: String { return self._s[2585]! } - public var PasscodeSettings_EncryptData: String { return self._s[2586]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2587]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2588]! } - public var DialogList_AdNoticeAlert: String { return self._s[2589]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2591]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2592]! } - public var Localization_LanguageCustom: String { return self._s[2593]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2594]! } - public var CallFeedback_Title: String { return self._s[2595]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2598]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2599]! } - public var Conversation_InfoGroup: String { return self._s[2600]! } - public var Compose_NewMessage: String { return self._s[2601]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2602]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2603]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2604]! } + public var ChatList_ReadAll: String { return self._s[2588]! } + public var Settings_CopyUsername: String { return self._s[2589]! } + public var Contacts_SearchLabel: String { return self._s[2590]! } + public var Map_OpenInYandexNavigator: String { return self._s[2592]! } + public var PasscodeSettings_EncryptData: String { return self._s[2593]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2594]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2595]! } + public var DialogList_AdNoticeAlert: String { return self._s[2596]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2598]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2599]! } + public var Localization_LanguageCustom: String { return self._s[2600]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2601]! } + public var CallFeedback_Title: String { return self._s[2602]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2605]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2606]! } + public var Conversation_InfoGroup: String { return self._s[2607]! } + public var Compose_NewMessage: String { return self._s[2608]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2609]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2610]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2611]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2605]!, self._r[2605]!, [_0]) + return formatWithArgumentRanges(self._s[2612]!, self._r[2612]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2606]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2607]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2608]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2609]! } - public var Channel_BlackList_Title: String { return self._s[2610]! } - public var UserInfo_PhoneCall: String { return self._s[2611]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2613]! } - public var State_connecting: String { return self._s[2614]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2615]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2616]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2613]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2614]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2615]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2616]! } + public var Channel_BlackList_Title: String { return self._s[2617]! } + public var UserInfo_PhoneCall: String { return self._s[2618]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2620]! } + public var State_connecting: String { return self._s[2621]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2622]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2623]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2617]!, self._r[2617]!, [_0]) + return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2618]! } - public var Passport_Identity_EditPassport: String { return self._s[2619]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2621]! } - public var Localization_EnglishLanguageName: String { return self._s[2622]! } - public var Share_AuthDescription: String { return self._s[2623]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2624]! } - public var Passport_Identity_Surname: String { return self._s[2625]! } - public var Compose_TokenListPlaceholder: String { return self._s[2626]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2627]! } - public var Settings_AboutEmpty: String { return self._s[2628]! } - public var Conversation_Unmute: String { return self._s[2629]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2631]! } + public var Notifications_GroupNotifications: String { return self._s[2625]! } + public var Passport_Identity_EditPassport: String { return self._s[2626]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2628]! } + public var Localization_EnglishLanguageName: String { return self._s[2629]! } + public var Share_AuthDescription: String { return self._s[2630]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2631]! } + public var Passport_Identity_Surname: String { return self._s[2632]! } + public var Compose_TokenListPlaceholder: String { return self._s[2633]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2634]! } + public var Settings_AboutEmpty: String { return self._s[2635]! } + public var Conversation_Unmute: String { return self._s[2636]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2638]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1]) - } - public var Login_CodeSentCall: String { return self._s[2633]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2635]! } - public var ChatSettings_Appearance: String { return self._s[2636]! } - public var Appearance_PickAccentColor: String { return self._s[2637]! } - public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2638]!, self._r[2638]!, [_1, _2]) - } - public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2640]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2641]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2642]! } - public var ChatAdmins_AdminLabel: String { return self._s[2644]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2645]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2647]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2648]! } - public var Month_GenJune: String { return self._s[2649]! } - public var Watch_Location_Current: String { return self._s[2650]! } - public var Conversation_TitleMute: String { return self._s[2651]! } + public var Login_CodeSentCall: String { return self._s[2640]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2642]! } + public var ChatSettings_Appearance: String { return self._s[2643]! } + public var Appearance_PickAccentColor: String { return self._s[2644]! } + public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_1, _2]) + } + public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2646]!, self._r[2646]!, [_1]) + } + public var Notification_CallMissed: String { return self._s[2647]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2648]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2649]! } + public var ChatAdmins_AdminLabel: String { return self._s[2651]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2652]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2654]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2655]! } + public var Month_GenJune: String { return self._s[2656]! } + public var Watch_Location_Current: String { return self._s[2657]! } + public var Conversation_TitleMute: String { return self._s[2658]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2652]!, self._r[2652]!, [_1]) + return formatWithArgumentRanges(self._s[2659]!, self._r[2659]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2653]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2660]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2654]!, self._r[2654]!, [_0]) + return formatWithArgumentRanges(self._s[2661]!, self._r[2661]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2655]! } - public var Chat_SlowmodeSendError: String { return self._s[2656]! } - public var MaskStickerSettings_Info: String { return self._s[2657]! } + public var Call_ReportPlaceholder: String { return self._s[2662]! } + public var Chat_SlowmodeSendError: String { return self._s[2663]! } + public var MaskStickerSettings_Info: String { return self._s[2664]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2658]!, self._r[2658]!, [_0]) + return formatWithArgumentRanges(self._s[2665]!, self._r[2665]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2659]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2661]! } - public var Contacts_ShareTelegram: String { return self._s[2662]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2663]! } - public var Channel_ErrorAccessDenied: String { return self._s[2664]! } - public var UserInfo_ScamBotWarning: String { return self._s[2666]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2667]! } - public var Call_ConnectionErrorTitle: String { return self._s[2668]! } - public var UserInfo_NotificationsEnable: String { return self._s[2669]! } - public var ArchivedChats_IntroText1: String { return self._s[2670]! } - public var Tour_Text4: String { return self._s[2673]! } - public var WallpaperSearch_Recent: String { return self._s[2674]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2675]! } - public var Profile_MessageLifetime2s: String { return self._s[2677]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2678]! } - public var Notification_MessageLifetime2s: String { return self._s[2679]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2666]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2668]! } + public var Contacts_ShareTelegram: String { return self._s[2669]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2670]! } + public var Channel_ErrorAccessDenied: String { return self._s[2671]! } + public var UserInfo_ScamBotWarning: String { return self._s[2673]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2674]! } + public var Call_ConnectionErrorTitle: String { return self._s[2675]! } + public var UserInfo_NotificationsEnable: String { return self._s[2676]! } + public var ArchivedChats_IntroText1: String { return self._s[2677]! } + public var Tour_Text4: String { return self._s[2680]! } + public var WallpaperSearch_Recent: String { return self._s[2681]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2682]! } + public var Profile_MessageLifetime2s: String { return self._s[2684]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2685]! } + public var Notification_MessageLifetime2s: String { return self._s[2686]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2681]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2682]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2683]! } + public var Cache_ClearCache: String { return self._s[2688]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2689]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2690]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_0]) + return formatWithArgumentRanges(self._s[2694]!, self._r[2694]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_0]) + return formatWithArgumentRanges(self._s[2696]!, self._r[2696]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2690]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2691]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2692]! } - public var ChatList_UnarchiveAction: String { return self._s[2693]! } - public var AutoNightTheme_Title: String { return self._s[2694]! } - public var InstantPage_FeedbackButton: String { return self._s[2695]! } - public var Passport_FieldAddress: String { return self._s[2696]! } + public var LocalGroup_Text: String { return self._s[2697]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2698]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2699]! } + public var ChatList_UnarchiveAction: String { return self._s[2700]! } + public var AutoNightTheme_Title: String { return self._s[2701]! } + public var InstantPage_FeedbackButton: String { return self._s[2702]! } + public var Passport_FieldAddress: String { return self._s[2703]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2697]!, self._r[2697]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2704]!, self._r[2704]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2698]! } + public var Month_ShortMarch: String { return self._s[2705]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2699]!, self._r[2699]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2706]!, self._r[2706]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2700]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2701]! } - public var Passport_FloodError: String { return self._s[2702]! } - public var SecretGif_Title: String { return self._s[2703]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2704]! } - public var Passport_Language_th: String { return self._s[2706]! } - public var Passport_Address_Address: String { return self._s[2707]! } - public var Login_InvalidLastNameError: String { return self._s[2708]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2709]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2710]! } - public var SettingsSearch_FAQ: String { return self._s[2711]! } - public var ShareMenu_Send: String { return self._s[2712]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2714]! } - public var Month_GenNovember: String { return self._s[2716]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2718]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2707]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2708]! } + public var Passport_FloodError: String { return self._s[2709]! } + public var SecretGif_Title: String { return self._s[2710]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2711]! } + public var Passport_Language_th: String { return self._s[2713]! } + public var Passport_Address_Address: String { return self._s[2714]! } + public var Login_InvalidLastNameError: String { return self._s[2715]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2716]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2717]! } + public var SettingsSearch_FAQ: String { return self._s[2718]! } + public var ShareMenu_Send: String { return self._s[2719]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2721]! } + public var Month_GenNovember: String { return self._s[2723]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2725]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2726]!, self._r[2726]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2720]! } - public var NotificationsSound_Tritone: String { return self._s[2721]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2723]! } + public var Checkout_Email: String { return self._s[2727]! } + public var NotificationsSound_Tritone: String { return self._s[2728]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2730]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2726]!, self._r[2726]!, [_1]) + return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2727]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2734]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2735]!, self._r[2735]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2729]! } - public var Notification_Exceptions_Add: String { return self._s[2730]! } - public var DialogList_You: String { return self._s[2731]! } - public var MediaPicker_Send: String { return self._s[2734]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2735]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2736]! } - public var Call_AudioRouteSpeaker: String { return self._s[2737]! } - public var Appearance_CreateThemeInfo: String { return self._s[2738]! } - public var Watch_UserInfo_Title: String { return self._s[2739]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2740]! } - public var Appearance_AccentColor: String { return self._s[2741]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2736]! } + public var Notification_Exceptions_Add: String { return self._s[2737]! } + public var DialogList_You: String { return self._s[2738]! } + public var MediaPicker_Send: String { return self._s[2741]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2742]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2743]! } + public var Call_AudioRouteSpeaker: String { return self._s[2744]! } + public var Watch_UserInfo_Title: String { return self._s[2745]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2746]! } + public var Appearance_AccentColor: String { return self._s[2747]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2742]!, self._r[2742]!, [_0]) + return formatWithArgumentRanges(self._s[2748]!, self._r[2748]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2743]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2749]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2744]!, self._r[2744]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2750]!, self._r[2750]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2745]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2746]! } - public var Notification_CallOutgoing: String { return self._s[2747]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2748]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2749]! } - public var Call_RecordingDisabledMessage: String { return self._s[2750]! } - public var Message_Game: String { return self._s[2751]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2752]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2753]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2754]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2755]! } - public var Date_DialogDateFormat: String { return self._s[2756]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2757]! } - public var Notifications_InAppNotifications: String { return self._s[2758]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2751]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2752]! } + public var Notification_CallOutgoing: String { return self._s[2753]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2754]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2755]! } + public var Call_RecordingDisabledMessage: String { return self._s[2756]! } + public var Message_Game: String { return self._s[2757]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2758]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2759]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2760]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2761]! } + public var Date_DialogDateFormat: String { return self._s[2762]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2763]! } + public var Notifications_InAppNotifications: String { return self._s[2764]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_0]) + return formatWithArgumentRanges(self._s[2765]!, self._r[2765]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2760]!, self._r[2760]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2766]!, self._r[2766]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2761]! } + public var NewContact_Title: String { return self._s[2767]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2762]!, self._r[2762]!, [_0]) + return formatWithArgumentRanges(self._s[2768]!, self._r[2768]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2763]! } + public var Conversation_ViewContactDetails: String { return self._s[2769]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2765]!, self._r[2765]!, [_1]) + return formatWithArgumentRanges(self._s[2771]!, self._r[2771]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2766]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2767]! } - public var PrivacySettings_Title: String { return self._s[2768]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2771]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2772]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2773]! } - public var Contacts_PhoneNumber: String { return self._s[2774]! } - public var Map_ShowPlaces: String { return self._s[2776]! } - public var ChatAdmins_Title: String { return self._s[2777]! } - public var InstantPage_Reference: String { return self._s[2779]! } - public var ReportGroupLocation_Text: String { return self._s[2780]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2772]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2773]! } + public var PrivacySettings_Title: String { return self._s[2774]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2777]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2778]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2779]! } + public var Contacts_PhoneNumber: String { return self._s[2780]! } + public var Map_ShowPlaces: String { return self._s[2782]! } + public var ChatAdmins_Title: String { return self._s[2783]! } + public var InstantPage_Reference: String { return self._s[2785]! } + public var ReportGroupLocation_Text: String { return self._s[2786]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2782]! } - public var Watch_UserInfo_Block: String { return self._s[2783]! } - public var ChatSettings_Stickers: String { return self._s[2784]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2785]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2786]! } + public var Camera_FlashOff: String { return self._s[2788]! } + public var Watch_UserInfo_Block: String { return self._s[2789]! } + public var ChatSettings_Stickers: String { return self._s[2790]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2791]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2792]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_0]) + return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2788]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2789]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2790]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2791]! } - public var VoiceOver_MessageContextShare: String { return self._s[2792]! } + public var Settings_ViewPhoto: String { return self._s[2794]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2795]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2796]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2797]! } + public var VoiceOver_MessageContextShare: String { return self._s[2798]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) + return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2795]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2796]! } + public var Privacy_DeleteDrafts: String { return self._s[2801]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2802]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2797]!, self._r[2797]!, [_0]) + return formatWithArgumentRanges(self._s[2803]!, self._r[2803]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2798]! } - public var DialogList_SavedMessages: String { return self._s[2799]! } - public var GroupInfo_UpgradeButton: String { return self._s[2800]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2802]! } - public var DialogList_Pin: String { return self._s[2803]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2804]! } + public var DialogList_SavedMessages: String { return self._s[2805]! } + public var GroupInfo_UpgradeButton: String { return self._s[2806]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2808]! } + public var DialogList_Pin: String { return self._s[2809]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2804]!, self._r[2804]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2805]!, self._r[2805]!, [_0]) + return formatWithArgumentRanges(self._s[2811]!, self._r[2811]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2806]! } - public var UserInfo_NotificationsDisable: String { return self._s[2807]! } - public var Paint_Outlined: String { return self._s[2808]! } - public var Activity_PlayingGame: String { return self._s[2809]! } - public var SearchImages_NoImagesFound: String { return self._s[2810]! } - public var SocksProxySetup_ProxyType: String { return self._s[2811]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2813]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2814]! } - public var Settings_AppLanguage: String { return self._s[2815]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2816]! } - public var Common_ChoosePhoto: String { return self._s[2817]! } - public var CallFeedback_ReasonEcho: String { return self._s[2818]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2812]! } + public var UserInfo_NotificationsDisable: String { return self._s[2813]! } + public var Paint_Outlined: String { return self._s[2814]! } + public var Activity_PlayingGame: String { return self._s[2815]! } + public var SearchImages_NoImagesFound: String { return self._s[2816]! } + public var SocksProxySetup_ProxyType: String { return self._s[2817]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2819]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2820]! } + public var Settings_AppLanguage: String { return self._s[2821]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2822]! } + public var Common_ChoosePhoto: String { return self._s[2823]! } + public var CallFeedback_ReasonEcho: String { return self._s[2824]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2819]!, self._r[2819]!, [_1]) + return formatWithArgumentRanges(self._s[2825]!, self._r[2825]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2820]! } - public var Activity_UploadingVideo: String { return self._s[2821]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2822]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2823]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2824]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2825]! } - public var Checkout_PayWithTouchId: String { return self._s[2826]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2827]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2826]! } + public var Activity_UploadingVideo: String { return self._s[2827]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2828]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2829]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2830]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2831]! } + public var Checkout_PayWithTouchId: String { return self._s[2832]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2833]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2829]!, self._r[2829]!, [_1]) + return formatWithArgumentRanges(self._s[2835]!, self._r[2835]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2830]! } + public var Notifications_ExceptionsNone: String { return self._s[2836]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2831]!, self._r[2831]!, [_0]) + return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2832]!, self._r[2832]!, [_1]) + return formatWithArgumentRanges(self._s[2838]!, self._r[2838]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2834]! } - public var Passport_Address_Region: String { return self._s[2837]! } - public var ChatList_DeleteChat: String { return self._s[2838]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2839]! } - public var PhotoEditor_TiltShift: String { return self._s[2840]! } - public var Settings_FAQ_URL: String { return self._s[2841]! } - public var Passport_Language_sl: String { return self._s[2842]! } - public var Settings_PrivacySettings: String { return self._s[2844]! } - public var SharedMedia_TitleLink: String { return self._s[2845]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2846]! } - public var Settings_SetProfilePhoto: String { return self._s[2847]! } - public var Channel_About_Help: String { return self._s[2848]! } - public var Contacts_PermissionsEnable: String { return self._s[2849]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2850]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2851]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2853]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2854]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2855]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2856]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2857]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2859]! } - public var Map_OpenInYandexMaps: String { return self._s[2861]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2862]! } - public var VoiceOver_MessageContextReply: String { return self._s[2863]! } - public var PhotoEditor_SaturationTool: String { return self._s[2864]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2840]! } + public var Passport_Address_Region: String { return self._s[2843]! } + public var ChatList_DeleteChat: String { return self._s[2844]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2845]! } + public var PhotoEditor_TiltShift: String { return self._s[2846]! } + public var Settings_FAQ_URL: String { return self._s[2847]! } + public var Passport_Language_sl: String { return self._s[2848]! } + public var Settings_PrivacySettings: String { return self._s[2850]! } + public var SharedMedia_TitleLink: String { return self._s[2851]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2852]! } + public var Settings_SetProfilePhoto: String { return self._s[2853]! } + public var Channel_About_Help: String { return self._s[2854]! } + public var Contacts_PermissionsEnable: String { return self._s[2855]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2856]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2857]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2859]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2860]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2861]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2862]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2863]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2865]! } + public var Map_OpenInYandexMaps: String { return self._s[2867]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2868]! } + public var VoiceOver_MessageContextReply: String { return self._s[2869]! } + public var PhotoEditor_SaturationTool: String { return self._s[2870]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2871]!, self._r[2871]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2866]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2867]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2868]! } - public var Appearance_TextSize: String { return self._s[2869]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2872]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2873]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2874]! } + public var Appearance_TextSize: String { return self._s[2875]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2870]!, self._r[2870]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2871]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2873]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2877]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2879]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2874]!, self._r[2874]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2875]!, self._r[2875]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2876]! } - public var Passport_PassportInformation: String { return self._s[2879]! } - public var Theme_Unsupported: String { return self._s[2880]! } - public var WatchRemote_AlertTitle: String { return self._s[2881]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2882]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2884]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2882]! } + public var Passport_PassportInformation: String { return self._s[2885]! } + public var Theme_Unsupported: String { return self._s[2886]! } + public var WatchRemote_AlertTitle: String { return self._s[2887]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2888]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2890]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_0]) - } - public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2886]!, self._r[2886]!, [_1]) - } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2887]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2889]! } - public var AccessDenied_CameraDisabled: String { return self._s[2890]! } - public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2894]! } + public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2892]!, self._r[2892]!, [_1]) + } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2893]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2895]! } + public var AccessDenied_CameraDisabled: String { return self._s[2896]! } + public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_0]) + } + public var PhotoEditor_ContrastTool: String { return self._s[2900]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2895]!, self._r[2895]!, [_1]) + return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_1]) } - public var DialogList_Draft: String { return self._s[2896]! } - public var Privacy_TopPeersDelete: String { return self._s[2898]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2899]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2900]! } - public var WebSearch_RecentSectionClear: String { return self._s[2901]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2903]! } - public var Common_Done: String { return self._s[2905]! } - public var AuthSessions_EmptyText: String { return self._s[2906]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2907]! } - public var Tour_Title5: String { return self._s[2908]! } + public var DialogList_Draft: String { return self._s[2902]! } + public var Privacy_TopPeersDelete: String { return self._s[2904]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2905]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2906]! } + public var WebSearch_RecentSectionClear: String { return self._s[2907]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2909]! } + public var Common_Done: String { return self._s[2911]! } + public var AuthSessions_EmptyText: String { return self._s[2912]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2913]! } + public var Tour_Title5: String { return self._s[2914]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2909]!, self._r[2909]!, [_0]) + return formatWithArgumentRanges(self._s[2915]!, self._r[2915]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2910]! } - public var Conversation_LinkDialogSave: String { return self._s[2911]! } - public var GroupInfo_ActionRestrict: String { return self._s[2912]! } - public var Checkout_Title: String { return self._s[2913]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2915]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2917]! } - public var Notification_RenamedGroup: String { return self._s[2918]! } - public var PeopleNearby_Groups: String { return self._s[2919]! } - public var Checkout_PayWithFaceId: String { return self._s[2920]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2921]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2923]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2924]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2925]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2916]! } + public var Conversation_LinkDialogSave: String { return self._s[2917]! } + public var GroupInfo_ActionRestrict: String { return self._s[2918]! } + public var Checkout_Title: String { return self._s[2919]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2921]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2923]! } + public var Notification_RenamedGroup: String { return self._s[2924]! } + public var PeopleNearby_Groups: String { return self._s[2925]! } + public var Checkout_PayWithFaceId: String { return self._s[2926]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2927]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2929]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2930]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2931]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2926]!, self._r[2926]!, [_0]) + return formatWithArgumentRanges(self._s[2932]!, self._r[2932]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2928]! } + public var Profile_AddToExisting: String { return self._s[2934]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2929]!, self._r[2929]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2935]!, self._r[2935]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2931]! } - public var Permissions_PrivacyPolicy: String { return self._s[2932]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2933]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2934]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2936]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2938]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2939]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2940]! } - public var VoiceOver_AttachMedia: String { return self._s[2942]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2943]! } + public var Cache_Files: String { return self._s[2937]! } + public var Permissions_PrivacyPolicy: String { return self._s[2938]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2939]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2940]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2942]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2944]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2945]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2946]! } + public var VoiceOver_AttachMedia: String { return self._s[2948]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2949]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2944]!, self._r[2944]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2950]!, self._r[2950]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2945]! } - public var Conversation_SetReminder_Title: String { return self._s[2946]! } - public var Passport_FieldAddressHelp: String { return self._s[2947]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2948]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2951]! } + public var Conversation_SetReminder_Title: String { return self._s[2952]! } + public var Passport_FieldAddressHelp: String { return self._s[2953]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2954]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2949]!, self._r[2949]!, [_0]) + return formatWithArgumentRanges(self._s[2955]!, self._r[2955]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2950]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2952]! } - public var Login_UnknownError: String { return self._s[2953]! } - public var Group_UpgradeNoticeText2: String { return self._s[2955]! } - public var Watch_Compose_AddContact: String { return self._s[2956]! } - public var Web_Error: String { return self._s[2957]! } - public var Gif_Search: String { return self._s[2958]! } - public var Profile_MessageLifetime1h: String { return self._s[2959]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2960]! } - public var Channel_Username_CheckingUsername: String { return self._s[2961]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2962]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2963]! } - public var Channel_AboutItem: String { return self._s[2964]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2966]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2967]! } - public var GroupInfo_SharedMedia: String { return self._s[2968]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2956]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2958]! } + public var Login_UnknownError: String { return self._s[2959]! } + public var Group_UpgradeNoticeText2: String { return self._s[2961]! } + public var Watch_Compose_AddContact: String { return self._s[2962]! } + public var Web_Error: String { return self._s[2963]! } + public var Gif_Search: String { return self._s[2964]! } + public var Profile_MessageLifetime1h: String { return self._s[2965]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2966]! } + public var Channel_Username_CheckingUsername: String { return self._s[2967]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2968]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2969]! } + public var Channel_AboutItem: String { return self._s[2970]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2972]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2973]! } + public var GroupInfo_SharedMedia: String { return self._s[2974]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2969]!, self._r[2969]!, [_1]) + return formatWithArgumentRanges(self._s[2975]!, self._r[2975]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2970]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2976]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2971]!, self._r[2971]!, [_1]) + return formatWithArgumentRanges(self._s[2977]!, self._r[2977]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2972]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2973]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2974]! } - public var CreatePoll_AddOption: String { return self._s[2975]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2976]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2977]! } - public var Channel_Management_AddModerator: String { return self._s[2978]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2979]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2980]! } - public var NotificationsSound_Hello: String { return self._s[2981]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2982]! } - public var Channel_Stickers_Placeholder: String { return self._s[2984]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2978]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2979]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2980]! } + public var CreatePoll_AddOption: String { return self._s[2981]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2982]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2983]! } + public var Channel_Management_AddModerator: String { return self._s[2984]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2985]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2986]! } + public var NotificationsSound_Hello: String { return self._s[2987]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2988]! } + public var Channel_Stickers_Placeholder: String { return self._s[2990]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2985]!, self._r[2985]!, [_0]) + return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2986]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2987]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2988]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2989]! } - public var AutoDownloadSettings_Channels: String { return self._s[2990]! } - public var Passport_Language_mn: String { return self._s[2991]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2994]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[2995]! } - public var Passport_Language_ja: String { return self._s[2997]! } - public var Settings_About_Title: String { return self._s[2998]! } - public var Settings_NotificationsAndSounds: String { return self._s[2999]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3000]! } - public var Settings_BlockedUsers: String { return self._s[3001]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2992]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2993]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2994]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2995]! } + public var AutoDownloadSettings_Channels: String { return self._s[2996]! } + public var Passport_Language_mn: String { return self._s[2997]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3000]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3001]! } + public var Passport_Language_ja: String { return self._s[3003]! } + public var Settings_About_Title: String { return self._s[3004]! } + public var Settings_NotificationsAndSounds: String { return self._s[3005]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3006]! } + public var Settings_BlockedUsers: String { return self._s[3007]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3002]!, self._r[3002]!, [_0]) + return formatWithArgumentRanges(self._s[3008]!, self._r[3008]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3003]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3004]! } - public var Channel_Username_Title: String { return self._s[3005]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3009]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3010]! } + public var Channel_Username_Title: String { return self._s[3011]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3006]!, self._r[3006]!, [_0]) + return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3008]! } - public var AppleWatch_Title: String { return self._s[3009]! } - public var Activity_RecordingVideoMessage: String { return self._s[3010]! } + public var AttachmentMenu_File: String { return self._s[3014]! } + public var AppleWatch_Title: String { return self._s[3015]! } + public var Activity_RecordingVideoMessage: String { return self._s[3016]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3017]!, self._r[3017]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3012]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3013]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3014]! } - public var Common_Next: String { return self._s[3016]! } - public var Channel_Stickers_YourStickers: String { return self._s[3018]! } - public var Message_Theme: String { return self._s[3019]! } - public var Call_AudioRouteHeadphones: String { return self._s[3020]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3022]! } - public var Watch_Contacts_NoResults: String { return self._s[3024]! } - public var PhotoEditor_TintTool: String { return self._s[3027]! } - public var LoginPassword_ResetAccount: String { return self._s[3029]! } - public var Settings_SavedMessages: String { return self._s[3030]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3031]! } - public var Bot_GenericSupportStatus: String { return self._s[3032]! } - public var StickerPack_Add: String { return self._s[3033]! } - public var Checkout_TotalAmount: String { return self._s[3034]! } - public var Your_cards_number_is_invalid: String { return self._s[3035]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3036]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3037]! } + public var Weekday_Saturday: String { return self._s[3018]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3019]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3020]! } + public var Common_Next: String { return self._s[3022]! } + public var Channel_Stickers_YourStickers: String { return self._s[3024]! } + public var Message_Theme: String { return self._s[3025]! } + public var Call_AudioRouteHeadphones: String { return self._s[3026]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3028]! } + public var Watch_Contacts_NoResults: String { return self._s[3030]! } + public var PhotoEditor_TintTool: String { return self._s[3033]! } + public var LoginPassword_ResetAccount: String { return self._s[3035]! } + public var Settings_SavedMessages: String { return self._s[3036]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3037]! } + public var Bot_GenericSupportStatus: String { return self._s[3038]! } + public var StickerPack_Add: String { return self._s[3039]! } + public var Checkout_TotalAmount: String { return self._s[3040]! } + public var Your_cards_number_is_invalid: String { return self._s[3041]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3042]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3043]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_0]) + return formatWithArgumentRanges(self._s[3044]!, self._r[3044]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3039]!, self._r[3039]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3045]!, self._r[3045]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3040]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3046]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3042]!, self._r[3042]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3043]!, self._r[3043]!, [_0]) + return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3044]! } - public var StickerPack_Share: String { return self._s[3045]! } - public var Passport_DeleteAddress: String { return self._s[3046]! } - public var Settings_Passport: String { return self._s[3047]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3048]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3049]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3050]! } - public var Contacts_PermissionsText: String { return self._s[3051]! } - public var Group_Setup_HistoryVisible: String { return self._s[3052]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3054]! } - public var SocksProxySetup_Title: String { return self._s[3055]! } - public var Notification_Mute1h: String { return self._s[3056]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3050]! } + public var StickerPack_Share: String { return self._s[3051]! } + public var Passport_DeleteAddress: String { return self._s[3052]! } + public var Settings_Passport: String { return self._s[3053]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3054]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3055]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3056]! } + public var Contacts_PermissionsText: String { return self._s[3057]! } + public var Group_Setup_HistoryVisible: String { return self._s[3058]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3060]! } + public var SocksProxySetup_Title: String { return self._s[3061]! } + public var Notification_Mute1h: String { return self._s[3062]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3057]!, self._r[3057]!, [_0]) + return formatWithArgumentRanges(self._s[3063]!, self._r[3063]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3058]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3064]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_1]) + return formatWithArgumentRanges(self._s[3065]!, self._r[3065]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3060]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3063]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3065]! } - public var DialogList_NoMessagesText: String { return self._s[3066]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3067]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3068]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3070]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3071]! } - public var Common_TakePhotoOrVideo: String { return self._s[3072]! } - public var Call_StatusBusy: String { return self._s[3073]! } - public var Conversation_PinnedMessage: String { return self._s[3074]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3075]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3076]! } - public var Undo_ChatCleared: String { return self._s[3077]! } - public var AppleWatch_ReplyPresets: String { return self._s[3078]! } - public var Passport_DiscardMessageDescription: String { return self._s[3080]! } - public var Login_NetworkError: String { return self._s[3081]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3066]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3069]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3071]! } + public var DialogList_NoMessagesText: String { return self._s[3072]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3073]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3074]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3076]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3077]! } + public var Common_TakePhotoOrVideo: String { return self._s[3078]! } + public var Call_StatusBusy: String { return self._s[3079]! } + public var Conversation_PinnedMessage: String { return self._s[3080]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3081]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3082]! } + public var Undo_ChatCleared: String { return self._s[3083]! } + public var AppleWatch_ReplyPresets: String { return self._s[3084]! } + public var Passport_DiscardMessageDescription: String { return self._s[3086]! } + public var Login_NetworkError: String { return self._s[3087]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3082]!, self._r[3082]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3083]!, self._r[3083]!, [_0]) - } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3084]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3086]! } - public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3089]! } - public var VoiceOver_Chat_Music: String { return self._s[3090]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3091]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3093]! } - public var ConversationMedia_Title: String { return self._s[3094]! } - public var EncryptionKey_Title: String { return self._s[3096]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3097]! } - public var Notification_Exceptions_AddException: String { return self._s[3098]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3099]! } - public var Profile_MessageLifetime1m: String { return self._s[3100]! } + public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3089]!, self._r[3089]!, [_0]) + } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3090]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3092]! } + public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_0]) + } + public var Call_ConnectionErrorMessage: String { return self._s[3095]! } + public var VoiceOver_Chat_Music: String { return self._s[3096]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3097]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3099]! } + public var ConversationMedia_Title: String { return self._s[3100]! } + public var EncryptionKey_Title: String { return self._s[3102]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3103]! } + public var Notification_Exceptions_AddException: String { return self._s[3104]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3105]! } + public var Profile_MessageLifetime1m: String { return self._s[3106]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3101]!, self._r[3101]!, [_1]) + return formatWithArgumentRanges(self._s[3107]!, self._r[3107]!, [_1]) } - public var Month_GenMay: String { return self._s[3102]! } + public var Month_GenMay: String { return self._s[3108]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3103]!, self._r[3103]!, [_0]) + return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3104]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3105]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3106]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3108]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3109]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3110]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3111]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3112]! } - public var Channel_JoinChannel: String { return self._s[3114]! } - public var Appearance_Animations: String { return self._s[3117]! } + public var PeopleNearby_Users: String { return self._s[3110]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3111]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3112]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3114]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3115]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3116]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3117]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3118]! } + public var Channel_JoinChannel: String { return self._s[3120]! } + public var Appearance_Animations: String { return self._s[3123]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3118]!, self._r[3118]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3120]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3122]! } - public var Passport_Address_Street: String { return self._s[3123]! } - public var Conversation_AddContact: String { return self._s[3124]! } - public var Login_PhonePlaceholder: String { return self._s[3125]! } - public var Channel_Members_InviteLink: String { return self._s[3127]! } - public var Bot_Stop: String { return self._s[3128]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3130]! } - public var Notification_PassportValueAddress: String { return self._s[3131]! } - public var Month_ShortJuly: String { return self._s[3132]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3133]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3134]! } - public var Passport_Identity_ReverseSide: String { return self._s[3135]! } - public var Watch_Stickers_Recents: String { return self._s[3138]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3140]! } - public var Map_SendThisLocation: String { return self._s[3141]! } + public var Stickers_GroupStickers: String { return self._s[3126]! } + public var Appearance_ShareTheme: String { return self._s[3127]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3129]! } + public var Passport_Address_Street: String { return self._s[3130]! } + public var Conversation_AddContact: String { return self._s[3131]! } + public var Login_PhonePlaceholder: String { return self._s[3132]! } + public var Channel_Members_InviteLink: String { return self._s[3134]! } + public var Bot_Stop: String { return self._s[3135]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3137]! } + public var Notification_PassportValueAddress: String { return self._s[3138]! } + public var Month_ShortJuly: String { return self._s[3139]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3140]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3141]! } + public var Passport_Identity_ReverseSide: String { return self._s[3142]! } + public var Watch_Stickers_Recents: String { return self._s[3145]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3147]! } + public var Map_SendThisLocation: String { return self._s[3148]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3142]!, self._r[3142]!, [_0]) + return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3143]!, self._r[3143]!, [_0]) + return formatWithArgumentRanges(self._s[3150]!, self._r[3150]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3144]! } + public var ConvertToSupergroup_Note: String { return self._s[3151]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3145]!, self._r[3145]!, [_0]) + return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3146]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3153]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3147]!, self._r[3147]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3149]! } - public var Wallpaper_SearchShort: String { return self._s[3150]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3152]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3153]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3154]! } + public var Login_CallRequestState3: String { return self._s[3156]! } + public var Wallpaper_SearchShort: String { return self._s[3157]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3159]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3160]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3161]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3156]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3160]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3163]! } + public var EditTheme_UploadNewInfo: String { return self._s[3166]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3168]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_0]) + return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3162]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3163]! } + public var Passport_CorrectErrors: String { return self._s[3170]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3171]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_0]) + return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3165]! } - public var Channel_DiscussionGroup: String { return self._s[3166]! } + public var Map_SendMyCurrentLocation: String { return self._s[3173]! } + public var Channel_DiscussionGroup: String { return self._s[3174]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3167]!, self._r[3167]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3175]!, self._r[3175]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3168]! } - public var Permissions_NotificationsText_v0: String { return self._s[3169]! } - public var Appearance_AppIcon: String { return self._s[3170]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3171]! } - public var LoginPassword_FloodError: String { return self._s[3172]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3174]! } + public var SharedMedia_SearchNoResults: String { return self._s[3176]! } + public var Permissions_NotificationsText_v0: String { return self._s[3177]! } + public var Appearance_AppIcon: String { return self._s[3178]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3179]! } + public var LoginPassword_FloodError: String { return self._s[3180]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3182]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3175]!, self._r[3175]!, [_0]) + return formatWithArgumentRanges(self._s[3183]!, self._r[3183]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3176]! } + public var Passport_Language_bn: String { return self._s[3184]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_0]) + return formatWithArgumentRanges(self._s[3185]!, self._r[3185]!, [_0]) } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3178]!, self._r[3178]!, [_0]) + return formatWithArgumentRanges(self._s[3186]!, self._r[3186]!, [_0]) } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3179]!, self._r[3179]!, [_0]) + return formatWithArgumentRanges(self._s[3187]!, self._r[3187]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3182]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3184]! } - public var Contacts_PermissionsAllow: String { return self._s[3185]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3186]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3187]! } - public var WallpaperPreview_Pattern: String { return self._s[3188]! } - public var Paint_Duplicate: String { return self._s[3189]! } - public var Passport_Address_Country: String { return self._s[3190]! } - public var Notification_RenamedChannel: String { return self._s[3192]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3193]! } - public var Group_MessagePhotoUpdated: String { return self._s[3194]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3195]! } - public var Conversation_ContextMenuBan: String { return self._s[3196]! } - public var TwoStepAuth_EmailSent: String { return self._s[3197]! } - public var MessagePoll_NoVotes: String { return self._s[3198]! } - public var Passport_Language_is: String { return self._s[3199]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3201]! } - public var Tour_Text5: String { return self._s[3202]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3190]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3192]! } + public var Contacts_PermissionsAllow: String { return self._s[3193]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3194]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3195]! } + public var WallpaperPreview_Pattern: String { return self._s[3196]! } + public var Paint_Duplicate: String { return self._s[3197]! } + public var Passport_Address_Country: String { return self._s[3198]! } + public var Notification_RenamedChannel: String { return self._s[3200]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3201]! } + public var Group_MessagePhotoUpdated: String { return self._s[3202]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3203]! } + public var Conversation_ContextMenuBan: String { return self._s[3204]! } + public var TwoStepAuth_EmailSent: String { return self._s[3205]! } + public var MessagePoll_NoVotes: String { return self._s[3206]! } + public var Passport_Language_is: String { return self._s[3207]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3209]! } + public var Tour_Text5: String { return self._s[3210]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3204]!, self._r[3204]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3205]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3206]! } + public var Undo_SecretChatDeleted: String { return self._s[3213]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3214]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0]) + return formatWithArgumentRanges(self._s[3215]!, self._r[3215]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3208]! } - public var Paint_Edit: String { return self._s[3210]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3212]! } - public var Undo_DeletedGroup: String { return self._s[3214]! } - public var LoginPassword_ForgotPassword: String { return self._s[3215]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3216]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3216]! } + public var Paint_Edit: String { return self._s[3218]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3220]! } + public var Undo_DeletedGroup: String { return self._s[3222]! } + public var LoginPassword_ForgotPassword: String { return self._s[3223]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3224]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3217]!, self._r[3217]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3225]!, self._r[3225]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3218]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3219]! } - public var Passport_Language_uz: String { return self._s[3220]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3221]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3222]! } - public var Map_StopLiveLocation: String { return self._s[3224]! } - public var VoiceOver_MessageContextSend: String { return self._s[3226]! } - public var PasscodeSettings_Help: String { return self._s[3227]! } - public var NotificationsSound_Input: String { return self._s[3228]! } - public var Share_Title: String { return self._s[3231]! } - public var LogoutOptions_Title: String { return self._s[3232]! } - public var Login_TermsOfServiceAgree: String { return self._s[3233]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3234]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3235]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3236]! } - public var EnterPasscode_EnterTitle: String { return self._s[3237]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3226]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3227]! } + public var Passport_Language_uz: String { return self._s[3228]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3229]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3230]! } + public var Map_StopLiveLocation: String { return self._s[3232]! } + public var VoiceOver_MessageContextSend: String { return self._s[3234]! } + public var PasscodeSettings_Help: String { return self._s[3235]! } + public var NotificationsSound_Input: String { return self._s[3236]! } + public var Share_Title: String { return self._s[3239]! } + public var LogoutOptions_Title: String { return self._s[3240]! } + public var Login_TermsOfServiceAgree: String { return self._s[3241]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3242]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3243]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3244]! } + public var EnterPasscode_EnterTitle: String { return self._s[3245]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_0]) + return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3239]! } - public var Conversation_AddToContacts: String { return self._s[3240]! } + public var Settings_CopyPhoneNumber: String { return self._s[3247]! } + public var Conversation_AddToContacts: String { return self._s[3248]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_0]) + return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3242]! } + public var NotificationsSound_Keys: String { return self._s[3250]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_0]) - } - public var Notification_MessageLifetime1w: String { return self._s[3244]! } - public var Message_Video: String { return self._s[3245]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3246]! } - public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_1]) - } - public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3250]!, self._r[3250]!, [_0]) - } - public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3251]!, self._r[3251]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3252]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3253]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3255]! } - public var PrivacyPolicy_Decline: String { return self._s[3256]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3257]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3258]! } - public var Permissions_SiriAllow_v0: String { return self._s[3260]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3261]! } + public var Notification_MessageLifetime1w: String { return self._s[3252]! } + public var Message_Video: String { return self._s[3253]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3254]! } + public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3255]!, self._r[3255]!, [_1]) + } + public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3258]!, self._r[3258]!, [_0]) + } + public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3259]!, self._r[3259]!, [_0]) + } + public var Passport_Language_mk: String { return self._s[3260]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3261]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3263]! } + public var PrivacyPolicy_Decline: String { return self._s[3264]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3265]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3266]! } + public var Permissions_SiriAllow_v0: String { return self._s[3268]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3269]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3262]!, self._r[3262]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3270]!, self._r[3270]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3263]!, self._r[3263]!, [_0]) + return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_0]) } - public var Paint_Regular: String { return self._s[3264]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3265]! } - public var SocksProxySetup_ShareLink: String { return self._s[3266]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3267]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3269]! } - public var GroupInfo_InviteByLink: String { return self._s[3270]! } - public var MessageTimer_Custom: String { return self._s[3271]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3272]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3274]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3275]! } - public var VoiceOver_Chat_Selected: String { return self._s[3276]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3277]! } - public var Channel_Username_InvalidTaken: String { return self._s[3278]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3279]! } - public var Settings_ChatBackground: String { return self._s[3280]! } - public var Channel_Subscribers_Title: String { return self._s[3281]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3282]! } - public var Watch_ConnectionDescription: String { return self._s[3283]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3287]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3288]! } - public var EditProfile_Title: String { return self._s[3289]! } - public var NotificationsSound_Bamboo: String { return self._s[3291]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3293]! } - public var Login_SmsRequestState2: String { return self._s[3294]! } - public var Passport_Language_ar: String { return self._s[3295]! } + public var Paint_Regular: String { return self._s[3272]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3273]! } + public var SocksProxySetup_ShareLink: String { return self._s[3274]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3275]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3277]! } + public var GroupInfo_InviteByLink: String { return self._s[3278]! } + public var MessageTimer_Custom: String { return self._s[3279]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3280]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3282]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3283]! } + public var VoiceOver_Chat_Selected: String { return self._s[3284]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3285]! } + public var Channel_Username_InvalidTaken: String { return self._s[3286]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3287]! } + public var Settings_ChatBackground: String { return self._s[3288]! } + public var Channel_Subscribers_Title: String { return self._s[3289]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3290]! } + public var Watch_ConnectionDescription: String { return self._s[3291]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3295]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3296]! } + public var EditProfile_Title: String { return self._s[3297]! } + public var NotificationsSound_Bamboo: String { return self._s[3299]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3301]! } + public var Login_SmsRequestState2: String { return self._s[3302]! } + public var Passport_Language_ar: String { return self._s[3303]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) + return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3297]! } - public var Conversation_MessageDialogEdit: String { return self._s[3298]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3299]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3305]! } + public var Conversation_MessageDialogEdit: String { return self._s[3306]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3307]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_1]) + return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_1]) } - public var Common_Close: String { return self._s[3301]! } - public var GroupInfo_PublicLink: String { return self._s[3302]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3303]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3304]! } + public var Common_Close: String { return self._s[3309]! } + public var GroupInfo_PublicLink: String { return self._s[3310]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3311]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3312]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_0]) + return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3309]! } + public var UserInfo_About_Placeholder: String { return self._s[3317]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3310]!, self._r[3310]!, [_0]) + return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3311]! } - public var Channel_Info_Banned: String { return self._s[3313]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3319]! } + public var Channel_Info_Banned: String { return self._s[3321]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3314]!, self._r[3314]!, [_0]) + return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_0]) } - public var Appearance_Other: String { return self._s[3315]! } - public var Passport_Language_my: String { return self._s[3316]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3317]! } + public var Appearance_Other: String { return self._s[3323]! } + public var Passport_Language_my: String { return self._s[3324]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3325]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3326]!, self._r[3326]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3319]! } - public var Preview_CopyAddress: String { return self._s[3320]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3327]! } + public var Preview_CopyAddress: String { return self._s[3328]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) + return formatWithArgumentRanges(self._s[3329]!, self._r[3329]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3322]! } - public var UserInfo_BotSettings: String { return self._s[3323]! } - public var LiveLocation_MenuStopAll: String { return self._s[3325]! } - public var Passport_PasswordCreate: String { return self._s[3326]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3327]! } - public var Message_PinnedLocationMessage: String { return self._s[3328]! } - public var Map_Satellite: String { return self._s[3329]! } - public var Watch_Message_Unsupported: String { return self._s[3330]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3331]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3332]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3330]! } + public var UserInfo_BotSettings: String { return self._s[3331]! } + public var LiveLocation_MenuStopAll: String { return self._s[3333]! } + public var Passport_PasswordCreate: String { return self._s[3334]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3335]! } + public var Message_PinnedLocationMessage: String { return self._s[3336]! } + public var Map_Satellite: String { return self._s[3337]! } + public var Watch_Message_Unsupported: String { return self._s[3338]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3339]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3340]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_0]) + return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3335]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3336]! } - public var NotificationsSound_None: String { return self._s[3337]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3339]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3340]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3343]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3344]! } + public var NotificationsSound_None: String { return self._s[3345]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3347]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3348]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_1]) + return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_1]) } - public var Cache_Indexing: String { return self._s[3342]! } - public var DialogList_RecentTitlePeople: String { return self._s[3344]! } - public var DialogList_EncryptionRejected: String { return self._s[3345]! } - public var GroupInfo_Administrators: String { return self._s[3346]! } - public var Passport_ScanPassportHelp: String { return self._s[3347]! } - public var Application_Name: String { return self._s[3348]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3349]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3351]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3352]! } + public var Cache_Indexing: String { return self._s[3350]! } + public var DialogList_RecentTitlePeople: String { return self._s[3352]! } + public var DialogList_EncryptionRejected: String { return self._s[3353]! } + public var GroupInfo_Administrators: String { return self._s[3354]! } + public var Passport_ScanPassportHelp: String { return self._s[3355]! } + public var Application_Name: String { return self._s[3356]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3357]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3359]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3360]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) + return formatWithArgumentRanges(self._s[3361]!, self._r[3361]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_0]) + return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_0]) + return formatWithArgumentRanges(self._s[3363]!, self._r[3363]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3356]! } - public var Privacy_ChatsTitle: String { return self._s[3357]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3358]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3359]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3360]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3361]! } - public var Group_LinkedChannel: String { return self._s[3362]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3363]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3364]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3365]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3366]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3368]! } - public var Channel_Setup_TypePublic: String { return self._s[3370]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3364]! } + public var Privacy_ChatsTitle: String { return self._s[3365]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3366]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3367]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3368]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3369]! } + public var Group_LinkedChannel: String { return self._s[3370]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3371]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3372]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3373]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3374]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3376]! } + public var Channel_Setup_TypePublic: String { return self._s[3378]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_0]) + return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3373]! } - public var Map_OpenInMaps: String { return self._s[3375]! } + public var Channel_TypeSetup_Title: String { return self._s[3381]! } + public var Map_OpenInMaps: String { return self._s[3383]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_1]) + return formatWithArgumentRanges(self._s[3384]!, self._r[3384]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3378]! } + public var NotificationsSound_Tremolo: String { return self._s[3386]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3387]!, self._r[3387]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3380]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3381]! } - public var Passport_PasswordHelp: String { return self._s[3382]! } - public var Login_CodeExpiredError: String { return self._s[3383]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3384]! } - public var Conversation_TitleUnmute: String { return self._s[3385]! } - public var Passport_Identity_ScansHelp: String { return self._s[3386]! } - public var Passport_Language_lo: String { return self._s[3387]! } - public var Camera_FlashAuto: String { return self._s[3388]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3389]! } - public var Common_Cancel: String { return self._s[3390]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3391]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3392]! } - public var Appearance_TintAllColors: String { return self._s[3393]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3388]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3389]! } + public var Passport_PasswordHelp: String { return self._s[3390]! } + public var Login_CodeExpiredError: String { return self._s[3391]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3392]! } + public var Conversation_TitleUnmute: String { return self._s[3393]! } + public var Passport_Identity_ScansHelp: String { return self._s[3394]! } + public var Passport_Language_lo: String { return self._s[3395]! } + public var Camera_FlashAuto: String { return self._s[3396]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3397]! } + public var Common_Cancel: String { return self._s[3398]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3399]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3400]! } + public var Appearance_TintAllColors: String { return self._s[3401]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_1]) + return formatWithArgumentRanges(self._s[3402]!, self._r[3402]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3395]! } - public var ChatSettings_Title: String { return self._s[3397]! } - public var Passport_PasswordReset: String { return self._s[3398]! } - public var SocksProxySetup_TypeNone: String { return self._s[3399]! } - public var EditTheme_Title: String { return self._s[3401]! } - public var PhoneNumberHelp_Help: String { return self._s[3402]! } - public var Checkout_EnterPassword: String { return self._s[3403]! } - public var Share_AuthTitle: String { return self._s[3405]! } - public var Activity_UploadingDocument: String { return self._s[3406]! } - public var State_Connecting: String { return self._s[3407]! } - public var Profile_MessageLifetime1w: String { return self._s[3408]! } - public var Conversation_ContextMenuReport: String { return self._s[3409]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3410]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3411]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3403]! } + public var ChatSettings_Title: String { return self._s[3405]! } + public var Passport_PasswordReset: String { return self._s[3406]! } + public var SocksProxySetup_TypeNone: String { return self._s[3407]! } + public var EditTheme_Title: String { return self._s[3409]! } + public var PhoneNumberHelp_Help: String { return self._s[3410]! } + public var Checkout_EnterPassword: String { return self._s[3411]! } + public var Share_AuthTitle: String { return self._s[3413]! } + public var Activity_UploadingDocument: String { return self._s[3414]! } + public var State_Connecting: String { return self._s[3415]! } + public var Profile_MessageLifetime1w: String { return self._s[3416]! } + public var Conversation_ContextMenuReport: String { return self._s[3417]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3418]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3419]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_0]) + return formatWithArgumentRanges(self._s[3420]!, self._r[3420]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3413]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3414]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3415]! } - public var PhotoEditor_Set: String { return self._s[3416]! } - public var EmptyGroupInfo_Title: String { return self._s[3417]! } - public var Login_PadPhoneHelp: String { return self._s[3418]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3420]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3422]! } - public var NotificationsSound_Complete: String { return self._s[3423]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3424]! } - public var Group_Info_AdminLog: String { return self._s[3425]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3426]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3427]! } - public var Conversation_Admin: String { return self._s[3429]! } - public var Conversation_GifTooltip: String { return self._s[3430]! } - public var Passport_NotLoggedInMessage: String { return self._s[3431]! } + public var AuthSessions_Terminate: String { return self._s[3421]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3422]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3423]! } + public var PhotoEditor_Set: String { return self._s[3424]! } + public var EmptyGroupInfo_Title: String { return self._s[3425]! } + public var Login_PadPhoneHelp: String { return self._s[3426]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3428]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3430]! } + public var NotificationsSound_Complete: String { return self._s[3431]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3432]! } + public var Group_Info_AdminLog: String { return self._s[3433]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3434]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3435]! } + public var Conversation_Admin: String { return self._s[3437]! } + public var Conversation_GifTooltip: String { return self._s[3438]! } + public var Passport_NotLoggedInMessage: String { return self._s[3439]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_0]) + return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3433]! } - public var SharedMedia_EmptyTitle: String { return self._s[3435]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3437]! } - public var Username_Help: String { return self._s[3438]! } - public var DialogList_LanguageTooltip: String { return self._s[3440]! } - public var Map_LoadError: String { return self._s[3441]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3442]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3443]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3444]! } - public var Notification_Exceptions_NewException: String { return self._s[3445]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3446]! } - public var WatchRemote_AlertText: String { return self._s[3447]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3450]! } + public var Profile_MessageLifetimeForever: String { return self._s[3441]! } + public var SharedMedia_EmptyTitle: String { return self._s[3443]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3445]! } + public var Username_Help: String { return self._s[3446]! } + public var DialogList_LanguageTooltip: String { return self._s[3448]! } + public var Map_LoadError: String { return self._s[3449]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3450]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3451]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3452]! } + public var Notification_Exceptions_NewException: String { return self._s[3453]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3454]! } + public var WatchRemote_AlertText: String { return self._s[3455]! } + public var EditTheme_UploadEditedInfo: String { return self._s[3456]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3459]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_0]) + return formatWithArgumentRanges(self._s[3460]!, self._r[3460]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3452]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3453]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3461]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3462]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3454]!, self._r[3454]!, [_0]) + return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3464]!, self._r[3464]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3456]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3457]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3459]! } - public var ChatList_UndoArchiveText1: String { return self._s[3460]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3461]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3462]! } - public var Cache_ClearNone: String { return self._s[3463]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3464]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3465]! } + public var Group_AdminLog_EmptyText: String { return self._s[3465]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3466]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3468]! } + public var ChatList_UndoArchiveText1: String { return self._s[3469]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3470]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3471]! } + public var Cache_ClearNone: String { return self._s[3472]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3473]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3474]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_0]) + return formatWithArgumentRanges(self._s[3475]!, self._r[3475]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3467]! } + public var Passport_Identity_Country: String { return self._s[3476]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3468]!, self._r[3468]!, [_0]) + return formatWithArgumentRanges(self._s[3477]!, self._r[3477]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3469]!, self._r[3469]!, [_0]) + return formatWithArgumentRanges(self._s[3478]!, self._r[3478]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3470]! } - public var AccessDenied_Settings: String { return self._s[3471]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3472]! } - public var Month_ShortMay: String { return self._s[3473]! } - public var Compose_NewGroup: String { return self._s[3474]! } - public var Group_Setup_TypePrivate: String { return self._s[3476]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3478]! } - public var Appearance_ThemeDayClassic: String { return self._s[3479]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3480]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3481]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3482]! } - public var Conversation_typing: String { return self._s[3484]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3485]! } - public var Paint_Masks: String { return self._s[3486]! } - public var Contacts_DeselectAll: String { return self._s[3487]! } - public var Username_InvalidTaken: String { return self._s[3488]! } - public var Call_StatusNoAnswer: String { return self._s[3489]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3490]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3491]! } - public var Passport_Identity_Selfie: String { return self._s[3492]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3493]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3494]! } - public var Conversation_ClearSecretHistory: String { return self._s[3495]! } - public var PeopleNearby_Description: String { return self._s[3497]! } - public var NetworkUsageSettings_Title: String { return self._s[3498]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3500]! } + public var Exceptions_AddToExceptions: String { return self._s[3479]! } + public var AccessDenied_Settings: String { return self._s[3480]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3481]! } + public var Month_ShortMay: String { return self._s[3482]! } + public var Compose_NewGroup: String { return self._s[3483]! } + public var Group_Setup_TypePrivate: String { return self._s[3485]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3487]! } + public var Appearance_ThemeDayClassic: String { return self._s[3488]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3489]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3490]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3491]! } + public var Conversation_typing: String { return self._s[3493]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3494]! } + public var Paint_Masks: String { return self._s[3495]! } + public var Contacts_DeselectAll: String { return self._s[3496]! } + public var Username_InvalidTaken: String { return self._s[3497]! } + public var Call_StatusNoAnswer: String { return self._s[3498]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3499]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3500]! } + public var Passport_Identity_Selfie: String { return self._s[3501]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3502]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3503]! } + public var Conversation_ClearSecretHistory: String { return self._s[3504]! } + public var PeopleNearby_Description: String { return self._s[3506]! } + public var NetworkUsageSettings_Title: String { return self._s[3507]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3509]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_0]) + return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3503]!, self._r[3503]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3505]! } - public var VoiceOver_Navigation_Search: String { return self._s[3506]! } - public var Map_LiveLocationTitle: String { return self._s[3507]! } - public var Login_InfoAvatarAdd: String { return self._s[3508]! } - public var Passport_Identity_FilesView: String { return self._s[3509]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3510]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3511]! } - public var VoiceOver_Chat_File: String { return self._s[3512]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3514]! } + public var VoiceOver_Navigation_Search: String { return self._s[3515]! } + public var Map_LiveLocationTitle: String { return self._s[3516]! } + public var Login_InfoAvatarAdd: String { return self._s[3517]! } + public var Passport_Identity_FilesView: String { return self._s[3518]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3519]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3520]! } + public var VoiceOver_Chat_File: String { return self._s[3521]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_0]) + return formatWithArgumentRanges(self._s[3522]!, self._r[3522]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3514]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3515]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3516]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3523]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3524]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3525]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3517]!, self._r[3517]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3518]! } - public var Tour_Title2: String { return self._s[3519]! } - public var Conversation_FileOpenIn: String { return self._s[3520]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3521]! } - public var Wallpaper_Set: String { return self._s[3522]! } - public var Passport_Identity_Translations: String { return self._s[3524]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3527]! } + public var Tour_Title2: String { return self._s[3528]! } + public var Conversation_FileOpenIn: String { return self._s[3529]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3530]! } + public var Wallpaper_Set: String { return self._s[3531]! } + public var Passport_Identity_Translations: String { return self._s[3533]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3525]!, self._r[3525]!, [_0]) + return formatWithArgumentRanges(self._s[3534]!, self._r[3534]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3526]! } + public var Channel_LeaveChannel: String { return self._s[3535]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3527]!, self._r[3527]!, [_1]) + return formatWithArgumentRanges(self._s[3536]!, self._r[3536]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3529]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3530]! } - public var Passport_Email_Delete: String { return self._s[3531]! } - public var Conversation_Mute: String { return self._s[3533]! } - public var Channel_AddBotAsAdmin: String { return self._s[3534]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3536]! } - public var Channel_Management_LabelOwner: String { return self._s[3538]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3538]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3539]! } + public var Passport_Email_Delete: String { return self._s[3540]! } + public var Conversation_Mute: String { return self._s[3542]! } + public var Channel_AddBotAsAdmin: String { return self._s[3543]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3545]! } + public var Channel_Management_LabelOwner: String { return self._s[3547]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3539]!, self._r[3539]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3548]!, self._r[3548]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3540]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3541]! } - public var Common_No: String { return self._s[3542]! } - public var Weekday_Sunday: String { return self._s[3543]! } - public var Notification_Reply: String { return self._s[3544]! } - public var Conversation_ViewMessage: String { return self._s[3545]! } + public var Calls_CallTabDescription: String { return self._s[3549]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3550]! } + public var Common_No: String { return self._s[3551]! } + public var Weekday_Sunday: String { return self._s[3552]! } + public var Notification_Reply: String { return self._s[3553]! } + public var Conversation_ViewMessage: String { return self._s[3554]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_0]) + return formatWithArgumentRanges(self._s[3555]!, self._r[3555]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3547]!, self._r[3547]!, [_0]) + return formatWithArgumentRanges(self._s[3556]!, self._r[3556]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3548]! } - public var Message_PinnedDocumentMessage: String { return self._s[3549]! } - public var DialogList_TabTitle: String { return self._s[3551]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3552]! } - public var Passport_FieldEmail: String { return self._s[3553]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3554]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3555]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3556]! } - public var Privacy_Calls_P2P: String { return self._s[3557]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3557]! } + public var Message_PinnedDocumentMessage: String { return self._s[3558]! } + public var DialogList_TabTitle: String { return self._s[3560]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3561]! } + public var Passport_FieldEmail: String { return self._s[3562]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3563]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3564]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3565]! } + public var Privacy_Calls_P2P: String { return self._s[3566]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3559]!, self._r[3559]!, [_0]) + return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3560]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3569]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3570]!, self._r[3570]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3562]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3563]! } - public var Passport_InfoText: String { return self._s[3564]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3565]! } + public var Stickers_ClearRecent: String { return self._s[3571]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3572]! } + public var Passport_InfoText: String { return self._s[3573]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3574]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3566]!, self._r[3566]!, [_0]) + return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3567]!, self._r[3567]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3576]!, self._r[3576]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3568]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3569]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3570]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3571]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3573]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3574]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3577]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3578]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3579]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3580]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3582]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3583]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3577]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3586]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3579]!, self._r[3579]!, [_0]) + return formatWithArgumentRanges(self._s[3588]!, self._r[3588]!, [_0]) } - public var DialogList_Unread: String { return self._s[3580]! } + public var DialogList_Unread: String { return self._s[3589]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3582]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3583]! } + public var User_DeletedAccount: String { return self._s[3591]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3592]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_0]) + return formatWithArgumentRanges(self._s[3593]!, self._r[3593]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3585]! } - public var SharedMedia_CategoryMedia: String { return self._s[3586]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3587]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3588]! } - public var Watch_ChatList_Compose: String { return self._s[3589]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3590]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3591]! } - public var Watch_Microphone_Access: String { return self._s[3592]! } - public var Group_Setup_HistoryHeader: String { return self._s[3593]! } - public var Map_SetThisLocation: String { return self._s[3594]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3595]! } - public var Activity_UploadingPhoto: String { return self._s[3596]! } - public var Conversation_Edit: String { return self._s[3598]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3599]! } - public var Login_TermsOfServiceDecline: String { return self._s[3600]! } - public var Message_PinnedContactMessage: String { return self._s[3601]! } + public var UserInfo_NotificationsDefault: String { return self._s[3594]! } + public var SharedMedia_CategoryMedia: String { return self._s[3595]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3596]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3597]! } + public var Watch_ChatList_Compose: String { return self._s[3598]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3599]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3600]! } + public var Watch_Microphone_Access: String { return self._s[3601]! } + public var Group_Setup_HistoryHeader: String { return self._s[3602]! } + public var Map_SetThisLocation: String { return self._s[3603]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3604]! } + public var Activity_UploadingPhoto: String { return self._s[3605]! } + public var Conversation_Edit: String { return self._s[3607]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3608]! } + public var Login_TermsOfServiceDecline: String { return self._s[3609]! } + public var Message_PinnedContactMessage: String { return self._s[3610]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3602]!, self._r[3602]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3612]!, self._r[3612]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3604]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3606]! } + public var Appearance_LargeEmoji: String { return self._s[3613]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3615]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3608]! } - public var Message_PinnedPhotoMessage: String { return self._s[3609]! } - public var Passport_FieldPhone: String { return self._s[3610]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3611]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3612]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3614]! } - public var Conversation_Call: String { return self._s[3615]! } - public var Common_TakePhoto: String { return self._s[3617]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3618]! } - public var Channel_NotificationLoading: String { return self._s[3619]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3617]! } + public var Message_PinnedPhotoMessage: String { return self._s[3618]! } + public var Passport_FieldPhone: String { return self._s[3619]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3620]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3621]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3623]! } + public var Conversation_Call: String { return self._s[3624]! } + public var Common_TakePhoto: String { return self._s[3626]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3627]! } + public var Channel_NotificationLoading: String { return self._s[3628]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3620]!, self._r[3620]!, [_0]) + return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_0]) } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, [_0]) + return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_1]) + return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3623]! } + public var Permissions_SiriTitle_v0: String { return self._s[3632]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3624]!, self._r[3624]!, [_0]) + return formatWithArgumentRanges(self._s[3633]!, self._r[3633]!, [_0]) } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_0]) + return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3626]! } - public var Common_edit: String { return self._s[3627]! } - public var PrivacySettings_AuthSessions: String { return self._s[3628]! } - public var Month_ShortJune: String { return self._s[3629]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3630]! } - public var Call_ReportSend: String { return self._s[3631]! } - public var Watch_LastSeen_JustNow: String { return self._s[3632]! } - public var Notifications_MessageNotifications: String { return self._s[3633]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3634]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3636]! } - public var Group_Status: String { return self._s[3637]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3635]! } + public var Common_edit: String { return self._s[3636]! } + public var PrivacySettings_AuthSessions: String { return self._s[3637]! } + public var Month_ShortJune: String { return self._s[3638]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3639]! } + public var Call_ReportSend: String { return self._s[3640]! } + public var Watch_LastSeen_JustNow: String { return self._s[3641]! } + public var Notifications_MessageNotifications: String { return self._s[3642]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3643]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3645]! } + public var Group_Status: String { return self._s[3646]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3638]!, self._r[3638]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3647]!, self._r[3647]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3639]! } - public var ShareMenu_ShareTo: String { return self._s[3640]! } - public var Conversation_Moderate_Ban: String { return self._s[3641]! } + public var TextFormat_AddLinkTitle: String { return self._s[3648]! } + public var ShareMenu_ShareTo: String { return self._s[3649]! } + public var Conversation_Moderate_Ban: String { return self._s[3650]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3642]!, self._r[3642]!, [_0]) + return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3643]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3644]! } + public var SharedMedia_ViewInChat: String { return self._s[3652]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3653]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_1]) + return formatWithArgumentRanges(self._s[3654]!, self._r[3654]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3646]!, self._r[3646]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3655]!, self._r[3655]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3648]!, self._r[3648]!, [_0]) + return formatWithArgumentRanges(self._s[3657]!, self._r[3657]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3649]! } - public var Appearance_ReduceMotion: String { return self._s[3650]! } + public var Map_OpenInHereMaps: String { return self._s[3658]! } + public var Appearance_ReduceMotion: String { return self._s[3659]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3660]!, self._r[3660]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3652]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3653]! } - public var PhotoEditor_Skip: String { return self._s[3654]! } - public func SharedMedia_Photo(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[3661]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3662]! } + public var PhotoEditor_Skip: String { return self._s[3663]! } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_Exceptions(_ value: Int32) -> String { + public func Call_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Hours(_ value: Int32) -> String { + public func MuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, _1, _2) + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ForwardedPhotos(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + public func SharedMedia_Generic(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Minutes(_ value: Int32) -> String { + public func ForwardedPhotos(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortMinutes(_ value: Int32) -> String { + public func ForwardedFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedGifs(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { + public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _1, _2) + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) @@ -4315,114 +4329,112 @@ public final class PresentationStrings { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, _1, _2) + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { + public func Invitation_Members(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAMinutes(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { + public func ForwardedMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, _1, _2) } - public func SharedMedia_Video(_ value: Int32) -> String { + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + public func Media_SharePhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_SelectedMessages(_ value: Int32) -> String { + public func MessageTimer_Years(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) } - public func UserCount(_ value: Int32) -> String { + public func Call_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Media_ShareVideo(_ value: Int32) -> String { + public func StickerPack_StickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func ChatList_SelectedChats(_ value: Int32) -> String { + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedContacts(_ value: Int32) -> String { + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) @@ -4432,272 +4444,269 @@ public final class PresentationStrings { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedFiles(_ value: Int32) -> String { + public func ForwardedAudios(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func Passport_Scans(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPolls(_ value: Int32) -> String { + public func SharedMedia_File(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func MuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + public func LastSeen_HoursAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideos(_ value: Int32) -> String { + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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 { + public func MessageTimer_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func Watch_UserInfo_Mute(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notification_GameScoreExtended(_ value: Int32) -> String { + public func UserCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Hours(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func Conversation_SelectedMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, _1, _2) } public func Call_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) } public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _1, _2) } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) } public func AttachmentMenu_SendGif(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedPolls(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Generic(_ value: Int32) -> String { + public func MessagePoll_VotedCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, _1, _2) } public func MessageTimer_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _0, _1) } public func Map_ETAHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _0, _1) + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _1, _2) + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Years(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, _1, _2) + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Days(_ value: Int32) -> String { + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Days(_ value: Int32) -> String { + public func SharedMedia_Video(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift index b96fe4d53c..23bca296aa 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift @@ -140,12 +140,14 @@ public final class PresentationThemeRootController { public let tabBar: PresentationThemeRootTabBar public let navigationBar: PresentationThemeRootNavigationBar public let navigationSearchBar: PresentationThemeNavigationSearchBar + public let keyboardColor: PresentationThemeKeyboardColor - public init(statusBarStyle: PresentationThemeStatusBarStyle, tabBar: PresentationThemeRootTabBar, navigationBar: PresentationThemeRootNavigationBar, navigationSearchBar: PresentationThemeNavigationSearchBar) { + public init(statusBarStyle: PresentationThemeStatusBarStyle, tabBar: PresentationThemeRootTabBar, navigationBar: PresentationThemeRootNavigationBar, navigationSearchBar: PresentationThemeNavigationSearchBar, keyboardColor: PresentationThemeKeyboardColor) { self.statusBarStyle = statusBarStyle self.tabBar = tabBar self.navigationBar = navigationBar self.navigationSearchBar = navigationSearchBar + self.keyboardColor = keyboardColor } } @@ -397,7 +399,6 @@ public final class PresentationThemeChatList { public let regularSearchBarColor: UIColor public let sectionHeaderFillColor: UIColor public let sectionHeaderTextColor: UIColor - public let searchBarKeyboardColor: PresentationThemeKeyboardColor public let verifiedIconFillColor: UIColor public let verifiedIconForegroundColor: UIColor public let secretIconColor: UIColor @@ -405,7 +406,7 @@ public final class PresentationThemeChatList { public let unpinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors public let onlineDotColor: UIColor - init(backgroundColor: UIColor, itemSeparatorColor: UIColor, itemBackgroundColor: UIColor, pinnedItemBackgroundColor: UIColor, itemHighlightedBackgroundColor: UIColor, itemSelectedBackgroundColor: UIColor, titleColor: UIColor, secretTitleColor: UIColor, dateTextColor: UIColor, authorNameColor: UIColor, messageTextColor: UIColor, messageDraftTextColor: UIColor, checkmarkColor: UIColor, pendingIndicatorColor: UIColor, failedFillColor: UIColor, failedForegroundColor: UIColor, muteIconColor: UIColor, unreadBadgeActiveBackgroundColor: UIColor, unreadBadgeActiveTextColor: UIColor, unreadBadgeInactiveBackgroundColor: UIColor, unreadBadgeInactiveTextColor: UIColor, pinnedBadgeColor: UIColor, pinnedSearchBarColor: UIColor, regularSearchBarColor: UIColor, sectionHeaderFillColor: UIColor, sectionHeaderTextColor: UIColor, searchBarKeyboardColor: PresentationThemeKeyboardColor, verifiedIconFillColor: UIColor, verifiedIconForegroundColor: UIColor, secretIconColor: UIColor, pinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors, unpinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors, onlineDotColor: UIColor) { + init(backgroundColor: UIColor, itemSeparatorColor: UIColor, itemBackgroundColor: UIColor, pinnedItemBackgroundColor: UIColor, itemHighlightedBackgroundColor: UIColor, itemSelectedBackgroundColor: UIColor, titleColor: UIColor, secretTitleColor: UIColor, dateTextColor: UIColor, authorNameColor: UIColor, messageTextColor: UIColor, messageDraftTextColor: UIColor, checkmarkColor: UIColor, pendingIndicatorColor: UIColor, failedFillColor: UIColor, failedForegroundColor: UIColor, muteIconColor: UIColor, unreadBadgeActiveBackgroundColor: UIColor, unreadBadgeActiveTextColor: UIColor, unreadBadgeInactiveBackgroundColor: UIColor, unreadBadgeInactiveTextColor: UIColor, pinnedBadgeColor: UIColor, pinnedSearchBarColor: UIColor, regularSearchBarColor: UIColor, sectionHeaderFillColor: UIColor, sectionHeaderTextColor: UIColor, verifiedIconFillColor: UIColor, verifiedIconForegroundColor: UIColor, secretIconColor: UIColor, pinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors, unpinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors, onlineDotColor: UIColor) { self.backgroundColor = backgroundColor self.itemSeparatorColor = itemSeparatorColor self.itemBackgroundColor = itemBackgroundColor @@ -432,7 +433,6 @@ public final class PresentationThemeChatList { self.regularSearchBarColor = regularSearchBarColor self.sectionHeaderFillColor = sectionHeaderFillColor self.sectionHeaderTextColor = sectionHeaderTextColor - self.searchBarKeyboardColor = searchBarKeyboardColor self.verifiedIconFillColor = verifiedIconFillColor self.verifiedIconForegroundColor = verifiedIconForegroundColor self.secretIconColor = secretIconColor @@ -715,10 +715,9 @@ public final class PresentationThemeChatInputPanel { public let primaryTextColor: UIColor public let secondaryTextColor: UIColor public let mediaRecordingDotColor: UIColor - public let keyboardColor: PresentationThemeKeyboardColor public let mediaRecordingControl: PresentationThemeChatInputPanelMediaRecordingControl - public init(panelBackgroundColor: UIColor, panelSeparatorColor: UIColor, panelControlAccentColor: UIColor, panelControlColor: UIColor, panelControlDisabledColor: UIColor, panelControlDestructiveColor: UIColor, inputBackgroundColor: UIColor, inputStrokeColor: UIColor, inputPlaceholderColor: UIColor, inputTextColor: UIColor, inputControlColor: UIColor, actionControlFillColor: UIColor, actionControlForegroundColor: UIColor, primaryTextColor: UIColor, secondaryTextColor: UIColor, mediaRecordingDotColor: UIColor, keyboardColor: PresentationThemeKeyboardColor, mediaRecordingControl: PresentationThemeChatInputPanelMediaRecordingControl) { + public init(panelBackgroundColor: UIColor, panelSeparatorColor: UIColor, panelControlAccentColor: UIColor, panelControlColor: UIColor, panelControlDisabledColor: UIColor, panelControlDestructiveColor: UIColor, inputBackgroundColor: UIColor, inputStrokeColor: UIColor, inputPlaceholderColor: UIColor, inputTextColor: UIColor, inputControlColor: UIColor, actionControlFillColor: UIColor, actionControlForegroundColor: UIColor, primaryTextColor: UIColor, secondaryTextColor: UIColor, mediaRecordingDotColor: UIColor, mediaRecordingControl: PresentationThemeChatInputPanelMediaRecordingControl) { self.panelBackgroundColor = panelBackgroundColor self.panelSeparatorColor = panelSeparatorColor self.panelControlAccentColor = panelControlAccentColor @@ -735,7 +734,6 @@ public final class PresentationThemeChatInputPanel { self.primaryTextColor = primaryTextColor self.secondaryTextColor = secondaryTextColor self.mediaRecordingDotColor = mediaRecordingDotColor - self.keyboardColor = keyboardColor self.mediaRecordingControl = mediaRecordingControl } } @@ -822,6 +820,10 @@ public final class PresentationThemeChat { self.inputButtonPanel = inputButtonPanel self.historyNavigation = historyNavigation } + + public func withUpdatedDefaultWallpaper(_ defaultWallpaper: TelegramWallpaper?) -> PresentationThemeChat { + return PresentationThemeChat(defaultWallpaper: defaultWallpaper ?? self.defaultWallpaper, message: self.message, serviceMessage: self.serviceMessage, inputPanel: self.inputPanel, inputMediaPanel: self.inputMediaPanel, inputButtonPanel: self.inputButtonPanel, historyNavigation: self.historyNavigation) + } } public enum PresentationThemeExpandedNotificationBackgroundType: Int32 { @@ -974,4 +976,21 @@ public final class PresentationTheme: Equatable { public static func ==(lhs: PresentationTheme, rhs: PresentationTheme) -> Bool { return lhs === rhs } + + public func withUpdated(name: String?, author: String?, defaultWallpaper: TelegramWallpaper?) -> PresentationTheme { + var defaultWallpaper = defaultWallpaper + if let wallpaper = defaultWallpaper { + switch wallpaper { + case .image: + defaultWallpaper = nil + case let .file(file): + if file.isPattern { + defaultWallpaper = nil + } + default: + break + } + } + return PresentationTheme(name: name.flatMap(PresentationThemeName.custom) ?? .custom(self.name.string), author: author ?? self.author, referenceTheme: self.referenceTheme, overallDarkAppearance: self.overallDarkAppearance, baseColor: nil, intro: self.intro, passcode: self.passcode, rootController: self.rootController, list: self.list, chatList: self.chatList, chat: self.chat.withUpdatedDefaultWallpaper(defaultWallpaper), actionSheet: self.actionSheet, contextMenu: self.contextMenu, inAppNotification: self.inAppNotification) + } } diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index 264e2e1890..72d7f9c305 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -1,5 +1,6 @@ import Foundation import UIKit +import Postbox import TelegramCore import TelegramUIPreferences @@ -35,7 +36,7 @@ extension TelegramWallpaper: Codable { if let color = UIColor(hexString: value) { self = .color(Int32(bitPattern: color.rgb)) } else { - throw PresentationThemeDecodingError.generic + self = .file(id: 0, accessHash: 0, isCreator: false, isDefault: false, isPattern: false, isDark: false, slug: value, file: TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "", size: nil, attributes: []), settings: WallpaperSettings(blur: false, motion: false, color: nil, intensity: nil)) } } } else { @@ -50,6 +51,8 @@ extension TelegramWallpaper: Codable { try container.encode("builtin") case let .color(value): try container.encode(String(format: "%06x", value)) + case let .file(file): + try container.encode(file.slug) default: break } @@ -354,6 +357,7 @@ extension PresentationThemeRootController: Codable { case tabBar case navBar case searchBar + case keyboard } public convenience init(from decoder: Decoder) throws { @@ -361,7 +365,8 @@ extension PresentationThemeRootController: Codable { self.init(statusBarStyle: try values.decode(PresentationThemeStatusBarStyle.self, forKey: .statusBar), tabBar: try values.decode(PresentationThemeRootTabBar.self, forKey: .tabBar), navigationBar: try values.decode(PresentationThemeRootNavigationBar.self, forKey: .navBar), - navigationSearchBar: try values.decode(PresentationThemeNavigationSearchBar.self, forKey: .searchBar)) + navigationSearchBar: try values.decode(PresentationThemeNavigationSearchBar.self, forKey: .searchBar), + keyboardColor: try values.decode(PresentationThemeKeyboardColor.self, forKey: .keyboard)) } public func encode(to encoder: Encoder) throws { @@ -370,6 +375,7 @@ extension PresentationThemeRootController: Codable { try values.encode(self.tabBar, forKey: .tabBar) try values.encode(self.navigationBar, forKey: .navBar) try values.encode(self.navigationSearchBar, forKey: .searchBar) + try values.encode(self.keyboardColor, forKey: .keyboard) } } @@ -721,7 +727,6 @@ extension PresentationThemeChatList: Codable { case regularSearchBar case sectionHeaderBg case sectionHeaderText - case searchBarKeyboard case verifiedIconBg case verifiedIconFg case secretIcon @@ -758,7 +763,6 @@ extension PresentationThemeChatList: Codable { regularSearchBarColor: try decodeColor(values, .regularSearchBar), sectionHeaderFillColor: try decodeColor(values, .sectionHeaderBg), sectionHeaderTextColor: try decodeColor(values, .sectionHeaderText), - searchBarKeyboardColor: try values.decode(PresentationThemeKeyboardColor.self, forKey: .searchBarKeyboard), verifiedIconFillColor: try decodeColor(values, .verifiedIconBg), verifiedIconForegroundColor: try decodeColor(values, .verifiedIconFg), secretIconColor: try decodeColor(values, .secretIcon), @@ -795,7 +799,6 @@ extension PresentationThemeChatList: Codable { try encodeColor(&values, self.regularSearchBarColor, .regularSearchBar) try encodeColor(&values, self.sectionHeaderFillColor, .sectionHeaderBg) try encodeColor(&values, self.sectionHeaderTextColor, .sectionHeaderText) - try values.encode(self.searchBarKeyboardColor, forKey: .searchBarKeyboard) try encodeColor(&values, self.verifiedIconFillColor, .verifiedIconBg) try encodeColor(&values, self.verifiedIconForegroundColor, .verifiedIconFg) try encodeColor(&values, self.secretIconColor, .secretIcon) @@ -1143,7 +1146,6 @@ extension PresentationThemeChatInputPanel: Codable { case primaryText case secondaryText case mediaRecordDot - case keyboard case mediaRecordControl } @@ -1165,7 +1167,6 @@ extension PresentationThemeChatInputPanel: Codable { primaryTextColor: try decodeColor(values, .primaryText), secondaryTextColor: try decodeColor(values, .secondaryText), mediaRecordingDotColor: try decodeColor(values, .mediaRecordDot), - keyboardColor: try values.decode(PresentationThemeKeyboardColor.self, forKey: .keyboard), mediaRecordingControl: try values.decode(PresentationThemeChatInputPanelMediaRecordingControl.self, forKey: .mediaRecordControl)) } @@ -1187,7 +1188,6 @@ extension PresentationThemeChatInputPanel: Codable { try encodeColor(&values, self.primaryTextColor, .primaryText) try encodeColor(&values, self.secondaryTextColor, .secondaryText) try encodeColor(&values, self.mediaRecordingDotColor, .mediaRecordDot) - try values.encode(self.keyboardColor, forKey: .keyboard) try values.encode(self.mediaRecordingControl, forKey: .mediaRecordControl) } } @@ -1313,7 +1313,15 @@ extension PresentationThemeChat: Codable { public convenience init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) - self.init(defaultWallpaper: try values.decode(TelegramWallpaper.self, forKey: .defaultWallpaper), + + var wallpaper = try values.decode(TelegramWallpaper.self, forKey: .defaultWallpaper) + if let decoder = decoder as? PresentationThemeDecoding { + if case .file = wallpaper, let resolvedWallpaper = decoder.resolvedWallpaper { + wallpaper = resolvedWallpaper + } + } + + self.init(defaultWallpaper: wallpaper, message: try values.decode(PresentationThemeChatMessage.self, forKey: .message), serviceMessage: try values.decode(PresentationThemeServiceMessage.self, forKey: .serviceMessage), inputPanel: try values.decode(PresentationThemeChatInputPanel.self, forKey: .inputPanel), diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCoder.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCoder.swift index 5627dc92aa..57858bea95 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCoder.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCoder.swift @@ -1,4 +1,5 @@ import Foundation +import TelegramCore public func encodePresentationTheme(_ theme: PresentationTheme) -> String? { let encoding = PresentationThemeEncoding() @@ -321,7 +322,7 @@ private class PresentationThemeDecodingLevel { } } -public func makePresentationTheme(data: Data) -> PresentationTheme? { +public func makePresentationTheme(data: Data, resolvedWallpaper: TelegramWallpaper? = nil) -> PresentationTheme? { guard let string = String(data: data, encoding: .utf8) else { return nil } @@ -378,6 +379,7 @@ public func makePresentationTheme(data: Data) -> PresentationTheme? { } let decoder = PresentationThemeDecoding(referencing: topLevel.data) + decoder.resolvedWallpaper = resolvedWallpaper if let value = try? decoder.unbox(topLevel.data, as: PresentationTheme.self) { return value } @@ -392,10 +394,11 @@ class PresentationThemeDecoding: Decoder { public var userInfo: [CodingUserInfoKey : Any] { return [:] } - + var referenceTheme: PresentationTheme? var serviceBackgroundColor: UIColor? - + var resolvedWallpaper: TelegramWallpaper? + private var _referenceCoding: PresentationThemeEncoding? fileprivate var referenceCoding: PresentationThemeEncoding? { if let referenceCoding = self._referenceCoding { diff --git a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift index d49cf27972..1525646fc4 100644 --- a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -136,7 +136,7 @@ final class AuthorizedApplicationContext { self.notificationController = NotificationContainerController(context: context) self.mainWindow.previewThemeAccentColor = presentationData.theme.rootController.navigationBar.accentTextColor - self.mainWindow.previewThemeDarkBlur = presentationData.theme.chatList.searchBarKeyboardColor == .dark + self.mainWindow.previewThemeDarkBlur = presentationData.theme.rootController.keyboardColor == .dark self.mainWindow.setupVolumeControlStatusBarGraphics(presentationData.volumeControlStatusBarIcons.images) self.rootController = TelegramRootController(context: context) @@ -740,7 +740,7 @@ final class AuthorizedApplicationContext { if let strongSelf = self { if previousTheme.swap(presentationData.theme) !== presentationData.theme { strongSelf.mainWindow.previewThemeAccentColor = presentationData.theme.rootController.navigationBar.accentTextColor - strongSelf.mainWindow.previewThemeDarkBlur = presentationData.theme.chatList.searchBarKeyboardColor == .dark + strongSelf.mainWindow.previewThemeDarkBlur = presentationData.theme.rootController.keyboardColor == .dark strongSelf.lockedCoveringView.updateTheme(presentationData.theme) strongSelf.rootController.updateTheme(NavigationControllerTheme(presentationTheme: presentationData.theme)) } diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift index 4bcfcf0b83..562e8e05ea 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift @@ -120,7 +120,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF #endif self.codeField.textField.returnKeyType = .done self.codeField.textField.textColor = self.theme.list.itemPrimaryTextColor - self.codeField.textField.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.codeField.textField.keyboardAppearance = self.theme.rootController.keyboardColor.keyboardAppearance self.codeField.textField.disableAutomaticKeyboardHandling = [.forward, .backward] self.codeField.textField.tintColor = self.theme.list.itemAccentColor diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift index db8d6c3575..1eaa5b1108 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift @@ -70,7 +70,7 @@ final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UIT self.codeField.textField.textAlignment = .natural self.codeField.textField.isSecureTextEntry = true self.codeField.textField.returnKeyType = .done - self.codeField.textField.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.codeField.textField.keyboardAppearance = self.theme.rootController.keyboardColor.keyboardAppearance self.codeField.textField.disableAutomaticKeyboardHandling = [.forward, .backward] self.codeField.textField.tintColor = self.theme.list.itemAccentColor diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift index 6c1d2baef2..d415d63811 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift @@ -58,7 +58,7 @@ final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode, self.codeField.textField.textAlignment = .center self.codeField.textField.attributedPlaceholder = NSAttributedString(string: self.strings.TwoStepAuth_RecoveryCode, font: Font.regular(20.0), textColor: self.theme.list.itemPlaceholderTextColor) self.codeField.textField.returnKeyType = .done - self.codeField.textField.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.codeField.textField.keyboardAppearance = self.theme.rootController.keyboardColor.keyboardAppearance self.codeField.textField.disableAutomaticKeyboardHandling = [.forward, .backward] self.codeField.textField.tintColor = self.theme.list.itemAccentColor diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift index e8b4efef12..060c75354b 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift @@ -103,8 +103,8 @@ private final class PhoneAndCountryNode: ASDisplayNode { self.addSubnode(self.countryButton) self.addSubnode(self.phoneInputNode) - self.phoneInputNode.countryCodeField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance - self.phoneInputNode.numberField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.phoneInputNode.countryCodeField.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance + self.phoneInputNode.numberField.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.phoneInputNode.countryCodeField.textField.textColor = theme.list.itemPrimaryTextColor self.phoneInputNode.numberField.textField.textColor = theme.list.itemPrimaryTextColor self.phoneInputNode.countryCodeField.textField.tintColor = theme.list.itemAccentColor diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift index 4b30dbbc48..e004a71736 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift @@ -108,7 +108,7 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.firstNameField.textField.textContentType = .givenName } - self.firstNameField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.firstNameField.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.firstNameField.textField.tintColor = theme.list.itemAccentColor self.lastNameField = TextFieldNode() @@ -122,7 +122,7 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.lastNameField.textField.textContentType = .familyName } - self.lastNameField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.lastNameField.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.lastNameField.textField.tintColor = theme.list.itemAccentColor self.currentPhotoNode = ASImageNode() diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 8f72e512e1..60fd538c79 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -2769,7 +2769,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } self.chatDisplayNode.updateTypingActivity = { [weak self] value in - if let strongSelf = self, strongSelf.presentationInterfaceState.interfaceState.editMessage == nil { + if let strongSelf = self, strongSelf.presentationInterfaceState.interfaceState.editMessage == nil && !strongSelf.presentationInterfaceState.isScheduledMessages { if value { strongSelf.typingActivityPromise.set(Signal.single(true) |> then( @@ -5155,7 +5155,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G ActionSheetButtonItem(title: self.presentationData.strings.Conversation_FileICloudDrive, action: { [weak self, weak actionSheet] in actionSheet?.dismissAnimated() if let strongSelf = self { - strongSelf.present(legacyICloudFileController(theme: strongSelf.presentationData.theme, completion: { urls in + strongSelf.present(legacyICloudFilePicker(theme: strongSelf.presentationData.theme, completion: { urls in if let strongSelf = self, !urls.isEmpty { var signals: [Signal] = [] for url in urls { diff --git a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift index c56387dcf1..f92433fc40 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSendMessageActionSheetControllerNode.swift @@ -186,7 +186,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, self.effectView = UIVisualEffectView() if #available(iOS 9.0, *) { } else { - if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + if self.presentationData.theme.rootController.keyboardColor == .dark { self.effectView.effect = UIBlurEffect(style: .dark) } else { self.effectView.effect = UIBlurEffect(style: .light) @@ -310,7 +310,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, if #available(iOS 9.0, *) { } else { - if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark { + if self.presentationData.theme.rootController.keyboardColor == .dark { self.effectView.effect = UIBlurEffect(style: .dark) } else { self.effectView.effect = UIBlurEffect(style: .light) diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift index dafb21b260..3554b31467 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift @@ -502,7 +502,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { textColor = presentationInterfaceState.theme.chat.inputPanel.inputTextColor tintColor = presentationInterfaceState.theme.list.itemAccentColor baseFontSize = max(17.0, presentationInterfaceState.fontSize.baseDisplaySize) - keyboardAppearance = presentationInterfaceState.theme.chat.inputPanel.keyboardColor.keyboardAppearance + keyboardAppearance = presentationInterfaceState.theme.rootController.keyboardColor.keyboardAppearance } let paragraphStyle = NSMutableParagraphStyle() @@ -691,7 +691,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } } - let keyboardAppearance = interfaceState.theme.chat.inputPanel.keyboardColor.keyboardAppearance + let keyboardAppearance = interfaceState.theme.rootController.keyboardColor.keyboardAppearance if let textInputNode = self.textInputNode, textInputNode.keyboardAppearance != keyboardAppearance, textInputNode.isFirstResponder() { if textInputNode.isCurrentlyEmoji() { textInputNode.initialPrimaryLanguage = "emoji" diff --git a/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift b/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift index bfa4f44305..246d4da496 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift @@ -52,7 +52,7 @@ private final class ChatTextLinkEditInputFieldNode: ASDisplayNode, ASEditableTex self.textInputNode.clipsToBounds = true self.textInputNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) self.textInputNode.textContainerInset = UIEdgeInsets(top: self.inputInsets.top, left: 0.0, bottom: self.inputInsets.bottom, right: 0.0) - self.textInputNode.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textInputNode.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.textInputNode.keyboardType = .URL self.textInputNode.autocapitalizationType = .none self.textInputNode.returnKeyType = .done @@ -77,7 +77,7 @@ private final class ChatTextLinkEditInputFieldNode: ASDisplayNode, ASEditableTex self.theme = theme self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 33.0, color: self.theme.actionSheet.inputHollowBackgroundColor, strokeColor: self.theme.actionSheet.inputBorderColor, strokeWidth: 1.0) - self.textInputNode.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textInputNode.keyboardAppearance = self.theme.rootController.keyboardColor.keyboardAppearance self.placeholderNode.attributedText = NSAttributedString(string: self.placeholderNode.attributedText?.string ?? "", font: Font.regular(17.0), textColor: self.theme.actionSheet.inputPlaceholderColor) self.textInputNode.tintColor = self.theme.actionSheet.controlAccentColor } diff --git a/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift index 5fdbbca17e..067c0970f3 100644 --- a/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift @@ -67,7 +67,7 @@ final class ContactMultiselectionControllerNode: ASDisplayNode { } self.contactListNode = ContactListNode(context: context, presentation: .single(.natural(options: options, includeChatList: includeChatList)), filters: filters, selectionState: ContactListNodeGroupSelectionState()) - self.tokenListNode = EditableTokenListNode(theme: EditableTokenListNodeTheme(backgroundColor: self.presentationData.theme.rootController.navigationBar.backgroundColor, separatorColor: self.presentationData.theme.rootController.navigationBar.separatorColor, placeholderTextColor: self.presentationData.theme.list.itemPlaceholderTextColor, primaryTextColor: self.presentationData.theme.list.itemPrimaryTextColor, selectedTextColor: self.presentationData.theme.list.itemAccentColor, accentColor: self.presentationData.theme.list.itemAccentColor, keyboardColor: self.presentationData.theme.chatList.searchBarKeyboardColor), placeholder: placeholder) + self.tokenListNode = EditableTokenListNode(theme: EditableTokenListNodeTheme(backgroundColor: self.presentationData.theme.rootController.navigationBar.backgroundColor, separatorColor: self.presentationData.theme.rootController.navigationBar.separatorColor, placeholderTextColor: self.presentationData.theme.list.itemPlaceholderTextColor, primaryTextColor: self.presentationData.theme.list.itemPrimaryTextColor, selectedTextColor: self.presentationData.theme.list.itemAccentColor, accentColor: self.presentationData.theme.list.itemAccentColor, keyboardColor: self.presentationData.theme.rootController.keyboardColor), placeholder: placeholder) super.init() diff --git a/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift b/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift index 24942576cf..b4890cd0ff 100644 --- a/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift +++ b/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift @@ -263,7 +263,7 @@ class PaneSearchBarNode: ASDisplayNode, UITextFieldDelegate { self.iconNode.image = generateLoupeIcon(color: theme.chat.inputMediaPanel.stickersSearchControlColor) self.clearButton.setImage(generateClearIcon(color: theme.chat.inputMediaPanel.stickersSearchControlColor), for: []) self.cancelButton.setAttributedTitle(NSAttributedString(string: strings.Common_Cancel, font: Font.regular(17.0), textColor: theme.chat.inputPanel.panelControlAccentColor), for: []) - self.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance + self.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance self.textField.tintColor = theme.list.itemAccentColor if let (boundingSize, leftInset, rightInset) = self.validLayout { diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 5ed689871f2365f750a00d08d9c7f384022922d0..ee904ae65551385fcada3a422a58c9ff1153bcef 100644 GIT binary patch delta 31725 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 diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index c40d14356e..ad63274493 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -62,7 +62,6 @@ 09FFBCD72281BB2D00C33B4B /* ChatTextLinkEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FFBCD62281BB2D00C33B4B /* ChatTextLinkEditController.swift */; }; D000CABC21F158AD0011B15D /* PrepareSecretThumbnailData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D000CABB21F158AD0011B15D /* PrepareSecretThumbnailData.swift */; }; D0068FA821760FA300D1B315 /* StoreDownloadedMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0068FA721760FA300D1B315 /* StoreDownloadedMedia.swift */; }; - D007019C2029E8F2006B9E34 /* LegacyICloudFileController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D007019B2029E8F2006B9E34 /* LegacyICloudFileController.swift */; }; D007019E2029EFDD006B9E34 /* ICloudResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D007019D2029EFDD006B9E34 /* ICloudResources.swift */; }; D008178222B47464008A895F /* NotificationContentContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D008178122B47464008A895F /* NotificationContentContext.swift */; }; D00817D022B47A14008A895F /* WakeupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B622B47A12008A895F /* WakeupManager.swift */; }; @@ -634,7 +633,6 @@ D002A0DA1E9C190700A81812 /* SoftwareVideoThumbnailLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SoftwareVideoThumbnailLayer.swift; sourceTree = ""; }; D002A0DC1E9CD52A00A81812 /* ChatMediaInputRecentGifsItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputRecentGifsItem.swift; sourceTree = ""; }; D0068FA721760FA300D1B315 /* StoreDownloadedMedia.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreDownloadedMedia.swift; sourceTree = ""; }; - D007019B2029E8F2006B9E34 /* LegacyICloudFileController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyICloudFileController.swift; sourceTree = ""; }; D007019D2029EFDD006B9E34 /* ICloudResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ICloudResources.swift; sourceTree = ""; }; D008178122B47464008A895F /* NotificationContentContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationContentContext.swift; sourceTree = ""; }; D00817B622B47A12008A895F /* WakeupManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WakeupManager.swift; sourceTree = ""; }; @@ -1740,7 +1738,6 @@ children = ( D00E15251DDBD4E700ACF65C /* LegacyCamera.swift */, D06BB8811F58994B0084FC30 /* LegacyInstantVideoController.swift */, - D007019B2029E8F2006B9E34 /* LegacyICloudFileController.swift */, D0380DAC204ED434000414AB /* LegacyLiveUploadInterface.swift */, D0B21B1E22156D92003F741D /* LegacyCache.swift */, ); @@ -3064,7 +3061,6 @@ 090B48C82200BCA8005083FA /* WallpaperUploadManager.swift in Sources */, 09F2158D225CF5BC00AEDF6D /* Pasteboard.swift in Sources */, D0C26D571FDF2388004ABF18 /* OpenChatMessage.swift in Sources */, - D007019C2029E8F2006B9E34 /* LegacyICloudFileController.swift in Sources */, D000CABC21F158AD0011B15D /* PrepareSecretThumbnailData.swift in Sources */, D08BDF641FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift in Sources */, D0943B071FDEC529001522CC /* InstantVideoRadialStatusNode.swift in Sources */, diff --git a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index 8f51a0fccb..1832a1b0ad 100644 --- a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -56,10 +56,42 @@ public struct PresentationLocalTheme: PostboxCoding, Equatable { } } +public struct PresentationCloudTheme: PostboxCoding, Equatable { + public let theme: TelegramTheme + public let resolvedWallpaper: TelegramWallpaper? + + public init(theme: TelegramTheme, resolvedWallpaper: TelegramWallpaper?) { + self.theme = theme + self.resolvedWallpaper = resolvedWallpaper + } + + public init(decoder: PostboxDecoder) { + self.theme = decoder.decodeObjectForKey("theme", decoder: { TelegramTheme(decoder: $0) }) as! TelegramTheme + self.resolvedWallpaper = decoder.decodeObjectForKey("wallpaper", decoder: { TelegramWallpaper(decoder: $0) }) as? TelegramWallpaper + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeObject(self.theme, forKey: "theme") + if let resolvedWallpaper = self.resolvedWallpaper { + encoder.encodeObject(resolvedWallpaper, forKey: "wallpaper") + } + } + + public static func ==(lhs: PresentationCloudTheme, rhs: PresentationCloudTheme) -> Bool { + if lhs.theme != rhs.theme { + return false + } + if lhs.resolvedWallpaper != rhs.resolvedWallpaper { + return false + } + return true + } +} + public enum PresentationThemeReference: PostboxCoding, Equatable { case builtin(PresentationBuiltinThemeReference) case local(PresentationLocalTheme) - case cloud(TelegramTheme) + case cloud(PresentationCloudTheme) public init(decoder: PostboxDecoder) { switch decoder.decodeInt32ForKey("v", orElse: 0) { @@ -68,7 +100,7 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { case 1: self = .local(decoder.decodeObjectForKey("localTheme", decoder: { PresentationLocalTheme(decoder: $0) }) as! PresentationLocalTheme) case 2: - self = .cloud(decoder.decodeObjectForKey("theme", decoder: { TelegramTheme(decoder: $0) }) as! TelegramTheme) + self = .cloud(decoder.decodeObjectForKey("cloudTheme", decoder: { PresentationCloudTheme(decoder: $0) }) as! PresentationCloudTheme) default: assertionFailure() self = .builtin(.dayClassic) @@ -85,7 +117,7 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { encoder.encodeObject(theme, forKey: "localTheme") case let .cloud(theme): encoder.encodeInt32(2, forKey: "v") - encoder.encodeObject(theme, forKey: "theme") + encoder.encodeObject(theme, forKey: "cloudTheme") } } @@ -135,7 +167,7 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { id = themeId(for: theme.resource.fileId) case let .cloud(theme): namespace = 2 - id = themeId(for: theme.id) + id = themeId(for: theme.theme.id) } return (Int64(namespace) << 32) | Int64(bitPattern: UInt64(UInt32(bitPattern: id))) @@ -379,9 +411,12 @@ public struct PresentationThemeSettings: PreferencesEntry { case let .local(theme): resources.append(theme.resource.id) case let .cloud(theme): - if let file = theme.file { + if let file = theme.theme.file { resources.append(file.resource.id) } + if let chatWallpaper = theme.resolvedWallpaper { + resources.append(contentsOf: wallpaperResources(chatWallpaper)) + } } return resources } From a706852dfc2fc8b2afed8482601552149a7ca5b8 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 29 Aug 2019 13:17:35 +0300 Subject: [PATCH 62/86] Cloud themes improvements --- .../Sources/Themes/EditThemeController.swift | 111 +++++++++++++----- .../Themes/ThemeSettingsController.swift | 63 ++++++---- .../Themes/ThemeSettingsThemeItem.swift | 33 +++++- .../AccountStateManagementUtils.swift | 12 +- .../TelegramCore/TelegramCore/Themes.swift | 96 ++++++++++++--- .../CreateThemeIcon.imageset/Contents.json | 12 ++ .../ic_iphonetheme.pdf | Bin 0 -> 5768 bytes .../TelegramUI/ChatMediaInputGifPane.swift | 2 +- .../ChatMessageAnimatedStickerItemNode.swift | 2 +- .../ChatMessageBubbleItemNode.swift | 2 +- .../ChatMessageInstantVideoItemNode.swift | 11 +- .../ChatMessageStickerItemNode.swift | 2 +- .../Sources/PostboxKeys.swift | 2 + .../Sources/WallpaperResources.swift | 19 ++- 14 files changed, 279 insertions(+), 88 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Settings/CreateThemeIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Settings/CreateThemeIcon.imageset/ic_iphonetheme.pdf diff --git a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift index 2988aeb84e..c64e0483a4 100644 --- a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift @@ -239,9 +239,9 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll statePromise.set(stateValue.modify { f($0) }) } - var pushControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)? var dismissImpl: (() -> Void)? + var dismissInputImpl: (() -> Void)? let arguments = EditThemeControllerArguments(context: context, updateState: { f in updateState(f) @@ -285,6 +285,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll } rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: isComplete, action: { + dismissInputImpl?() arguments.updateState { current in var state = current state.updating = true @@ -326,52 +327,106 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll } let themeResource: LocalFileMediaResource? - - if let theme = theme, let themeString = encodePresentationTheme(theme), let themeData = themeString.data(using: .utf8) { + let themeData: Data? + if let theme = theme, let themeString = encodePresentationTheme(theme), let data = themeString.data(using: .utf8) { let resource = LocalFileMediaResource(fileId: arc4random64()) - context.account.postbox.mediaBox.storeResourceData(resource.id, data: themeData) - context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: themeData) + context.account.postbox.mediaBox.storeResourceData(resource.id, data: data) + context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) themeResource = resource + themeData = data } else { themeResource = nil + themeData = nil } switch mode { case .create: if let themeResource = themeResource { let _ = (createTheme(account: context.account, resource: themeResource, title: state.title) - |> deliverOnMainQueue).start(error: { error in + |> deliverOnMainQueue).start(next: { next in + if case let .result(resultTheme) = next { + let _ = applyTheme(accountManager: context.sharedContext.accountManager, account: context.account, theme: resultTheme).start() + let _ = (context.sharedContext.accountManager.transaction { transaction -> Void in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in + let current: PresentationThemeSettings + if let entry = entry as? PresentationThemeSettings { + current = entry + } else { + current = PresentationThemeSettings.defaultSettings + } + + if let resource = resultTheme.file?.resource, let data = themeData { + context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) + } + + let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: nil)) + var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers + if let theme = theme { + themeSpecificChatWallpapers[themeReference.index] = theme.chat.defaultWallpaper + } + + return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + }) + } |> deliverOnMainQueue).start(completed: { + if !custom { + saveThemeTemplateFile(state.title, themeResource, { + dismissImpl?() + }) + } else { + dismissImpl?() + } + }) + } + }, error: { error in arguments.updateState { current in var state = current state.updating = false return state } - }, completed: { - if !custom { - saveThemeTemplateFile(state.title, themeResource, { - dismissImpl?() - }) - } else { - dismissImpl?() - } }) } - case let .edit(theme): - let _ = (updateTheme(account: context.account, theme: theme.theme, title: state.title, slug: state.slug, resource: themeResource) - |> deliverOnMainQueue).start(error: { error in + case let .edit(info): + let _ = (updateTheme(account: context.account, theme: info.theme, title: state.title, slug: state.slug, resource: themeResource) + |> deliverOnMainQueue).start(next: { next in + if case let .result(resultTheme) = next { + let _ = applyTheme(accountManager: context.sharedContext.accountManager, account: context.account, theme: resultTheme).start() + let _ = (context.sharedContext.accountManager.transaction { transaction -> Void in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in + let current: PresentationThemeSettings + if let entry = entry as? PresentationThemeSettings { + current = entry + } else { + current = PresentationThemeSettings.defaultSettings + } + + if let resource = resultTheme.file?.resource, let data = themeData { + context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) + } + + let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: nil)) + var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers + if let theme = theme { + themeSpecificChatWallpapers[themeReference.index] = theme.chat.defaultWallpaper + } + + return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + }) + } |> deliverOnMainQueue).start(completed: { + if let themeResource = themeResource, !custom { + saveThemeTemplateFile(state.title, themeResource, { + dismissImpl?() + }) + } else { + dismissImpl?() + } + }) + } + }, error: { error in arguments.updateState { current in var state = current state.updating = false return state } - }, completed: { - if let themeResource = themeResource, !custom { - saveThemeTemplateFile(state.title, themeResource, { - dismissImpl?() - }) - } else { - dismissImpl?() - } }) } }) @@ -395,9 +450,6 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll } let controller = ItemListController(context: context, state: signal) - pushControllerImpl = { [weak controller] c in - (controller?.navigationController as? NavigationController)?.pushViewController(c) - } presentControllerImpl = { [weak controller] c, a in controller?.present(c, in: .window(.root), with: a) } @@ -405,5 +457,8 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll controller?.view.endEditing(true) let _ = controller?.dismiss() } + dismissInputImpl = { [weak controller] in + controller?.view.endEditing(true) + } return controller } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index f55e8585ea..2e54688f2e 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -45,8 +45,9 @@ private final class ThemeSettingsControllerArguments { let disableAnimations: (Bool) -> Void let selectAppIcon: (String) -> Void let presentThemeMenu: (PresentationThemeReference, Bool) -> Void + let editTheme: (PresentationCloudTheme) -> Void - init(context: AccountContext, selectTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void, presentThemeMenu: @escaping (PresentationThemeReference, Bool) -> Void) { + init(context: AccountContext, selectTheme: @escaping (PresentationThemeReference) -> Void, selectFontSize: @escaping (PresentationFontSize) -> Void, openWallpaperSettings: @escaping () -> Void, selectAccentColor: @escaping (PresentationThemeAccentColor) -> Void, openAccentColorPicker: @escaping (PresentationThemeReference, PresentationThemeAccentColor?) -> Void, openAutoNightTheme: @escaping () -> Void, toggleLargeEmoji: @escaping (Bool) -> Void, disableAnimations: @escaping (Bool) -> Void, selectAppIcon: @escaping (String) -> Void, presentThemeMenu: @escaping (PresentationThemeReference, Bool) -> Void, editTheme: @escaping (PresentationCloudTheme) -> Void) { self.context = context self.selectTheme = selectTheme self.selectFontSize = selectFontSize @@ -58,6 +59,7 @@ private final class ThemeSettingsControllerArguments { self.disableAnimations = disableAnimations self.selectAppIcon = selectAppIcon self.presentThemeMenu = presentThemeMenu + self.editTheme = editTheme } } @@ -289,7 +291,13 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .themeItem(theme, strings, themes, currentTheme, themeSpecificAccentColors, currentColor): return ThemeSettingsThemeItem(context: arguments.context, theme: theme, strings: strings, sectionId: self.section, themes: themes, themeSpecificAccentColors: themeSpecificAccentColors, currentTheme: currentTheme, updatedTheme: { theme in - arguments.selectTheme(theme) + if case let .cloud(theme) = theme, theme.theme.file == nil { + if theme.theme.isCreator { + arguments.editTheme(theme) + } + } else { + arguments.selectTheme(theme) + } }, longTapped: { theme in arguments.presentThemeMenu(theme, theme == currentTheme) }) @@ -485,24 +493,32 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_RemoveTheme, color: .destructive, action: { [weak actionSheet] in actionSheet?.dismissAnimated() -// let _ = (cloudThemes.get() -// |> take(1) -// |> deliverOnMainQueue).start(next: { themes in -// if isCurrent, let themeIndex = themes.firstIndex(where: { $0.id == theme.id }) { -// let newTheme: PresentationThemeReference -// if themeIndex > 0 { -// newTheme = .cloud(themes[themeIndex - 1]) -// } else { -// newTheme = .builtin(.nightAccent) -// } -// selectThemeImpl?(newTheme) -// } -// -// let updatedThemes = themes.filter { $0.id != theme.id } -// cloudThemes.set(.single(updatedThemes) |> then(updatedCloudThemes)) -// -// let _ = (deleteTheme(account: context.account, theme: theme)).start() -// }) + let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) + var items: [ActionSheetItem] = [] + items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_RemoveThemeConfirmation, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + let _ = (cloudThemes.get() |> delay(0.5, queue: Queue.mainQueue()) + |> take(1) + |> deliverOnMainQueue).start(next: { themes in + if isCurrent, let themeIndex = themes.firstIndex(where: { $0.id == theme.theme.id }) { + let newTheme: PresentationThemeReference + if themeIndex > 0 { + newTheme = .cloud(PresentationCloudTheme(theme: themes[themeIndex - 1], resolvedWallpaper: nil)) + } else { + newTheme = .builtin(.nightAccent) + } + selectThemeImpl?(newTheme) + } + + let _ = deleteThemeInteractively(account: context.account, theme: theme.theme).start() + }) + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + presentControllerImpl?(actionSheet, nil) })) actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in @@ -510,6 +526,13 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The }) ])]) presentControllerImpl?(actionSheet, nil) + }, editTheme: { theme in + let controller = editThemeController(context: context, mode: .edit(theme), navigateToChat: { peerId in + if let navigationController = getNavigationControllerImpl?() { + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId))) + } + }) + presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) }) let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]), cloudThemes.get(), availableAppIcons, currentAppIconName.get(), statePromise.get()) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift index 65533a9805..72f6822ef4 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift @@ -41,6 +41,31 @@ private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selec })?.stretchableImage(withLeftCapWidth: 15, topCapHeight: 15) } +private func createThemeImage(theme: PresentationTheme) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + return .single(theme) + |> map { theme -> (TransformImageArguments) -> DrawingContext? in + return { arguments in + let context = DrawingContext(size: arguments.drawingSize, scale: arguments.scale ?? 0.0, clear: arguments.emptyColor == nil) + let drawingRect = arguments.drawingRect + + context.withContext { c in + c.setFillColor(theme.list.itemBlocksBackgroundColor.cgColor) + c.fill(drawingRect) + + c.translateBy(x: drawingRect.width / 2.0, y: drawingRect.height / 2.0) + c.scaleBy(x: 1.0, y: -1.0) + c.translateBy(x: -drawingRect.width / 2.0, y: -drawingRect.height / 2.0) + + if let icon = generateTintedImage(image: UIImage(bundleImageName: "Settings/CreateThemeIcon"), color: theme.list.itemAccentColor) { + c.draw(icon.cgImage!, in: CGRect(origin: CGPoint(x: floor((drawingRect.width - icon.size.width) / 2.0) - 3.0, y: floor((drawingRect.height - icon.size.height) / 2.0)), size: icon.size)) + } + } + + return context + } + } +} + private func themeIconImage(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { let signal: Signal<(UIColor, UIColor, UIColor), NoError> if case let .builtin(theme) = theme { @@ -202,7 +227,11 @@ private final class ThemeSettingsThemeItemIconNode : ASDisplayNode { } func setup(context: AccountContext, theme: PresentationThemeReference, accentColor: UIColor?, currentTheme: PresentationTheme, title: NSAttributedString, bordered: Bool, selected: Bool, action: @escaping () -> Void, longTapAction: @escaping () -> Void) { - self.imageNode.setSignal(themeIconImage(context: context, theme: theme, accentColor: accentColor)) + if case let .cloud(theme) = theme, theme.theme.file == nil { + self.imageNode.setSignal(createThemeImage(theme: currentTheme)) + } else { + self.imageNode.setSignal(themeIconImage(context: context, theme: theme, accentColor: accentColor)) + } self.textNode.attributedText = title self.overlayNode.image = generateBorderImage(theme: currentTheme, bordered: bordered, selected: selected) self.action = { @@ -395,7 +424,7 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { self?.scrollToNode(imageNode, animated: true) } }, longTapAction: { - item.longTapped(theme) + item.longTapped(theme) }) imageNode.frame = CGRect(origin: CGPoint(x: nodeOffset, y: 0.0), size: nodeSize) diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index 2ea2c3afa4..ed73718a1b 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -2939,8 +2939,8 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } if !updatedThemes.isEmpty { - let items = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) - let themes = items.map { entry -> TelegramTheme in + let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) + let themes = entries.map { entry -> TelegramTheme in let theme = entry.contents as! TelegramTheme if let updatedTheme = updatedThemes[theme.id] { return updatedTheme @@ -2948,13 +2948,13 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP return theme } } - var entries: [OrderedItemListEntry] = [] + var updatedEntries: [OrderedItemListEntry] = [] for theme in themes { - var intValue = Int32(entries.count) + var intValue = Int32(updatedEntries.count) let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) - entries.append(OrderedItemListEntry(id: id, contents: theme)) + updatedEntries.append(OrderedItemListEntry(id: id, contents: theme)) } - transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: entries) + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) } addedIncomingMessageIds.append(contentsOf: addedSecretMessageIds) diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index 057dbbfd07..87139785d5 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -62,7 +62,16 @@ public func telegramThemes(postbox: Postbox, network: Network, forceUpdate: Bool transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedThemesConfiguration, key: ValueBoxKey(length: 0)), entry: CachedThemesConfiguration(hash: hash), collectionSpec: ItemCacheCollectionSpec(lowWaterItemCount: 1, highWaterItemCount: 1)) return items } - } + } |> then( + postbox.combinedView(keys: [PostboxViewKey.orderedItemList(id: Namespaces.OrderedItemList.CloudThemes)]) + |> map { view -> [TelegramTheme] in + if let view = view.views[.orderedItemList(id: Namespaces.OrderedItemList.CloudThemes)] as? OrderedItemListView { + return view.items.compactMap { $0.contents as? TelegramTheme } + } else { + return [] + } + } + ) } if forceUpdate { @@ -122,22 +131,35 @@ public func checkThemeUpdated(account: Account, theme: TelegramTheme) -> Signal< } } -public func saveTheme(account: Account, theme: TelegramTheme) -> Signal { - return saveUnsaveTheme(account: account, theme: theme, unsave: false) -} - -public func deleteTheme(account: Account, theme: TelegramTheme) -> Signal { - return saveUnsaveTheme(account: account, theme: theme, unsave: true) -} - private func saveUnsaveTheme(account: Account, theme: TelegramTheme, unsave: Bool) -> Signal { - return account.network.request(Api.functions.account.saveTheme(theme: Api.InputTheme.inputTheme(id: theme.id, accessHash: theme.accessHash), unsave: unsave ? Api.Bool.boolTrue : Api.Bool.boolFalse)) - |> `catch` { _ -> Signal in - return .complete() - } - |> mapToSignal { _ -> Signal in - return .single(Void()) - } + return account.postbox.transaction { transaction -> Signal in + let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) + var items = entries.map { $0.contents as! TelegramTheme } + if unsave { + items = items.filter { $0.id != theme.id } + } else { + items.insert(theme, at: 0) + } + var updatedEntries: [OrderedItemListEntry] = [] + for item in items { + var intValue = Int32(updatedEntries.count) + let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) + updatedEntries.append(OrderedItemListEntry(id: id, contents: item)) + } + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) + + return account.network.request(Api.functions.account.saveTheme(theme: Api.InputTheme.inputTheme(id: theme.id, accessHash: theme.accessHash), unsave: unsave ? Api.Bool.boolTrue : Api.Bool.boolFalse)) + |> `catch` { _ -> Signal in + return .complete() + } + |> mapToSignal { _ -> Signal in + return telegramThemes(postbox: account.postbox, network: account.network, forceUpdate: true) + |> take(1) + |> mapToSignal { _ -> Signal in + return .complete() + } + } + } |> switchToLatest } private func installTheme(account: Account, theme: TelegramTheme) -> Signal { @@ -234,7 +256,16 @@ public func createTheme(account: Account, resource: MediaResource, title: String |> mapToSignal { apiTheme -> Signal in if let theme = TelegramTheme(apiTheme: apiTheme) { return account.postbox.transaction { transaction -> CreateThemeResult in - + let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) + var items = entries.map { $0.contents as! TelegramTheme } + items.insert(theme, at: 0) + var updatedEntries: [OrderedItemListEntry] = [] + for item in items { + var intValue = Int32(updatedEntries.count) + let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) + updatedEntries.append(OrderedItemListEntry(id: id, contents: item)) + } + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) return .result(theme) } |> introduceError(CreateThemeError.self) @@ -295,8 +326,27 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, return account.network.request(Api.functions.account.updateTheme(flags: flags, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: inputDocument)) |> mapError { _ in return CreateThemeError.generic } |> mapToSignal { apiTheme -> Signal in - if let theme = TelegramTheme(apiTheme: apiTheme) { - return .single(.result(theme)) + if let result = TelegramTheme(apiTheme: apiTheme) { + return account.postbox.transaction { transaction -> CreateThemeResult in + let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) + let items = entries.map { entry -> TelegramTheme in + let theme = entry.contents as! TelegramTheme + if theme.id == result.id { + return result + } else { + return theme + } + } + var updatedEntries: [OrderedItemListEntry] = [] + for item in items { + var intValue = Int32(updatedEntries.count) + let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) + updatedEntries.append(OrderedItemListEntry(id: id, contents: item)) + } + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) + return .result(result) + } + |> introduceError(CreateThemeError.self) } else { return .fail(.generic) } @@ -336,6 +386,14 @@ public final class ThemeSettings: PreferencesEntry, Equatable { } } +public func saveThemeInteractively(account: Account, theme: TelegramTheme) -> Signal { + return saveUnsaveTheme(account: account, theme: theme, unsave: false) +} + +public func deleteThemeInteractively(account: Account, theme: TelegramTheme) -> Signal { + return saveUnsaveTheme(account: account, theme: theme, unsave: true) +} + public func applyTheme(accountManager: AccountManager, account: Account, theme: TelegramTheme?) -> Signal { return accountManager.transaction { transaction -> Signal in transaction.updateSharedData(SharedDataKeys.themeSettings, { _ in diff --git a/submodules/TelegramUI/Images.xcassets/Settings/CreateThemeIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/CreateThemeIcon.imageset/Contents.json new file mode 100644 index 0000000000..ec9f317445 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Settings/CreateThemeIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_iphonetheme.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Settings/CreateThemeIcon.imageset/ic_iphonetheme.pdf b/submodules/TelegramUI/Images.xcassets/Settings/CreateThemeIcon.imageset/ic_iphonetheme.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1ea5be507ed8c17825c2f9ea1d38b60cb84697c8 GIT binary patch literal 5768 zcmai&cT`hZ*TzGU5|E;F5Uxl7m68MkMCqY}bZOE8gbqPKs#Gb`q*tX0(whQOgLG6J z1JXr6nsgCFI`Rc){AOm&AMagv<(@p}$zD6>?3MiXfoLlz3BrU#z>x06?Zvg??|B2= zyf9svwZ08mad|zHaJ=vM<+}M1@j|n$_cyixY^RY?s&YQf!@^EKXLETCIy^jQK! z&e1M{mvcfZQ)-rWFY`nN{cPNEig-T3UY-4(gkvLFf3j_q_Y;aEPOQho`AOPr5o^Lp z<3eXctv|_tauadXdc<`B=y}7iM5w0R+lU53%W6ml{SVsfy3*Gkv$w6J(WF`u>C>tM z^hM>bJgRZW*ShFP_KDO==<7p&D;+sq2Y-+6S0^L0Qya!S zTKeUFekCR{?vXQ-)VgiDe`R+q7_POMKSwY@d(Q9<@BneC}A{6zOkT{>R1~wy{1$D9fUf z)>|s$oG_XFZB!_ouY6aDm~ngks`p~ml>T$&XR<$Z4P9W=0l|F!JdX}ri;(GE3o9gx znc9|Db$mEfDWr&~aL5`_$+YWU8`Asq2lGLN5p!nGkl!v|UAd9|T6bl*8IL=S){UDl0r4j~xp(JIG!sr33drHysq#fJD-SGJ%zZt@U~C;`W=>L?#{e z$($l16Exs!gTf$TgGeLUx4m9FQxaW;MS$3vHfOace=w8( zC{K??O(h)!s+uM*2k6z4M}3C0jyd;@riEm%<}ma_2ji_<#cQYmIY0Duf0cgj!Iq00 zOkWKf>CFml$Ph&8hwS&oA>%;dVR6<3C#;0Q>>Pq=+McE%zbvm~-IO-wE-uNHla~k5 ztWbL!Eje%=sVs28%;6Cm4{6A!R666=V=oQmQBUx- z4tePp%*D{LjiP>MGz^QKkYfydSj-xWY9<#Bl}uqIXH4Pc=(H({2JwVMXu3wLP$O7k z%QYF3W&BeY;{SGUoMJ_SufP;S-+1H2vMrWSbrr^BOrf z^$hrkK@>aG^z7h7A({3X#5EH`*tH+%*o0oVze~}+2$1@rSNNDmjrt)U=%a3c8tZ@) zrOXBwjT3+O%PX62qB|7wwWEgFH;0Z>*dCjk4j|WH!+hF8(Y135l_mW5&-ac)nCrZS z^pJi6!P9Bo@g8Pl9;S*d<-PoF*En_W;=xpwg_54E_UhTHzWf1qS6mJ7;y27)M)==byBxb7qV`G7rje%6k$p8>dZDr7D zM|QMEq7Mz72a=XoqwTrCa($n8K!S#y7t)wwJ?$t3`AfWfCm&C}NClYVBN%Dkg1&cj z3HCB?M~8{1$y(`$mbR4za}C%FFvOb($_JN`>d@b^s}S;)S7~zm!#`6AvYH*RQl=li1gSr+A(9c{1&rzz{>aYRNVONk zW2EP!>uU=_$}ot5?-Y2yMYg|IvK`k8!KHz>Pbzl9#2jvslw&U!!6Py)EcxAbHVmQm z1|#}MLv~|DQFIUTtb;$qNa%2}k#3*!IlXau^K!?*=D`uy4CVIG#Olmm{C9Dg`Jdy5 zeq{cjIb)IIPir%)-thM6qoyZ61AZRJT&Ne71!G)o{`y-djLvA_3<1ubFeFm!Z1!vn z{|71P`?_HOVQsYCuUB`Bt0y4xCpG9|Jh1oNtuY>e*q;Il>*`6E_W;gFL-&jz{)%@t z|C>Ct-Lcks7*F61A*g~9UhVo3ZW#$WV;{N)nX zBqSs(cSbO-1bhL66);{7))-x7`Tq?z*=gSTdJ{~Mc$_$H-~u-Q*Q#6I49=8K`Lu$2zPs9axA@ETmNyycybJkk#_w5MMRQ_Xw5PKmvjwrF`KB3=&vpg( z$uT&6)hy8B9{Wf%R+DHsPl*r5oAmP7`y0w9f(g6xl6A zlSZjp7157nI4mx|wmsac)jP0)T~Fz{HT%#<1HV&8{Rqk&T#ZdrB!U>bWZEZgRB~)= z7>|CjKX^4U!x^Y|BK6wu==K)xIzC4(Hph6zdA&jy#{}BtF?oEcwk`EGsLq8_L?4By@dQ{3tgR`}S1?axb(0>yg3DB4(M8 zE2@kl7{$e+;v#j0ckifa((yJYdvvGs?MR0|-gF5($!%xe3SYjhvz$U17G>WOE*WB! zAY=m$3mTaXViDsbXAR7DVz9qw0SX95YB#Eqzs5>|P*+HJTxI--1J>@)!N9NETJ0+n zt3Bf3em|EExu{H|U1v4qxb?p5Qpel4L!Jt-7R-b>cMxAlAot7zi-rh6i3Kdra|DaH zkxT=iuwWHBk~9(_6=DZj(id{l;~=mcY@EpJfukE}IK*#&R5Mh}jm(tPu>HIn6?L$( zEI6V=9ZEDE;y@AljgIlDTv-BBA#JAoC>^^Ag)d4@TY`b42Njh-mn3^Iz+1v{?Lk>S zN?U5@iYHq$h1r9{Jn{iRlq;AX9XX|C*;iSle21# zOwu$Boy@cB-#`N47M;lyvacyf29=B`*tZnq6O4F>=r21Zau*VpDrP0n6tXwPsU+TA zAR&v)M`y4w^|H=K8pqCB8K6h4)Sx37))@vG%wNQ8=|n;fLZ4ZUJTEfhtB~=c6r+C} zC)jOZ8E<)~CjB|dIC}ji2Tfl)>l}w$U?Ynu+!awp+CV!N+Y-Fib$*t2%cu3)G{a^n zZHLD7Flf9X2Y~fM_xy?&q=Qfp*apjrF=qFIvA9dWq^(*`|nc`bEeBVmhboy~k{ zo!rXY!dJ?#?gYJU9{@gD#>hSHD9Mk`e}&FL7tC5;DN8ILyjEaRaI;s!`sLl|E$R6? zyfsnTs!6JGZ*J+04^Qh`HskB?)J|XQc}2?+EqzaGJ{cQVD2?VJyCh%VFYtYQaGgpj z#waG6X^P20U_(Gpa7}>A_^Rn!~P--C0g%)&YGHj`P;F?~A6s)K``Y&Un4r z2)LPLRx`!aqS=DqrP<{^;yr?qOGWxb;%N59J-zr_!U9I<*Oq4+-*3gvlk@rWJs(mn zp2;?TfA#(O_XSkc%-@)Y1zFq&@6I-IxF-tP2*q0XxaAMuo=lxLSv!1pYb5FY%ZRG*N z`{)zm6R*Rm?_=MV4#$qPNF_)sD3`&7q)Ma)Dpt@UB;$MGwtsE1_q|W56^hUWy zaYXr+qQ7FgqI$ZKfN|}DQmjcVP$b2~#m?x@+OqAWd{>A_&tnmTQVN~)cBzi%kvoWz?iDm@x`>AGA8$}&O7=q zI}2G0uKkzZe1CHkh_FR?-?MA;`WbQDf%xh~QyD&5WjfiU>2220Jo}?#@`#cIXos_BAz1F z8JE=ieEx19_T=*ql>f!@6>X7%rhQV0%gC*{zJ0FE9BRo4-{^p{6~2?)-IoI<(I)w$ zpGKoz7K%CeYxvKs1P^6jdVfh!=JDzMo!H&XtlGDB>iER>j87gTbG-w%<$J@oVxpKM zZy0(?H`gtE$gZlXn(hxtuQuOmaxb049Ub3JFSn~gn%xY@4!~_hoWzZCw&bK)tOq)* z)Ni`rR@`b&(&j54wVexCIy5^Hp5AQ^SbTJv%}x?ScKB7O&HvQ=lhjJU^vNK3DXqE8 zJ3omN`xEQ+`KNqft!p`DGLOr+u*ExJC{<>0~ z(yDT$GCuYocFOPhPS3ag*z}?K@K;xVzT8V4EYA(}KEl~qz3KkuG`N;2qc&aAhCCeI zby>1mUKsLr*eoiJo-S{b*$p|#KeFEGOI%sk+Sf|Wjg#@dPkFrU!|P)EWo9qz`_X>^ z`iw$@a zxC13vM9=PDkbI9o-Y`H|-ND9#0MBQLPKfpoK!%;!{~Zy9_Cz~l?f%4fkH5J6Z!Cww z{`v&J3))&s4=}*EdpKZS0T@&WCMtvgO!?*SIXK$@FbO3%RK)ZupmPuH?&${*xcwLE z`*>dc{cT{sTLylG8*nHL36+3Lz$8S)U{Dh%l#g)#?fgfUgkHero;Bg*@mD50+0Ym@)0>lsq5d>fh{G}n_;)L$w>;hbW zYjD_E=znVnD4eiC|JI;T_tVAWC5@=gn4B85Vgd?p)rNRH(@@ElxcoItE*M<<59|nd% J6t$GV{|DoUBtZZG literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift index 4c2ded5aa6..3b4d31123e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift @@ -165,7 +165,7 @@ final class ChatMediaInputGifPane: ChatMediaInputPane, UIScrollViewDelegate { })) multiplexedNode.fileSelected = { [weak self] fileReference, sourceNode, sourceRect in - self?.controllerInteraction.sendGif(fileReference, sourceNode, sourceRect) + let _ = self?.controllerInteraction.sendGif(fileReference, sourceNode, sourceRect) } multiplexedNode.didScroll = { [weak self] offset, height in diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index dce649cccd..ff94def414 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -382,7 +382,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) var needShareButton = false - if isFailed { + if isFailed || Namespaces.Message.allScheduled.contains(item.message.id.namespace) { needShareButton = false } else if item.message.id.peerId == item.context.account.peerId { for attribute in item.content.firstMessage.attributes { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 0254aee299..c562bc373b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -699,7 +699,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) var needShareButton = false - if isFailed { + if isFailed || Namespaces.Message.allScheduled.contains(item.message.id.namespace) { needShareButton = false } else if item.message.id.peerId == item.context.account.peerId { if let _ = sourceReference { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift index b49d6a8ec8..e1e3ddaed8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift @@ -144,8 +144,13 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { avatarInset = 0.0 } + let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) + var needShareButton = false - if item.message.id.peerId == item.context.account.peerId { + if isFailed || Namespaces.Message.allScheduled.contains(item.message.id.namespace) { + needShareButton = false + } + else if item.message.id.peerId == item.context.account.peerId { for attribute in item.content.firstMessage.attributes { if let _ = attribute as? SourceReferenceMessageAttribute { needShareButton = true @@ -189,7 +194,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { } var deliveryFailedInset: CGFloat = 0.0 - if item.content.firstMessage.flags.contains(.Failed) { + if isFailed { deliveryFailedInset += 24.0 } @@ -474,7 +479,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { strongSelf.replyInfoNode = nil } - if item.content.firstMessage.flags.contains(.Failed) { + if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode var isAppearing = false if let current = strongSelf.deliveryFailedNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift index b24d2612e6..bcdcc68b89 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift @@ -184,7 +184,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) var needShareButton = false - if isFailed { + if isFailed || Namespaces.Message.allScheduled.contains(item.message.id.namespace) { needShareButton = false } else if item.message.id.peerId == item.context.account.peerId { for attribute in item.content.firstMessage.attributes { diff --git a/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift b/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift index eceae3dba9..1049722f83 100644 --- a/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift +++ b/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift @@ -53,11 +53,13 @@ public struct ApplicationSpecificSharedDataKeys { private enum ApplicationSpecificItemCacheCollectionIdValues: Int8 { case instantPageStoredState = 0 case cachedInstantPages = 1 + case resolvedWallpapers = 2 } public struct ApplicationSpecificItemCacheCollectionId { public static let instantPageStoredState = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.instantPageStoredState.rawValue) public static let cachedInstantPages = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.cachedInstantPages.rawValue) + public static let resolvedWallpapers = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.resolvedWallpapers.rawValue) } private enum ApplicationSpecificOrderedItemListCollectionIdValues: Int32 { diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index 99801b909c..3e2d4b639e 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -634,7 +634,6 @@ private func generateBackArrowImage(color: UIColor) -> UIImage? { } public func themeImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { - return telegramThemeData(account: account, accountManager: accountManager, resource: fileReference.media.resource, synchronousLoad: synchronousLoad) |> map { data in let theme: PresentationTheme? @@ -649,12 +648,20 @@ public func themeImage(account: Account, accountManager: AccountManager, fileRef context.withFlippedContext { c in c.setBlendMode(.normal) if let theme = theme { - if case let .color(value) = theme.chat.defaultWallpaper { - c.setFillColor(UIColor(rgb: UInt32(bitPattern: value)).cgColor) - } else { - c.setFillColor(theme.chatList.backgroundColor.cgColor) + switch theme.chat.defaultWallpaper { + case .builtin: + if let filePath = frameworkBundle.path(forResource: "ChatWallpaperBuiltin0", ofType: "jpg"), let image = UIImage(contentsOfFile: filePath), let cgImage = image.cgImage { + c.draw(cgImage, in: CGRect(x: 0.0, y: 0.0, width: drawingRect.width, height: drawingRect.height)) + } + case let .color(value): + c.setFillColor(UIColor(rgb: UInt32(bitPattern: value)).cgColor) + c.fill(drawingRect) + case let .file(file): + c.setFillColor(theme.chatList.backgroundColor.cgColor) + c.fill(drawingRect) + default: + break } - c.fill(drawingRect) c.setFillColor(theme.rootController.navigationBar.backgroundColor.cgColor) c.fill(CGRect(origin: CGPoint(x: 0.0, y: drawingRect.height - 42.0), size: CGSize(width: drawingRect.width, height: 42.0))) From 05dacf8fe4a5bf41319c363e5a9138fd34ed77a5 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 15:37:35 +0400 Subject: [PATCH 63/86] Context menu improvements --- .../ContextUI/Sources/ContextActionNode.swift | 23 ++++++ .../Sources/ContextActionsContainerNode.swift | 15 ++++ .../ContextUI/Sources/ContextController.swift | 76 +++++++++++++++---- .../GlobalOverlayPresentationContext.swift | 71 ++++++++++++++--- .../Display/Display/WindowContent.swift | 8 ++ .../TelegramCore/TelegramCore/Log.swift | 5 ++ .../PresentationThemeEssentialGraphics.swift | 2 +- .../TelegramUI/ChatController.swift | 2 + .../TelegramUI/ChatControllerNode.swift | 15 ++-- .../TelegramUI/ChatHistoryGridNode.swift | 2 +- .../TelegramUI/ChatHistoryListNode.swift | 7 +- .../ChatMessageBubbleItemNode.swift | 4 +- .../PreparedChatHistoryViewTransition.swift | 31 ++------ 13 files changed, 200 insertions(+), 61 deletions(-) diff --git a/submodules/ContextUI/Sources/ContextActionNode.swift b/submodules/ContextUI/Sources/ContextActionNode.swift index 46ca6f16b0..470101545a 100644 --- a/submodules/ContextUI/Sources/ContextActionNode.swift +++ b/submodules/ContextUI/Sources/ContextActionNode.swift @@ -149,6 +149,29 @@ final class ContextActionNode: ASDisplayNode { } } + func updateTheme(theme: PresentationTheme) { + self.backgroundNode.backgroundColor = theme.contextMenu.itemBackgroundColor + self.highlightedBackgroundNode.backgroundColor = theme.contextMenu.itemHighlightedBackgroundColor + + let textColor: UIColor + switch action.textColor { + case .primary: + textColor = theme.contextMenu.primaryColor + case .destructive: + textColor = theme.contextMenu.destructiveColor + } + self.textNode.attributedText = NSAttributedString(string: self.action.text, font: textFont, textColor: textColor) + + switch self.action.textLayout { + case let .secondLineWithValue(value): + self.statusNode?.attributedText = NSAttributedString(string: value, font: textFont, textColor: theme.contextMenu.secondaryColor) + default: + break + } + + self.iconNode.image = self.action.icon(theme) + } + @objc private func buttonPressed() { self.performAction() } diff --git a/submodules/ContextUI/Sources/ContextActionsContainerNode.swift b/submodules/ContextUI/Sources/ContextActionsContainerNode.swift index 81802db9f0..4aecca23d1 100644 --- a/submodules/ContextUI/Sources/ContextActionsContainerNode.swift +++ b/submodules/ContextUI/Sources/ContextActionsContainerNode.swift @@ -114,6 +114,21 @@ final class ContextActionsContainerNode: ASDisplayNode { return CGSize(width: maxWidth, height: verticalOffset) } + func updateTheme(theme: PresentationTheme) { + for itemNode in self.itemNodes { + switch itemNode { + case let .action(action): + action.updateTheme(theme: theme) + case let .separator(separator): + separator.backgroundColor = theme.contextMenu.sectionSeparatorColor + case let .itemSeparator(itemSeparator): + itemSeparator.backgroundColor = theme.contextMenu.itemSeparatorColor + } + } + + self.backgroundColor = theme.contextMenu.backgroundColor + } + func actionNode(at point: CGPoint) -> ContextActionNode? { for itemNode in self.itemNodes { switch itemNode { diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 8caa10449c..ce1ba04b65 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -47,6 +47,16 @@ public enum ContextMenuItem { case separator } +private func convertFrame(_ frame: CGRect, from fromView: UIView, to toView: UIView) -> CGRect { + let sourceWindowFrame = fromView.convert(frame, to: nil) + var targetWindowFrame = toView.convert(sourceWindowFrame, from: nil) + + if let fromWindow = fromView.window, let toWindow = toView.window { + targetWindowFrame.origin.x += toWindow.bounds.width - fromWindow.bounds.width + } + return targetWindowFrame +} + private final class ContextControllerNode: ViewControllerTracingNode, UIScrollViewDelegate { private var theme: PresentationTheme private var strings: PresentationStrings @@ -61,6 +71,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi private var propertyAnimator: AnyObject? private var displayLinkAnimator: DisplayLinkAnimator? private let dimNode: ASDisplayNode + private let dismissNode: ASDisplayNode private let clippingNode: ASDisplayNode private let scrollNode: ASScrollNode @@ -106,6 +117,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi self.dimNode.backgroundColor = theme.contextMenu.dimColor self.dimNode.alpha = 0.0 + self.dismissNode = ASDisplayNode() + self.clippingNode = ASDisplayNode() self.clippingNode.clipsToBounds = true @@ -143,6 +156,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi self.addSubnode(self.clippingNode) self.clippingNode.addSubnode(self.scrollNode) + self.scrollNode.addSubnode(self.dismissNode) self.scrollNode.addSubnode(self.actionsContainerNode) self.scrollNode.addSubnode(self.contentContainerNode) @@ -261,7 +275,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi override func didLoad() { super.didLoad() - self.dimNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dimNodeTapped))) + self.dismissNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dimNodeTapped))) } @objc private func dimNodeTapped() { @@ -283,7 +297,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if strongSelf.isAnimatingOut { return } - strongSelf.originalProjectedContentViewFrame = (parentSupernode.view.convert(contentParentNode.frame, to: strongSelf.view), contentParentNode.view.convert(contentParentNode.contentRect, to: strongSelf.view)) + strongSelf.originalProjectedContentViewFrame = (convertFrame(contentParentNode.frame, from: parentSupernode.view, to: strongSelf.view), convertFrame(contentParentNode.contentRect, from: contentParentNode.view, to: strongSelf.view)) if let validLayout = strongSelf.validLayout { strongSelf.updateLayout(layout: validLayout, transition: .animated(duration: 0.2 * animationDurationFactor, curve: .easeInOut), previousActionsContainerNode: nil) } @@ -309,15 +323,20 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } } self.contentContainerNode.contentNode = takenViewInfo.contentContainingNode.contentNode + self.contentAreaInScreenSpace = takenViewInfo.contentAreaInScreenSpace self.contentContainerNode.addSubnode(takenViewInfo.contentContainingNode.contentNode) takenViewInfo.contentContainingNode.isExtractedToContextPreview = true takenViewInfo.contentContainingNode.isExtractedToContextPreviewUpdated?(true) - self.originalProjectedContentViewFrame = (parentSupernode.view.convert(takenViewInfo.contentContainingNode.frame, to: self.view), takenViewInfo.contentContainingNode.view.convert(takenViewInfo.contentContainingNode.contentRect, to: self.view)) + self.originalProjectedContentViewFrame = (convertFrame(takenViewInfo.contentContainingNode.frame, from: parentSupernode.view, to: self.view), convertFrame(takenViewInfo.contentContainingNode.contentRect, from: takenViewInfo.contentContainingNode.view, to: self.view)) - self.clippingNode.layer.animateFrame(from: takenViewInfo.contentAreaInScreenSpace, to: self.clippingNode.frame, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) - self.clippingNode.layer.animateBoundsOriginYAdditive(from: takenViewInfo.contentAreaInScreenSpace.minY, to: 0.0, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + var updatedContentAreaInScreenSpace = takenViewInfo.contentAreaInScreenSpace + updatedContentAreaInScreenSpace.origin.x = 0.0 + updatedContentAreaInScreenSpace.size.width = self.bounds.width + + self.clippingNode.layer.animateFrame(from: updatedContentAreaInScreenSpace, to: self.clippingNode.frame, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + self.clippingNode.layer.animateBoundsOriginYAdditive(from: updatedContentAreaInScreenSpace.minY, to: 0.0, duration: 0.18 * animationDurationFactor, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) } if let validLayout = self.validLayout { @@ -366,16 +385,23 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } self.actionsContainerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true) - let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y - contentParentNode.contentRect.minY) + let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y) self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, additive: true) contentParentNode.applyAbsoluteOffsetSpring?(-contentContainerOffset.y, springDuration, springDamping) } } - func animateOut(result: ContextMenuActionResult, completion: @escaping () -> Void) { + func animateOut(result initialResult: ContextMenuActionResult, completion: @escaping () -> Void) { var transitionDuration: Double = 0.2 var transitionCurve: ContainedViewLayoutTransitionCurve = .easeInOut + var result = initialResult + let putBackInfo = self.source.putBack() + + if putBackInfo == nil { + result = .dismissWithoutContent + } + switch result { case let .custom(value): switch value { @@ -398,13 +424,15 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi var completedContentNode = false var completedActionsNode = false - let putBackInfo = self.source.putBack() - if let putBackInfo = putBackInfo, let contentParentNode = self.contentParentNode, let parentSupernode = contentParentNode.supernode { - self.originalProjectedContentViewFrame = (parentSupernode.view.convert(contentParentNode.frame, to: self.view), contentParentNode.view.convert(contentParentNode.contentRect, to: self.view)) + self.originalProjectedContentViewFrame = (convertFrame(contentParentNode.frame, from: parentSupernode.view, to: self.view), convertFrame(contentParentNode.contentRect, from: contentParentNode.view, to: self.view)) - self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: putBackInfo.contentAreaInScreenSpace, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) - self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: putBackInfo.contentAreaInScreenSpace.minY, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) + var updatedContentAreaInScreenSpace = putBackInfo.contentAreaInScreenSpace + updatedContentAreaInScreenSpace.origin.x = 0.0 + updatedContentAreaInScreenSpace.size.width = self.bounds.width + + self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: updatedContentAreaInScreenSpace, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) + self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: updatedContentAreaInScreenSpace.minY, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) } let contentParentNode = self.contentParentNode @@ -466,7 +494,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi completedActionsNode = true intermediateCompletion() }) - self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: 0.2 * animationDurationFactor, removeOnCompletion: false) + self.actionsContainerNode.layer.animateScale(from: 1.0, to: 0.1, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) let animateOutToItem: Bool switch result { @@ -564,6 +592,17 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } } + func updateTheme(theme: PresentationTheme) { + self.theme = theme + + self.dimNode.backgroundColor = theme.contextMenu.dimColor + self.actionsContainerNode.updateTheme(theme: theme) + + if let validLayout = self.validLayout { + self.updateLayout(layout: validLayout, transition: .immediate, previousActionsContainerNode: nil) + } + } + func updateLayout(layout: ContainerViewLayout, transition: ContainedViewLayoutTransition, previousActionsContainerNode: ContextActionsContainerNode?) { if self.isAnimatingOut { return @@ -657,6 +696,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi previousActionsContainerNode.removeFromSupernode() } } + + transition.updateFrame(node: self.dismissNode, frame: CGRect(origin: CGPoint(), size: scrollNode.view.contentSize)) } func scrollViewDidScroll(_ scrollView: UIScrollView) { @@ -690,7 +731,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } } - return self.dimNode.view + return self.dismissNode.view } } @@ -792,6 +833,13 @@ public final class ContextController: ViewController { } } + public func updateTheme(theme: PresentationTheme) { + self.theme = theme + if self.isNodeLoaded { + self.controllerNode.updateTheme(theme: theme) + } + } + private func dismiss(result: ContextMenuActionResult, completion: (() -> Void)?) { if !self.wasDismissed { self.wasDismissed = true diff --git a/submodules/Display/Display/GlobalOverlayPresentationContext.swift b/submodules/Display/Display/GlobalOverlayPresentationContext.swift index 1963e625f7..4794e0b8a8 100644 --- a/submodules/Display/Display/GlobalOverlayPresentationContext.swift +++ b/submodules/Display/Display/GlobalOverlayPresentationContext.swift @@ -23,6 +23,30 @@ private func isViewVisibleInHierarchy(_ view: UIView, _ initial: Bool = true) -> } } +private final class HierarchyTrackingNode: ASDisplayNode { + private let f: (Bool) -> Void + + init(_ f: @escaping (Bool) -> Void) { + self.f = f + + super.init() + + self.isLayerBacked = true + } + + override func didEnterHierarchy() { + super.didEnterHierarchy() + + self.f(true) + } + + override func didExitHierarchy() { + super.didExitHierarchy() + + self.f(false) + } +} + final class GlobalOverlayPresentationContext { private let statusBarHost: StatusBarHost? private weak var parentView: UIView? @@ -41,9 +65,34 @@ final class GlobalOverlayPresentationContext { self.parentView = parentView } + private var currentTrackingNode: HierarchyTrackingNode? + private func currentPresentationView(underStatusBar: Bool) -> UIView? { if let statusBarHost = self.statusBarHost { if let keyboardWindow = statusBarHost.keyboardWindow, let keyboardView = statusBarHost.keyboardView, !keyboardView.frame.height.isZero, isViewVisibleInHierarchy(keyboardView) { + var updateTrackingNode = false + if let trackingNode = self.currentTrackingNode { + if trackingNode.layer.superlayer !== keyboardView.layer { + updateTrackingNode = true + } + } else { + updateTrackingNode = true + } + + if updateTrackingNode { + self.currentTrackingNode?.removeFromSupernode() + let trackingNode = HierarchyTrackingNode({ [weak self] value in + guard let strongSelf = self else { + return + } + if !value { + strongSelf.addViews(justMove: true) + } + }) + + self.currentTrackingNode = trackingNode + keyboardView.layer.addSublayer(trackingNode.layer) + } return keyboardWindow } else { if underStatusBar, let view = self.parentView { @@ -69,8 +118,8 @@ final class GlobalOverlayPresentationContext { underStatusBar = true } } - if let _ = self.currentPresentationView(underStatusBar: underStatusBar), let initialLayout = self.layout { - controller.view.frame = CGRect(origin: CGPoint(), size: initialLayout.size) + if let presentationView = self.currentPresentationView(underStatusBar: underStatusBar), let initialLayout = self.layout { + controller.view.frame = CGRect(origin: CGPoint(x: presentationView.bounds.width - initialLayout.size.width, y: 0.0), size: initialLayout.size) controller.containerLayoutUpdated(initialLayout, transition: .immediate) self.presentationDisposables.add(controllerReady.start(next: { [weak self] _ in @@ -88,7 +137,7 @@ final class GlobalOverlayPresentationContext { }, rootController: nil) (controller as? UIViewController)?.setIgnoreAppearanceMethodInvocations(true) if layout != initialLayout { - controller.view.frame = CGRect(origin: CGPoint(), size: layout.size) + controller.view.frame = CGRect(origin: CGPoint(x: view.bounds.width - layout.size.width, y: 0.0), size: layout.size) view.addSubview(controller.view) controller.containerLayoutUpdated(layout, transition: .immediate) } else { @@ -134,13 +183,13 @@ final class GlobalOverlayPresentationContext { private func readyChanged(wasReady: Bool) { if !wasReady { - self.addViews() + self.addViews(justMove: false) } else { self.removeViews() } } - private func addViews() { + private func addViews(justMove: Bool) { if let layout = self.layout { for controller in self.controllers { var underStatusBar = false @@ -150,11 +199,15 @@ final class GlobalOverlayPresentationContext { } } if let view = self.currentPresentationView(underStatusBar: underStatusBar) { - controller.viewWillAppear(false) + if !justMove { + controller.viewWillAppear(false) + } view.addSubview(controller.view) - controller.view.frame = CGRect(origin: CGPoint(), size: layout.size) - controller.containerLayoutUpdated(layout, transition: .immediate) - controller.viewDidAppear(false) + if !justMove { + controller.view.frame = CGRect(origin: CGPoint(x: view.bounds.width - layout.size.width, y: 0.0), size: layout.size) + controller.containerLayoutUpdated(layout, transition: .immediate) + controller.viewDidAppear(false) + } } } } diff --git a/submodules/Display/Display/WindowContent.swift b/submodules/Display/Display/WindowContent.swift index 181fd6f4ca..25daaa5769 100644 --- a/submodules/Display/Display/WindowContent.swift +++ b/submodules/Display/Display/WindowContent.swift @@ -1054,6 +1054,14 @@ public class Window1 { } } + public func simulateKeyboardDismiss(transition: ContainedViewLayoutTransition) { + if self.windowLayout.inputHeight != nil { + self.updateLayout { + $0.update(upperKeyboardInputPositionBound: self.windowLayout.size.height, transition: transition, overrideTransition: false) + } + } + } + private func panGestureEnded(location: CGPoint, velocity: CGPoint?) { if self.keyboardGestureBeginLocation == nil { return diff --git a/submodules/TelegramCore/TelegramCore/Log.swift b/submodules/TelegramCore/TelegramCore/Log.swift index 97db36e7c1..7d9cf8a649 100644 --- a/submodules/TelegramCore/TelegramCore/Log.swift +++ b/submodules/TelegramCore/TelegramCore/Log.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac + import TelegramApiMac #else import SwiftSignalKit import Postbox + import TelegramApi #endif private let queue = DispatchQueue(label: "org.telegram.Telegram.trace", qos: .utility) @@ -64,6 +66,9 @@ public func registerLoggingFunctions() { } } }) + setTelegramApiLogger({ what in + Logger.shared.shortLog("Api", what as String) + }) } private var sharedLogger: Logger? diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift index a04952e884..5af2e366cc 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift @@ -173,7 +173,7 @@ public final class PrincipalThemeEssentialGraphics { } var outgoingGradientColors: (UIColor, UIColor)? - if let baseColor = presentationTheme.baseColor { + if false, let baseColor = presentationTheme.baseColor { if presentationTheme.baseColor == .custom { } else { diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index c786c8214d..419822ed41 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -2315,6 +2315,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G state = state.updatedChatWallpaper(self.presentationData.chatWallpaper) return state }) + + self.currentContextController?.updateTheme(theme: self.presentationData.theme) } override public func loadDisplayNode() { diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index a37570e606..f03d95b54e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -568,8 +568,9 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { var immediatelyLayoutInputNodeAndAnimateAppearance = false var inputNodeHeightAndOverflow: (CGFloat, CGFloat)? if let inputNode = inputNodeForChatPresentationIntefaceState(self.chatPresentationInterfaceState, context: self.context, currentNode: self.inputNode, interfaceInteraction: self.interfaceInteraction, inputMediaNode: self.inputMediaNode, controllerInteraction: self.controllerInteraction, inputPanelNode: self.inputPanelNode) { - if let inputTextPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { - inputTextPanelNode.ensureUnfocused() + if let _ = self.inputPanelNode as? ChatTextInputPanelNode { + self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) + //inputTextPanelNode.ensureUnfocused() } if let inputMediaNode = inputNode as? ChatMediaInputNode, self.inputMediaNode == nil { self.inputMediaNode = inputMediaNode @@ -645,7 +646,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { if let inputPanelNode = inputPanelForChatPresentationIntefaceState(self.chatPresentationInterfaceState, context: self.context, currentPanel: self.inputPanelNode, textInputPanelNode: self.textInputPanelNode, interfaceInteraction: self.interfaceInteraction), !previewing { if inputPanelNode !== self.inputPanelNode { if let inputTextPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { - inputTextPanelNode.ensureUnfocused() + self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) + //inputTextPanelNode.ensureUnfocused() let _ = inputTextPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, maxHeight: layout.size.height - insets.top - insets.bottom, transition: transition, interfaceState: self.chatPresentationInterfaceState, metrics: layout.metrics) } dismissedInputPanelNode = self.inputPanelNode @@ -1280,6 +1282,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } self.derivedLayoutState = ChatControllerNodeDerivedLayoutState(inputContextPanelsFrame: inputContextPanelsFrame, inputContextPanelsOverMainPanelFrame: inputContextPanelsOverMainPanelFrame, inputNodeHeight: inputNodeHeightAndOverflow?.0, upperInputPositionBound: inputNodeHeightAndOverflow?.0 != nil ? self.upperInputPositionBound : nil) + + //self.notifyTransitionCompletionListeners(transition: transition) } private func notifyTransitionCompletionListeners(transition: ContainedViewLayoutTransition) { @@ -1423,8 +1427,9 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { if self.chatPresentationInterfaceStateRequiresInputFocus(chatPresentationInterfaceState) { self.ensureInputViewFocused() } else { - if let inputTextPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { - inputTextPanelNode.ensureUnfocused() + if let _ = self.inputPanelNode as? ChatTextInputPanelNode { + self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) + //inputTextPanelNode.ensureUnfocused() } } } else { diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift index 51db01809d..5bf7b86f9c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift @@ -306,7 +306,7 @@ public final class ChatHistoryGridNode: GridNode, ChatHistoryNode { let processedView = ChatHistoryView(originalView: view, filteredEntries: chatHistoryEntriesForView(location: .peer(peerId), view: view, includeUnreadEntry: false, includeEmptyEntry: false, includeChatInfoEntry: false, includeSearchEntry: false, reverse: false, groupMessages: false, selectedMessages: nil, presentationData: chatPresentationData, historyAppearsCleared: false, associatedData: associatedData), associatedData: associatedData, id: id) let previous = previousView.swap(processedView) - let rawTransition = preparedChatHistoryViewTransition(from: previous, to: processedView, reason: reason, reverse: false, chatLocation: .peer(peerId), controllerInteraction: controllerInteraction, scrollPosition: scrollPosition, initialData: nil, keyboardButtonsMessage: nil, cachedData: nil, cachedDataMessages: nil, readStateData: nil, flashIndicators: flashIndicators) + let rawTransition = preparedChatHistoryViewTransition(from: previous, to: processedView, reason: reason, reverse: false, chatLocation: .peer(peerId), controllerInteraction: controllerInteraction, scrollPosition: scrollPosition, initialData: nil, keyboardButtonsMessage: nil, cachedData: nil, cachedDataMessages: nil, readStateData: nil, flashIndicators: flashIndicators, updatedMessageSelection: false) let mappedTransition = mappedChatHistoryViewListTransition(context: context, peerId: peerId, controllerInteraction: controllerInteraction, transition: rawTransition, from: previous, presentationData: chatPresentationData) return .single(mappedTransition) } diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index c69e4d0815..7d22680efb 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -538,7 +538,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { return (view, version) } - let previousView = Atomic<(ChatHistoryView, Int)?>(value: nil) + let previousView = Atomic<(ChatHistoryView, Int, Set?)?>(value: nil) let automaticDownloadNetworkType = context.account.networkType |> map { type -> MediaAutoDownloadNetworkType in switch type { @@ -647,8 +647,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { let associatedData = extractAssociatedData(chatLocation: chatLocation, view: view, automaticDownloadNetworkType: networkType, animatedEmojiStickers: animatedEmojiStickers, isScheduledMessages: isScheduledMessages) let processedView = ChatHistoryView(originalView: view, filteredEntries: chatHistoryEntriesForView(location: chatLocation, view: view, includeUnreadEntry: mode == .bubbles, includeEmptyEntry: mode == .bubbles && tagMask == nil, includeChatInfoEntry: mode == .bubbles, includeSearchEntry: includeSearchEntry && tagMask != nil, reverse: reverse, groupMessages: mode == .bubbles, selectedMessages: selectedMessages, presentationData: chatPresentationData, historyAppearsCleared: historyAppearsCleared, associatedData: associatedData), associatedData: associatedData, id: id) - let previousValueAndVersion = previousView.swap((processedView, update.1)) + let previousValueAndVersion = previousView.swap((processedView, update.1, selectedMessages)) let previous = previousValueAndVersion?.0 + let previousSelectedMessages = previousValueAndVersion?.2 if let previousVersion = previousValueAndVersion?.1 { if !GlobalExperimentalSettings.isAppStoreBuild { @@ -695,7 +696,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { } } } - let rawTransition = preparedChatHistoryViewTransition(from: previous, to: processedView, reason: reason, reverse: reverse, chatLocation: chatLocation, controllerInteraction: controllerInteraction, scrollPosition: updatedScrollPosition, initialData: initialData?.initialData, keyboardButtonsMessage: view.topTaggedMessages.first, cachedData: initialData?.cachedData, cachedDataMessages: initialData?.cachedDataMessages, readStateData: initialData?.readStateData, flashIndicators: flashIndicators) + let rawTransition = preparedChatHistoryViewTransition(from: previous, to: processedView, reason: reason, reverse: reverse, chatLocation: chatLocation, controllerInteraction: controllerInteraction, scrollPosition: updatedScrollPosition, initialData: initialData?.initialData, keyboardButtonsMessage: view.topTaggedMessages.first, cachedData: initialData?.cachedData, cachedDataMessages: initialData?.cachedDataMessages, readStateData: initialData?.readStateData, flashIndicators: flashIndicators, updatedMessageSelection: previousSelectedMessages != selectedMessages) let mappedTransition = mappedChatHistoryViewListTransition(context: context, chatLocation: chatLocation, associatedData: associatedData, controllerInteraction: controllerInteraction, mode: mode, transition: rawTransition) Queue.mainQueue().async { guard let strongSelf = self else { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 0254aee299..73704f4df0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -1890,7 +1890,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode strongSelf.backgroundWallpaperNode.updateFrame(backgroundFrame, transition: transition) } else { strongSelf.backgroundNode.frame = backgroundFrame - strongSelf.backgroundWallpaperNode.frame = backgroundFrame + strongSelf.backgroundWallpaperNode.frame = backgroundFrame//.insetBy(dx: 1.0, dy: 1.0) } if let (rect, size) = strongSelf.absoluteRect { strongSelf.updateAbsoluteRect(rect, within: size) @@ -2081,7 +2081,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode if let backgroundFrameTransition = self.backgroundFrameTransition { let backgroundFrame = CGRect.interpolator()(backgroundFrameTransition.0, backgroundFrameTransition.1, progress) as! CGRect self.backgroundNode.frame = backgroundFrame - self.backgroundWallpaperNode.frame = backgroundFrame + self.backgroundWallpaperNode.frame = backgroundFrame//.insetBy(dx: 1.0, dy: 1.0) if let type = self.backgroundNode.type { var incomingOffset: CGFloat = 0.0 diff --git a/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift b/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift index d3b7c1d8f8..e78538264f 100644 --- a/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift +++ b/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift @@ -5,7 +5,7 @@ import TelegramCore import Display import MergeLists -func preparedChatHistoryViewTransition(from fromView: ChatHistoryView?, to toView: ChatHistoryView, reason: ChatHistoryViewTransitionReason, reverse: Bool, chatLocation: ChatLocation, controllerInteraction: ChatControllerInteraction, scrollPosition: ChatHistoryViewScrollPosition?, initialData: InitialMessageHistoryData?, keyboardButtonsMessage: Message?, cachedData: CachedPeerData?, cachedDataMessages: [MessageId: Message]?, readStateData: [PeerId: ChatHistoryCombinedInitialReadStateData]?, flashIndicators: Bool) -> ChatHistoryViewTransition { +func preparedChatHistoryViewTransition(from fromView: ChatHistoryView?, to toView: ChatHistoryView, reason: ChatHistoryViewTransitionReason, reverse: Bool, chatLocation: ChatLocation, controllerInteraction: ChatControllerInteraction, scrollPosition: ChatHistoryViewScrollPosition?, initialData: InitialMessageHistoryData?, keyboardButtonsMessage: Message?, cachedData: CachedPeerData?, cachedDataMessages: [MessageId: Message]?, readStateData: [PeerId: ChatHistoryCombinedInitialReadStateData]?, flashIndicators: Bool, updatedMessageSelection: Bool) -> ChatHistoryViewTransition { let mergeResult: (deleteIndices: [Int], indicesAndItems: [(Int, ChatHistoryEntry, Int?)], updateIndices: [(Int, ChatHistoryEntry, Int)]) let allUpdated = fromView?.associatedData != toView.associatedData if reverse { @@ -58,31 +58,6 @@ func preparedChatHistoryViewTransition(from fromView: ChatHistoryView?, to toVie stationaryItemRange = (0, Int.max) case .HoleReload: stationaryItemRange = (0, Int.max) - /*if let (_, removeDirection) = removeHoleDirections.first { - switch removeDirection { - case .LowerToUpper: - var holeIndex: MessageIndex? - for (index, _) in filledHoleDirections { - if holeIndex == nil || index < holeIndex! { - holeIndex = index - } - } - - if let holeIndex = holeIndex { - for i in 0 ..< toView.filteredEntries.count { - if toView.filteredEntries[i].index >= holeIndex { - let index = toView.filteredEntries.count - 1 - (i - 1) - stationaryItemRange = (index, Int.max) - break - } - } - } - case .UpperToLower: - break - case .AroundId, .AroundIndex: - break - } - }*/ } for (index, entry, previousIndex) in mergeResult.indicesAndItems { @@ -192,5 +167,9 @@ func preparedChatHistoryViewTransition(from fromView: ChatHistoryView?, to toVie } } + if updatedMessageSelection { + options.insert(.Synchronous) + } + return ChatHistoryViewTransition(historyView: toView, deleteItems: adjustedDeleteIndices, insertEntries: adjustedIndicesAndItems, updateEntries: adjustedUpdateItems, options: options, scrollToItem: scrollToItem, stationaryItemRange: stationaryItemRange, initialData: initialData, keyboardButtonsMessage: keyboardButtonsMessage, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData, scrolledToIndex: scrolledToIndex, animateIn: animateIn, reason: reason, flashIndicators: flashIndicators) } From 028299631e47c235cd36323c9c78806ca0b35bc0 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 29 Aug 2019 15:50:28 +0300 Subject: [PATCH 64/86] Cloud themes improvements --- .../Sources/Themes/EditThemeController.swift | 39 +++-- .../ThemeAccentColorControllerNode.swift | 10 +- .../Themes/ThemePreviewController.swift | 6 + .../Themes/ThemePreviewControllerNode.swift | 16 +- .../TelegramCore/TelegramCore/Themes.swift | 94 ++++++----- .../TelegramUI/ChatSearchInputPanelNode.swift | 10 +- .../Sources/PostboxKeys.swift | 4 +- .../Sources/WallpaperCache.swift | 69 ++++++++ .../Sources/WallpaperResources.swift | 149 ++++++++++-------- .../project.pbxproj | 4 + 10 files changed, 264 insertions(+), 137 deletions(-) create mode 100644 submodules/WallpaperResources/Sources/WallpaperCache.swift diff --git a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift index c64e0483a4..bdc257b773 100644 --- a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift @@ -9,6 +9,7 @@ import TelegramUIPreferences import ItemListUI import AlertUI import LegacyMediaPickerUI +import WallpaperResources import AccountContext private final class EditThemeControllerArguments { @@ -301,7 +302,6 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll if let navigateToChat = navigateToChat { presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.EditTheme_ThemeTemplateAlert, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { completion() - navigateToChat(context.account.peerId) }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { completion() @@ -312,37 +312,56 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll } let theme: PresentationTheme? - let custom: Bool + let hasCustomFile: Bool if let updatedTheme = state.updatedTheme { theme = updatedTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) - custom = true + hasCustomFile = true } else { if case let .edit(info) = mode, let _ = info.theme.file { theme = nil - custom = true + hasCustomFile = true } else { theme = state.previewTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) - custom = false + hasCustomFile = false } } let themeResource: LocalFileMediaResource? let themeData: Data? + let themeThumbnailData: Data? if let theme = theme, let themeString = encodePresentationTheme(theme), let data = themeString.data(using: .utf8) { let resource = LocalFileMediaResource(fileId: arc4random64()) context.account.postbox.mediaBox.storeResourceData(resource.id, data: data) context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) themeResource = resource themeData = data + + let themeThumbnail = generateImage(CGSize(width: 213, height: 320.0), contextGenerator: { size, context in + if let image = generateImage(CGSize(width: 194.0, height: 291.0), contextGenerator: { size, c in + drawThemeImage(context: c, theme: theme, size: size) + })?.cgImage { + context.draw(image, in: CGRect(origin: CGPoint(), size: size)) + } + }, scale: 1.0) + themeThumbnailData = themeThumbnail?.jpegData(compressionQuality: 0.6) } else { themeResource = nil themeData = nil + themeThumbnailData = nil + } + + let resolvedWallpaper: TelegramWallpaper? + if let theme = theme, case let .file(file) = theme.chat.defaultWallpaper, file.id != 0 { + resolvedWallpaper = theme.chat.defaultWallpaper + updateCachedWallpaper(account: context.account, wallpaper: theme.chat.defaultWallpaper) + } else { + resolvedWallpaper = nil } switch mode { case .create: if let themeResource = themeResource { - let _ = (createTheme(account: context.account, resource: themeResource, title: state.title) + let _ = (createTheme(account: context.account, title: state.title, resource: themeResource, thumbnailData: themeThumbnailData) |> deliverOnMainQueue).start(next: { next in if case let .result(resultTheme) = next { let _ = applyTheme(accountManager: context.sharedContext.accountManager, account: context.account, theme: resultTheme).start() @@ -359,7 +378,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) } - let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: nil)) + let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: resolvedWallpaper)) var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers if let theme = theme { themeSpecificChatWallpapers[themeReference.index] = theme.chat.defaultWallpaper @@ -368,7 +387,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) } |> deliverOnMainQueue).start(completed: { - if !custom { + if !hasCustomFile { saveThemeTemplateFile(state.title, themeResource, { dismissImpl?() }) @@ -403,7 +422,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) } - let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: nil)) + let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: resolvedWallpaper)) var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers if let theme = theme { themeSpecificChatWallpapers[themeReference.index] = theme.chat.defaultWallpaper @@ -412,7 +431,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) } |> deliverOnMainQueue).start(completed: { - if let themeResource = themeResource, !custom { + if let themeResource = themeResource, !hasCustomFile { saveThemeTemplateFile(state.title, themeResource, { dismissImpl?() }) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index 5696ebf78f..fee231be66 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -222,13 +222,11 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate let peers = SimpleDictionary() let messages = SimpleDictionary() let selfPeer = TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - + let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let peer3 = TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: 3), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) - let peer3Author = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - - let peer4 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer3Author = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer4 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let timestamp = self.referenceTimestamp diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index a7305e0d58..d1343ca9d6 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -150,6 +150,12 @@ public final class ThemePreviewController: ViewController { } } +// let resolvedWallpaper: TelegramWallpaper? +// if let theme = theme, case let .file(file) = theme.chat.defaultWallpaper, file.id != 0 { +// resolvedWallpaper = theme.chat.defaultWallpaper +// updateCachedWallpaper(account: context.account, wallpaper: theme.chat.defaultWallpaper) +// } + let _ = (signal |> deliverOnMainQueue).start(completed: { [weak self] in if let strongSelf = self { strongSelf.dismiss() diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index aa17e9fadb..419713d492 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -167,18 +167,14 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let peers = SimpleDictionary() let messages = SimpleDictionary() let selfPeer = TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - + let peer1 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 1), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer2 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 2), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let peer3 = TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: 3), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) - let peer3Author = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - - let peer4 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name.components(separatedBy: " ").first, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - + let peer3Author = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer4 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 4), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let peer5 = TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: 5), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .broadcast(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) - - let peer6 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 5), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let peer7 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 6), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name.components(separatedBy: " ").first, lastName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name.components(separatedBy: " ").last, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer6 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 5), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let peer7 = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 6), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let timestamp = self.referenceTimestamp diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index 87139785d5..bada345a5b 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -135,9 +135,8 @@ private func saveUnsaveTheme(account: Account, theme: TelegramTheme, unsave: Boo return account.postbox.transaction { transaction -> Signal in let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) var items = entries.map { $0.contents as! TelegramTheme } - if unsave { - items = items.filter { $0.id != theme.id } - } else { + items = items.filter { $0.id != theme.id } + if !unsave { items.insert(theme, at: 0) } var updatedEntries: [OrderedItemListEntry] = [] @@ -182,7 +181,6 @@ public enum UploadThemeError { } private struct UploadedThemeData { - fileprivate let resource: MediaResource fileprivate let content: UploadedThemeDataContent } @@ -194,45 +192,70 @@ private enum UploadedThemeDataContent { private func uploadedTheme(postbox: Postbox, network: Network, resource: MediaResource) -> Signal { return multipartUpload(network: network, postbox: postbox, source: .resource(.standalone(resource: resource)), encrypt: false, tag: TelegramMediaResourceFetchTag(statsCategory: .file), hintFileSize: nil, hintFileIsLarge: false) |> map { result -> UploadedThemeData in - return UploadedThemeData(resource: resource, content: .result(result)) + return UploadedThemeData(content: .result(result)) } |> `catch` { _ -> Signal in - return .single(UploadedThemeData(resource: resource, content: .error)) + return .single(UploadedThemeData(content: .error)) } } -private func uploadTheme(account: Account, resource: MediaResource) -> Signal { +private func uploadedThemeThumbnail(postbox: Postbox, network: Network, data: Data) -> Signal { + return multipartUpload(network: network, postbox: postbox, source: .data(data), encrypt: false, tag: TelegramMediaResourceFetchTag(statsCategory: .image), hintFileSize: nil, hintFileIsLarge: false) + |> map { result -> UploadedThemeData in + return UploadedThemeData(content: .result(result)) + } + |> `catch` { _ -> Signal in + return .single(UploadedThemeData(content: .error)) + } +} + +private func uploadTheme(account: Account, resource: MediaResource, thumbnailData: Data? = nil) -> Signal { let fileName = "theme.\(themeFileExtension)" let mimeType = "application/x-tgtheme-\(themeFormat)" - return uploadedTheme(postbox: account.postbox, network: account.network, resource: resource) - |> mapError { _ -> UploadThemeError in return .generic } - |> mapToSignal { result -> Signal<(UploadThemeResult, MediaResource?), UploadThemeError> in - switch result.content { - case .error: - return .fail(.generic) - case let .result(resultData): - switch resultData { - case let .progress(progress): - return .single((.progress(progress), result.resource)) - case let .inputFile(file): - return account.network.request(Api.functions.account.uploadTheme(flags: 0, file: file, thumb: nil, fileName: fileName, mimeType: mimeType)) - |> mapError { _ in return UploadThemeError.generic } - |> mapToSignal { document -> Signal<(UploadThemeResult, MediaResource?), UploadThemeError> in - if let file = telegramMediaFileFromApiDocument(document) { - return .single((.complete(file), result.resource)) - } else { - return .fail(.generic) + let uploadedThumbnail: Signal + if let thumbnailData = thumbnailData { + uploadedThumbnail = uploadedThemeThumbnail(postbox: account.postbox, network: account.network, data: thumbnailData) + |> mapError { _ -> UploadThemeError in return .generic } + |> map(Optional.init) + } else { + uploadedThumbnail = .single(nil) + } + + return uploadedThumbnail + |> mapToSignal { thumbnailResult -> Signal in + return uploadedTheme(postbox: account.postbox, network: account.network, resource: resource) + |> mapError { _ -> UploadThemeError in return .generic } + |> mapToSignal { result -> Signal in + switch result.content { + case .error: + return .fail(.generic) + case let .result(resultData): + switch resultData { + case let .progress(progress): + return .single(.progress(progress)) + case let .inputFile(file): + var flags: Int32 = 0 + var thumbnailFile: Api.InputFile? + if let thumbnailResult = thumbnailResult?.content, case let .result(result) = thumbnailResult, case let .inputFile(file) = result { + thumbnailFile = file + flags |= 1 << 0 } - } - default: - return .fail(.generic) + return account.network.request(Api.functions.account.uploadTheme(flags: flags, file: file, thumb: thumbnailFile, fileName: fileName, mimeType: mimeType)) + |> mapError { _ in return UploadThemeError.generic } + |> mapToSignal { document -> Signal in + if let file = telegramMediaFileFromApiDocument(document) { + return .single(.complete(file)) + } else { + return .fail(.generic) + } + } + default: + return .fail(.generic) + } } } } - |> map { result, _ -> UploadThemeResult in - return result - } } public enum CreateThemeError { @@ -244,8 +267,8 @@ public enum CreateThemeResult { case progress(Float) } -public func createTheme(account: Account, resource: MediaResource, title: String) -> Signal { - return uploadTheme(account: account, resource: resource) +public func createTheme(account: Account, title: String, resource: MediaResource, thumbnailData: Data? = nil) -> Signal { + return uploadTheme(account: account, resource: resource, thumbnailData: thumbnailData) |> mapError { _ in return CreateThemeError.generic } |> mapToSignal { result -> Signal in switch result { @@ -283,7 +306,7 @@ public func createTheme(account: Account, resource: MediaResource, title: String } } -public func updateTheme(account: Account, theme: TelegramTheme, title: String?, slug: String?, resource: MediaResource?) -> Signal { +public func updateTheme(account: Account, theme: TelegramTheme, title: String?, slug: String?, resource: MediaResource?, thumbnailData: Data? = nil) -> Signal { guard title != nil || slug != nil || resource != nil else { return .complete() } @@ -294,10 +317,9 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, if let _ = slug { flags |= 1 << 0 } - let uploadSignal: Signal if let resource = resource { - uploadSignal = uploadTheme(account: account, resource: resource) + uploadSignal = uploadTheme(account: account, resource: resource, thumbnailData: thumbnailData) |> map(Optional.init) } else { uploadSignal = .single(nil) diff --git a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift index ca358f5386..bd68554e6a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift @@ -114,10 +114,10 @@ final class ChatSearchInputPanelNode: ChatInputPanelNode { panelHeight = 45.0 } - transition.updateFrame(node: self.downButton, frame: CGRect(origin: CGPoint(x: width - rightInset - 48.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight))) - transition.updateFrame(node: self.upButton, frame: CGRect(origin: CGPoint(x: width - rightInset - 48.0 - 43.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight))) - transition.updateFrame(node: self.calendarButton, frame: CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: 60.0, height: panelHeight))) - transition.updateFrame(node: self.membersButton, frame: CGRect(origin: CGPoint(x: leftInset + 43.0, y: 0.0), size: CGSize(width: 60.0, height: panelHeight))) + self.downButton.frame = CGRect(origin: CGPoint(x: width - rightInset - 48.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight)) + self.upButton.frame = CGRect(origin: CGPoint(x: width - rightInset - 48.0 - 43.0, y: 0.0), size: CGSize(width: 40.0, height: panelHeight)) + self.calendarButton.frame = CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: 60.0, height: panelHeight)) + self.membersButton.frame = CGRect(origin: CGPoint(x: leftInset + 43.0, y: 0.0), size: CGSize(width: 60.0, height: panelHeight)) var resultIndex: Int? var resultCount: Int? @@ -155,7 +155,7 @@ final class ChatSearchInputPanelNode: ChatInputPanelNode { let makeLabelLayout = TextNode.asyncLayout(self.resultsLabel) let (labelSize, labelApply) = makeLabelLayout(TextNodeLayoutArguments(attributedString: resultsText, backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: width - leftInset - rightInset - 50.0, height: 100.0), alignment: .left, cutout: nil, insets: UIEdgeInsets())) let _ = labelApply() - self.resultsLabel.frame = CGRect(origin: CGPoint(x: leftInset + 105.0, y: floor((panelHeight - labelSize.size.height) / 2.0)), size: labelSize.size) + self.resultsLabel.frame = CGRect(origin: CGPoint(x: leftInset + 16.0, y: floor((panelHeight - labelSize.size.height) / 2.0)), size: labelSize.size) let indicatorSize = self.activityIndicator.measure(CGSize(width: 22.0, height: 22.0)) self.activityIndicator.frame = CGRect(origin: CGPoint(x: width - rightInset - 41.0, y: floor((panelHeight - indicatorSize.height) / 2.0)), size: indicatorSize) diff --git a/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift b/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift index 1049722f83..11e37ba283 100644 --- a/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift +++ b/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift @@ -53,13 +53,13 @@ public struct ApplicationSpecificSharedDataKeys { private enum ApplicationSpecificItemCacheCollectionIdValues: Int8 { case instantPageStoredState = 0 case cachedInstantPages = 1 - case resolvedWallpapers = 2 + case cachedWallpapers = 2 } public struct ApplicationSpecificItemCacheCollectionId { public static let instantPageStoredState = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.instantPageStoredState.rawValue) public static let cachedInstantPages = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.cachedInstantPages.rawValue) - public static let resolvedWallpapers = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.resolvedWallpapers.rawValue) + public static let cachedWallpapers = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.cachedWallpapers.rawValue) } private enum ApplicationSpecificOrderedItemListCollectionIdValues: Int32 { diff --git a/submodules/WallpaperResources/Sources/WallpaperCache.swift b/submodules/WallpaperResources/Sources/WallpaperCache.swift new file mode 100644 index 0000000000..4797136cf7 --- /dev/null +++ b/submodules/WallpaperResources/Sources/WallpaperCache.swift @@ -0,0 +1,69 @@ +import Foundation +import UIKit +import SwiftSignalKit +import Postbox +import TelegramApi +import TelegramCore +import TelegramUIPreferences +import PersistentStringHash + +public final class CachedWallpaper: PostboxCoding { + public let wallpaper: TelegramWallpaper + + public init(wallpaper: TelegramWallpaper) { + self.wallpaper = wallpaper + } + + public init(decoder: PostboxDecoder) { + self.wallpaper = decoder.decodeObjectForKey("wallpaper", decoder: { TelegramWallpaper(decoder: $0) }) as! TelegramWallpaper + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeObject(self.wallpaper, forKey: "wallpaper") + } +} + +private let collectionSpec = ItemCacheCollectionSpec(lowWaterItemCount: 10000, highWaterItemCount: 20000) + +public func cachedWallpaper(account: Account, slug: String) -> Signal { + return account.postbox.transaction { transaction -> Signal in + let key = ValueBoxKey(length: 8) + key.setInt64(0, value: Int64(bitPattern: slug.persistentHashValue)) + if let entry = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: ApplicationSpecificItemCacheCollectionId.cachedWallpapers, key: key)) as? CachedWallpaper { + return .single(entry) + } else { + return getWallpaper(account: account, slug: slug) + |> map(Optional.init) + |> `catch` { _ -> Signal in + return .single(nil) + } + |> mapToSignal { wallpaper -> Signal in + return account.postbox.transaction { transaction -> CachedWallpaper? in + let key = ValueBoxKey(length: 8) + key.setInt64(0, value: Int64(bitPattern: slug.persistentHashValue)) + let id = ItemCacheEntryId(collectionId: ApplicationSpecificItemCacheCollectionId.cachedWallpapers, key: key) + if let wallpaper = wallpaper { + let entry = CachedWallpaper(wallpaper: wallpaper) + transaction.putItemCacheEntry(id: id, entry: entry, collectionSpec: collectionSpec) + return entry + } else { + transaction.removeItemCacheEntry(id: id) + return nil + } + } + } + } + } |> switchToLatest +} + +public func updateCachedWallpaper(account: Account, wallpaper: TelegramWallpaper) { + guard case let .file(file) = wallpaper, file.id != 0 else { + return + } + let _ = (account.postbox.transaction { transaction in + let key = ValueBoxKey(length: 8) + key.setInt64(0, value: Int64(bitPattern: file.slug.persistentHashValue)) + let id = ItemCacheEntryId(collectionId: ApplicationSpecificItemCacheCollectionId.cachedWallpapers, key: key) + transaction.putItemCacheEntry(id: id, entry: CachedWallpaper(wallpaper: wallpaper), collectionSpec: collectionSpec) + }).start() +} diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index 3e2d4b639e..205b3fb165 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -633,6 +633,86 @@ private func generateBackArrowImage(color: UIColor) -> UIImage? { }) } +public func drawThemeImage(context c: CGContext, theme: PresentationTheme, size: CGSize) { + let drawingRect = CGRect(origin: CGPoint(), size: size) + + switch theme.chat.defaultWallpaper { + case .builtin: + if let filePath = frameworkBundle.path(forResource: "ChatWallpaperBuiltin0", ofType: "jpg"), let image = UIImage(contentsOfFile: filePath), let cgImage = image.cgImage { + let size = image.size.aspectFilled(drawingRect.size) + c.draw(cgImage, in: CGRect(origin: CGPoint(x: (drawingRect.size.width - size.width) / 2.0, y: (drawingRect.size.height - size.height) / 2.0), size: size)) + } + case let .color(value): + c.setFillColor(UIColor(rgb: UInt32(bitPattern: value)).cgColor) + c.fill(drawingRect) + case let .file(file): + c.setFillColor(theme.chatList.backgroundColor.cgColor) + c.fill(drawingRect) + default: + break + } + + c.setFillColor(theme.rootController.navigationBar.backgroundColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 0.0, y: drawingRect.height - 42.0), size: CGSize(width: drawingRect.width, height: 42.0))) + + c.setFillColor(theme.rootController.navigationBar.separatorColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 1.0, y: drawingRect.height - 43.0), size: CGSize(width: drawingRect.width - 2.0, height: 1.0))) + + c.setFillColor(theme.rootController.navigationBar.secondaryTextColor.cgColor) + c.fillEllipse(in: CGRect(origin: CGPoint(x: drawingRect.width - 28.0 - 7.0, y: drawingRect.height - 7.0 - 28.0 - UIScreenPixel), size: CGSize(width: 28.0, height: 28.0))) + + if let arrow = generateBackArrowImage(color: theme.rootController.navigationBar.buttonColor), let image = arrow.cgImage { + c.draw(image, in: CGRect(x: 9.0, y: drawingRect.height - 11.0 - 22.0 + UIScreenPixel, width: 13.0, height: 22.0)) + } + c.setFillColor(theme.chat.inputPanel.panelBackgroundColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: drawingRect.width, height: 42.0))) + + c.setFillColor(theme.chat.inputPanel.panelSeparatorColor.cgColor) + c.fill(CGRect(origin: CGPoint(x: 1.0, y: 42.0), size: CGSize(width: drawingRect.width - 2.0, height: 1.0))) + + c.setFillColor(theme.chat.inputPanel.inputBackgroundColor.cgColor) + c.setStrokeColor(theme.chat.inputPanel.inputStrokeColor.cgColor) + + c.setLineWidth(1.0) + let path = UIBezierPath(roundedRect: CGRect(x: 34.0, y: 6.0, width: drawingRect.width - 34.0 * 2.0, height: 31.0), cornerRadius: 15.5) + c.addPath(path.cgPath) + c.drawPath(using: .fillStroke) + + if let attachment = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/IconAttachment"), color: theme.chat.inputPanel.panelControlColor), let image = attachment.cgImage { + c.draw(image, in: CGRect(origin: CGPoint(x: 3.0, y: 6.0 + UIScreenPixel), size: attachment.size.fitted(CGSize(width: 30.0, height: 30.0)))) + } + + if let microphone = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/IconMicrophone"), color: theme.chat.inputPanel.panelControlColor), let image = microphone.cgImage { + c.draw(image, in: CGRect(origin: CGPoint(x: drawingRect.width - 3.0 - 29.0, y: 7.0 + UIScreenPixel), size: microphone.size.fitted(CGSize(width: 30.0, height: 30.0)))) + } + + c.saveGState() + c.setFillColor(theme.chat.message.incoming.bubble.withoutWallpaper.fill.cgColor) + c.setStrokeColor(theme.chat.message.incoming.bubble.withoutWallpaper.stroke.cgColor) + c.translateBy(x: 5.0, y: 65.0) + c.translateBy(x: 114.0, y: 32.0) + c.scaleBy(x: 1.0, y: -1.0) + c.translateBy(x: -114.0, y: -32.0) + let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 ") + c.strokePath() + let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 ") + c.fillPath() + c.restoreGState() + + c.saveGState() + c.setFillColor(theme.chat.message.outgoing.bubble.withoutWallpaper.fill.cgColor) + c.setStrokeColor(theme.chat.message.outgoing.bubble.withoutWallpaper.stroke.cgColor) + c.translateBy(x: drawingRect.width - 114.0 - 5.0, y: 25.0) + c.translateBy(x: 114.0, y: 32.0) + c.scaleBy(x: -1.0, y: -1.0) + c.translateBy(x: 0, y: -32.0) + let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 ") + c.strokePath() + let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 ") + c.fillPath() + c.restoreGState() +} + public func themeImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { return telegramThemeData(account: account, accountManager: accountManager, resource: fileReference.media.resource, synchronousLoad: synchronousLoad) |> map { data in @@ -648,74 +728,7 @@ public func themeImage(account: Account, accountManager: AccountManager, fileRef context.withFlippedContext { c in c.setBlendMode(.normal) if let theme = theme { - switch theme.chat.defaultWallpaper { - case .builtin: - if let filePath = frameworkBundle.path(forResource: "ChatWallpaperBuiltin0", ofType: "jpg"), let image = UIImage(contentsOfFile: filePath), let cgImage = image.cgImage { - c.draw(cgImage, in: CGRect(x: 0.0, y: 0.0, width: drawingRect.width, height: drawingRect.height)) - } - case let .color(value): - c.setFillColor(UIColor(rgb: UInt32(bitPattern: value)).cgColor) - c.fill(drawingRect) - case let .file(file): - c.setFillColor(theme.chatList.backgroundColor.cgColor) - c.fill(drawingRect) - default: - break - } - - c.setFillColor(theme.rootController.navigationBar.backgroundColor.cgColor) - c.fill(CGRect(origin: CGPoint(x: 0.0, y: drawingRect.height - 42.0), size: CGSize(width: drawingRect.width, height: 42.0))) - - c.setFillColor(theme.rootController.navigationBar.separatorColor.cgColor) - c.fill(CGRect(origin: CGPoint(x: 1.0, y: drawingRect.height - 43.0), size: CGSize(width: drawingRect.width - 2.0, height: 1.0))) - - c.setFillColor(theme.rootController.navigationBar.secondaryTextColor.cgColor) - c.fillEllipse(in: CGRect(origin: CGPoint(x: drawingRect.width - 28.0 - 7.0, y: drawingRect.height - 7.0 - 28.0 - UIScreenPixel), size: CGSize(width: 28.0, height: 28.0))) - - if let arrow = generateBackArrowImage(color: theme.rootController.navigationBar.buttonColor), let image = arrow.cgImage { - c.draw(image, in: CGRect(x: 9.0, y: drawingRect.height - 11.0 - 22.0 + UIScreenPixel, width: 13.0, height: 22.0)) - } - c.setFillColor(theme.chat.inputPanel.panelBackgroundColor.cgColor) - c.fill(CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: drawingRect.width, height: 42.0))) - - c.setFillColor(theme.chat.inputPanel.panelSeparatorColor.cgColor) - c.fill(CGRect(origin: CGPoint(x: 1.0, y: 42.0), size: CGSize(width: drawingRect.width - 2.0, height: 1.0))) - - c.setFillColor(theme.chat.inputPanel.inputBackgroundColor.cgColor) - c.setStrokeColor(theme.chat.inputPanel.inputStrokeColor.cgColor) - - c.setLineWidth(1.0) - let path = UIBezierPath(roundedRect: CGRect(x: 34.0, y: 6.0, width: drawingRect.width - 34.0 * 2.0, height: 31.0), cornerRadius: 15.5) - c.addPath(path.cgPath) - c.drawPath(using: .fillStroke) - - if let attachment = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/IconAttachment"), color: theme.chat.inputPanel.panelControlColor), let image = attachment.cgImage { - c.draw(image, in: CGRect(origin: CGPoint(x: 3.0, y: 6.0 + UIScreenPixel), size: attachment.size.fitted(CGSize(width: 30.0, height: 30.0)))) - } - - if let microphone = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/IconMicrophone"), color: theme.chat.inputPanel.panelControlColor), let image = microphone.cgImage { - c.draw(image, in: CGRect(origin: CGPoint(x: drawingRect.width - 3.0 - 29.0, y: 7.0 + UIScreenPixel), size: microphone.size.fitted(CGSize(width: 30.0, height: 30.0)))) - } - - c.saveGState() - c.setFillColor(theme.chat.message.incoming.bubble.withoutWallpaper.fill.cgColor) - c.setStrokeColor(theme.chat.message.incoming.bubble.withoutWallpaper.stroke.cgColor) - c.translateBy(x: 5.0, y: 65.0) - c.translateBy(x: 114.0, y: 32.0) - c.scaleBy(x: 1.0, y: -1.0) - c.translateBy(x: -114.0, y: -32.0) - let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 Z") - c.restoreGState() - - c.saveGState() - c.setFillColor(theme.chat.message.outgoing.bubble.withoutWallpaper.fill.cgColor) - c.setStrokeColor(theme.chat.message.outgoing.bubble.withoutWallpaper.stroke.cgColor) - c.translateBy(x: drawingRect.width - 114.0 - 5.0, y: 25.0) - c.translateBy(x: 114.0, y: 32.0) - c.scaleBy(x: -1.0, y: -1.0) - c.translateBy(x: 0, y: -32.0) - let _ = try? drawSvgPath(c, path: "M98.0061174,0 C106.734138,0 113.82927,6.99200411 113.996965,15.6850616 L114,16 C114,24.836556 106.830179,32 98.0061174,32 L21.9938826,32 C18.2292665,32 14.7684355,30.699197 12.0362474,28.5221601 C8.56516444,32.1765452 -1.77635684e-15,31.9985981 -1.77635684e-15,31.9985981 C5.69252399,28.6991366 5.98604874,24.4421608 5.99940747,24.1573436 L6,24.1422468 L6,16 C6,7.163444 13.1698213,0 21.9938826,0 L98.0061174,0 Z") - c.restoreGState() + drawThemeImage(context: c, theme: theme, size: arguments.drawingSize) c.setStrokeColor(theme.rootController.navigationBar.separatorColor.cgColor) c.setLineWidth(2.0) diff --git a/submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj b/submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj index 464d07d274..b9bf77669f 100644 --- a/submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj +++ b/submodules/WallpaperResources/WallpaperResources_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 095214ED2317EF76008CDD87 /* WallpaperCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095214EC2317EF76008CDD87 /* WallpaperCache.swift */; }; D03E484A23076B4A0049C28B /* WallpaperResources.h in Headers */ = {isa = PBXBuildFile; fileRef = D03E484823076B4A0049C28B /* WallpaperResources.h */; settings = {ATTRIBUTES = (Public, ); }; }; D03E485523076BB70049C28B /* WallpaperResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E485423076BB70049C28B /* WallpaperResources.swift */; }; D03E485823076BCB0049C28B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E485723076BCB0049C28B /* Foundation.framework */; }; @@ -24,6 +25,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 095214EC2317EF76008CDD87 /* WallpaperCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperCache.swift; sourceTree = ""; }; D03E484523076B4A0049C28B /* WallpaperResources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WallpaperResources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E484823076B4A0049C28B /* WallpaperResources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WallpaperResources.h; sourceTree = ""; }; D03E484923076B4A0049C28B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -88,6 +90,7 @@ D03E485423076BB70049C28B /* WallpaperResources.swift */, D03E487123076CF10049C28B /* FrameworkBundle.swift */, D03E484823076B4A0049C28B /* WallpaperResources.h */, + 095214EC2317EF76008CDD87 /* WallpaperCache.swift */, ); path = Sources; sourceTree = ""; @@ -191,6 +194,7 @@ buildActionMask = 2147483647; files = ( D03E487223076CF10049C28B /* FrameworkBundle.swift in Sources */, + 095214ED2317EF76008CDD87 /* WallpaperCache.swift in Sources */, D03E485523076BB70049C28B /* WallpaperResources.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From cf5bb3ce2ee116d913e5e041ed4cf28f71f918b4 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Thu, 29 Aug 2019 16:26:05 +0300 Subject: [PATCH 65/86] some typo fix [skip ci] --- submodules/TelegramCore/TelegramCore/Themes.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index bada345a5b..e5e22a50c4 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -317,6 +317,9 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, if let _ = slug { flags |= 1 << 0 } + if let _ = resource { + flags |= 1 << 2 + } let uploadSignal: Signal if let resource = resource { uploadSignal = uploadTheme(account: account, resource: resource, thumbnailData: thumbnailData) From 77fe3d51f1e4c150322ca65abae7eb39b96d7bce Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 18:48:56 +0400 Subject: [PATCH 66/86] Fix screen rotation --- submodules/Display/Display/NativeWindowHostView.swift | 7 +++++++ .../Display/Display/UIViewController+Navigation.h | 2 ++ .../Display/Display/UIViewController+Navigation.m | 11 +++++++++++ 3 files changed, 20 insertions(+) diff --git a/submodules/Display/Display/NativeWindowHostView.swift b/submodules/Display/Display/NativeWindowHostView.swift index 70b98bdcc9..386803213b 100644 --- a/submodules/Display/Display/NativeWindowHostView.swift +++ b/submodules/Display/Display/NativeWindowHostView.swift @@ -347,6 +347,13 @@ public func nativeWindowHostView() -> (UIWindow & WindowHost, WindowHostView, UI rootViewController.viewDidAppear(false) let aboveStatusbarWindow = AboveStatusBarWindow(frame: UIScreen.main.bounds) + aboveStatusbarWindow.supportedOrientations = { [weak rootViewController] in + if let rootViewController = rootViewController { + return rootViewController.supportedInterfaceOrientations + } else { + return .portrait + } + } let hostView = WindowHostView(containerView: rootViewController.view, eventView: window, aboveStatusBarView: rootViewController.view, isRotating: { return window.isRotating() diff --git a/submodules/Display/Display/UIViewController+Navigation.h b/submodules/Display/Display/UIViewController+Navigation.h index 4246fa11b7..9c3f5dc007 100644 --- a/submodules/Display/Display/UIViewController+Navigation.h +++ b/submodules/Display/Display/UIViewController+Navigation.h @@ -36,4 +36,6 @@ void applyKeyboardAutocorrection(); @interface AboveStatusBarWindow : UIWindow +@property (nonatomic, copy) UIInterfaceOrientationMask (^ _Nullable supportedOrientations)(void); + @end diff --git a/submodules/Display/Display/UIViewController+Navigation.m b/submodules/Display/Display/UIViewController+Navigation.m index d938446289..d08b6a9780 100644 --- a/submodules/Display/Display/UIViewController+Navigation.m +++ b/submodules/Display/Display/UIViewController+Navigation.m @@ -311,6 +311,8 @@ void applyKeyboardAutocorrection() { @interface AboveStatusBarWindowController : UIViewController +@property (nonatomic, copy) UIInterfaceOrientationMask (^ _Nullable supportedOrientations)(void); + @end @implementation AboveStatusBarWindowController @@ -330,6 +332,10 @@ void applyKeyboardAutocorrection() { [self viewDidLoad]; } +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortrait; +} + @end @implementation AboveStatusBarWindow @@ -348,6 +354,11 @@ void applyKeyboardAutocorrection() { return self; } +- (void)setSupportedOrientations:(UIInterfaceOrientationMask (^)(void))supportedOrientations { + _supportedOrientations = [supportedOrientations copy]; + ((AboveStatusBarWindowController *)self.rootViewController).supportedOrientations = _supportedOrientations; +} + - (BOOL)shouldAffectStatusBarAppearance { return false; } From e571c6a8e1eeaeb74320796d59236fec4672ad2b Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 18:49:07 +0400 Subject: [PATCH 67/86] Fail call if DND --- submodules/TelegramCallsUI/Sources/PresentationCall.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/submodules/TelegramCallsUI/Sources/PresentationCall.swift b/submodules/TelegramCallsUI/Sources/PresentationCall.swift index e2dc012cf2..4e0b8870f5 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCall.swift @@ -408,6 +408,11 @@ public final class PresentationCallImpl: PresentationCall { if let error = error { if error.domain == "com.apple.CallKit.error.incomingcall" && (error.code == -3 || error.code == 3) { Logger.shared.log("PresentationCall", "reportIncomingCall device in DND mode") + Queue.mainQueue().async { + if let strongSelf = self { + strongSelf.callSessionManager.drop(internalId: strongSelf.internalId, reason: .busy) + } + } } else { Logger.shared.log("PresentationCall", "reportIncomingCall error \(error)") Queue.mainQueue().async { From 3431d42aef7331c60d5c8ae64720e3e2a141e8ea Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 18:49:28 +0400 Subject: [PATCH 68/86] Move gradients to experiments --- .../ThemeAccentColorControllerNode.swift | 2 +- .../PresentationThemeEssentialGraphics.swift | 4 ++-- .../Resources/PresentationResourcesChat.swift | 4 ++-- .../TelegramUI/ChatController.swift | 21 +++++++++++++++++-- .../ChatMessageBubbleItemNode.swift | 4 ++-- .../ChatMessageDateAndStatusNode.swift | 2 +- .../TelegramUI/ChatMessageDateHeader.swift | 4 ++-- .../ChatMessageInteractiveFileNode.swift | 2 +- .../Sources/ExperimentalUISettings.swift | 8 +++++-- 9 files changed, 36 insertions(+), 15 deletions(-) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index 5696ebf78f..859814978a 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -140,7 +140,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: currentTheme, accentColor: color, serviceBackgroundColor: defaultServiceBackgroundColor, baseColor: nil, preview: true) let wallpaper = context.sharedContext.currentPresentationData.with { $0 }.chatWallpaper - let _ = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: theme, wallpaper: wallpaper) + let _ = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: theme, wallpaper: wallpaper, gradientBubbles: context.sharedContext.immediateExperimentalUISettings.gradientBubbles) return theme } diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift index 5af2e366cc..3a995bb505 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift @@ -143,7 +143,7 @@ public final class PrincipalThemeEssentialGraphics { public let incomingBubbleGradientImage: UIImage? public let outgoingBubbleGradientImage: UIImage? - init(mediaBox: MediaBox, presentationTheme: PresentationTheme, wallpaper initialWallpaper: TelegramWallpaper, preview: Bool = false, knockoutMode: Bool) { + init(mediaBox: MediaBox, presentationTheme: PresentationTheme, wallpaper initialWallpaper: TelegramWallpaper, preview: Bool = false, knockoutMode: Bool, gradientBubbles: Bool) { let theme = presentationTheme.chat var wallpaper = initialWallpaper @@ -173,7 +173,7 @@ public final class PrincipalThemeEssentialGraphics { } var outgoingGradientColors: (UIColor, UIColor)? - if false, let baseColor = presentationTheme.baseColor { + if gradientBubbles, let baseColor = presentationTheme.baseColor { if presentationTheme.baseColor == .custom { } else { diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift index c4a492ad73..4c27cc528b 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift @@ -67,11 +67,11 @@ public struct PresentationResourcesChat { }) } - public static func principalGraphics(mediaBox: MediaBox, knockoutWallpaper: Bool, theme: PresentationTheme, wallpaper: TelegramWallpaper) -> PrincipalThemeEssentialGraphics { + public static func principalGraphics(mediaBox: MediaBox, knockoutWallpaper: Bool, theme: PresentationTheme, wallpaper: TelegramWallpaper, gradientBubbles: Bool) -> PrincipalThemeEssentialGraphics { let hasWallpaper = !wallpaper.isEmpty let key: PresentationResourceKey = !hasWallpaper ? PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithoutWallpaper : PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithWallpaper return theme.object(key.rawValue, { theme in - return PrincipalThemeEssentialGraphics(mediaBox: mediaBox, presentationTheme: theme, wallpaper: wallpaper, preview: theme.preview, knockoutMode: knockoutWallpaper) + return PrincipalThemeEssentialGraphics(mediaBox: mediaBox, presentationTheme: theme, wallpaper: wallpaper, preview: theme.preview, knockoutMode: knockoutWallpaper, gradientBubbles: gradientBubbles) }) as! PrincipalThemeEssentialGraphics } diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index b8ee8e6d9c..b363bb461c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -6550,7 +6550,24 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.chatDisplayNode.dismissInput() if let peer = peer as? TelegramChannel, let username = peer.username, !username.isEmpty { - self.present(peerReportOptionsController(context: self.context, subject: .peer(peer.id), present: { [weak self] c, a in + let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) + + var items: [ActionSheetItem] = [] + items.append(ActionSheetButtonItem(title: self.presentationData.strings.Conversation_ReportSpamAndLeave, color: .destructive, action: { [weak self, weak actionSheet] in + actionSheet?.dismissAnimated() + if let strongSelf = self { + strongSelf.deleteChat(reportChatSpam: true) + } + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + + self.present(actionSheet, in: .window(.root)) + + /*self.present(peerReportOptionsController(context: self.context, subject: .peer(peer.id), present: { [weak self] c, a in self?.present(c, in: .window(.root)) }, completion: { [weak self] success in guard let strongSelf = self, success else { @@ -6558,7 +6575,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } let _ = removePeerChat(account: strongSelf.context.account, peerId: chatPeer.id, reportChatSpam: false).start() (strongSelf.navigationController as? NavigationController)?.filterController(strongSelf, animated: true) - }), in: .window(.root)) + }), in: .window(.root))*/ } else if let _ = peer as? TelegramUser { let presentationData = self.presentationData let controller = ActionSheetController(presentationTheme: presentationData.theme) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 1e905ac94b..9f4eccce17 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -1493,7 +1493,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode let layout = ListViewItemNodeLayout(contentSize: layoutSize, insets: layoutInsets) - let graphics = PresentationResourcesChat.principalGraphics(mediaBox: item.context.account.postbox.mediaBox, knockoutWallpaper: item.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(mediaBox: item.context.account.postbox.mediaBox, knockoutWallpaper: item.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, gradientBubbles: item.context.sharedContext.immediateExperimentalUISettings.gradientBubbles) var updatedMergedTop = mergedBottom var updatedMergedBottom = mergedTop @@ -2686,7 +2686,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode if self.highlightedState != highlighted { self.highlightedState = highlighted if let backgroundType = self.backgroundType { - let graphics = PresentationResourcesChat.principalGraphics(mediaBox: item.context.account.postbox.mediaBox, knockoutWallpaper: item.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(mediaBox: item.context.account.postbox.mediaBox, knockoutWallpaper: item.context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, gradientBubbles: item.context.sharedContext.immediateExperimentalUISettings.gradientBubbles) if highlighted { self.backgroundNode.setType(type: backgroundType, highlighted: true, graphics: graphics, maskMode: self.contextSourceNode.isExtractedToContextPreview, transition: .immediate) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift index bf3f40cb61..60208d0478 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift @@ -145,7 +145,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let themeUpdated = presentationData.theme != currentTheme || type != currentType - let graphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, gradientBubbles: context.sharedContext.immediateExperimentalUISettings.gradientBubbles) let offset: CGFloat = -UIScreenPixel switch type { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift index 150ff1c108..d00aad8232 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift @@ -120,7 +120,7 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { self.transform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) - let graphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, gradientBubbles: context.sharedContext.immediateExperimentalUISettings.gradientBubbles) self.backgroundNode.image = graphics.dateStaticBackground self.stickBackgroundNode.image = graphics.dateFloatingBackground @@ -173,7 +173,7 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { } func updatePresentationData(_ presentationData: ChatPresentationData, context: AccountContext) { - let graphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, gradientBubbles: context.sharedContext.immediateExperimentalUISettings.gradientBubbles) self.backgroundNode.image = graphics.dateStaticBackground self.stickBackgroundNode.image = graphics.dateFloatingBackground diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift index 57c713f651..835a57b5e0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift @@ -434,7 +434,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { if hasThumbnail { fileIconImage = nil } else { - let principalGraphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + let principalGraphics = PresentationResourcesChat.principalGraphics(mediaBox: context.account.postbox.mediaBox, knockoutWallpaper: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper, theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, gradientBubbles: context.sharedContext.immediateExperimentalUISettings.gradientBubbles) fileIconImage = incoming ? principalGraphics.radialIndicatorFileIconIncoming : principalGraphics.radialIndicatorFileIconOutgoing } diff --git a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift index 749762a50a..2a9a8b095d 100644 --- a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift @@ -8,17 +8,19 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { public var crashOnLongQueries: Bool public var chatListPhotos: Bool public var knockoutWallpaper: Bool + public var gradientBubbles: Bool public static var defaultSettings: ExperimentalUISettings { - return ExperimentalUISettings(keepChatNavigationStack: false, skipReadHistory: false, crashOnLongQueries: false, chatListPhotos: false, knockoutWallpaper: false) + return ExperimentalUISettings(keepChatNavigationStack: false, skipReadHistory: false, crashOnLongQueries: false, chatListPhotos: false, knockoutWallpaper: false, gradientBubbles: false) } - public init(keepChatNavigationStack: Bool, skipReadHistory: Bool, crashOnLongQueries: Bool, chatListPhotos: Bool, knockoutWallpaper: Bool) { + public init(keepChatNavigationStack: Bool, skipReadHistory: Bool, crashOnLongQueries: Bool, chatListPhotos: Bool, knockoutWallpaper: Bool, gradientBubbles: Bool) { self.keepChatNavigationStack = keepChatNavigationStack self.skipReadHistory = skipReadHistory self.crashOnLongQueries = crashOnLongQueries self.chatListPhotos = chatListPhotos self.knockoutWallpaper = knockoutWallpaper + self.gradientBubbles = gradientBubbles } public init(decoder: PostboxDecoder) { @@ -27,6 +29,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { self.crashOnLongQueries = decoder.decodeInt32ForKey("crashOnLongQueries", orElse: 0) != 0 self.chatListPhotos = decoder.decodeInt32ForKey("chatListPhotos", orElse: 0) != 0 self.knockoutWallpaper = decoder.decodeInt32ForKey("knockoutWallpaper", orElse: 0) != 0 + self.gradientBubbles = decoder.decodeInt32ForKey("gradientBubbles", orElse: 0) != 0 } public func encode(_ encoder: PostboxEncoder) { @@ -35,6 +38,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { encoder.encodeInt32(self.crashOnLongQueries ? 1 : 0, forKey: "crashOnLongQueries") encoder.encodeInt32(self.chatListPhotos ? 1 : 0, forKey: "chatListPhotos") encoder.encodeInt32(self.knockoutWallpaper ? 1 : 0, forKey: "knockoutWallpaper") + encoder.encodeInt32(self.gradientBubbles ? 1 : 0, forKey: "gradientBubbles") } public func isEqual(to: PreferencesEntry) -> Bool { From c17a772d5d48877d371661e10fef1ad8811a1b42 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 18:49:40 +0400 Subject: [PATCH 69/86] Move gradients to experiments --- .../SettingsUI/Sources/DebugController.swift | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/submodules/SettingsUI/Sources/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift index 9c9be159f9..7adea6bca2 100644 --- a/submodules/SettingsUI/Sources/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -69,6 +69,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { case optimizeDatabase(PresentationTheme) case photoPreview(PresentationTheme, Bool) case knockoutWallpaper(PresentationTheme, Bool) + case gradientBubbles(PresentationTheme, Bool) case versionInfo(PresentationTheme) var section: ItemListSectionId { @@ -81,7 +82,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .enableRaiseToSpeak, .keepChatNavigationStack, .skipReadHistory, .crashOnSlowQueries: return DebugControllerSection.experiments.rawValue - case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper: + case .clearTips, .reimport, .resetData, .resetDatabase, .resetHoles, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .gradientBubbles: return DebugControllerSection.experiments.rawValue case .versionInfo: return DebugControllerSection.info.rawValue @@ -132,8 +133,10 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 19 case .knockoutWallpaper: return 20 - case .versionInfo: + case .gradientBubbles: return 21 + case .versionInfo: + return 22 } } @@ -501,6 +504,16 @@ private enum DebugControllerEntry: ItemListNodeEntry { }) }).start() }) + case let .gradientBubbles(theme, value): + return ItemListSwitchItem(theme: theme, title: "Gradient", value: value, sectionId: self.section, style: .blocks, updated: { value in + let _ = arguments.sharedContext.accountManager.transaction ({ transaction in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { settings in + var settings = settings as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings + settings.gradientBubbles = value + return settings + }) + }).start() + }) case let .versionInfo(theme): let bundle = Bundle.main let bundleId = bundle.bundleIdentifier ?? "" @@ -540,6 +553,7 @@ private func debugControllerEntries(presentationData: PresentationData, loggingS entries.append(.optimizeDatabase(presentationData.theme)) entries.append(.photoPreview(presentationData.theme, experimentalSettings.chatListPhotos)) entries.append(.knockoutWallpaper(presentationData.theme, experimentalSettings.knockoutWallpaper)) + entries.append(.gradientBubbles(presentationData.theme, experimentalSettings.gradientBubbles)) entries.append(.versionInfo(presentationData.theme)) From c05c59a1b71143f596872fde4ce638c5e6352f98 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 29 Aug 2019 18:10:45 +0300 Subject: [PATCH 70/86] Cloud Themes: wallpaper by slug support --- .../Sources/Themes/EditThemeController.swift | 294 ++++++++++-------- .../Themes/ThemeSettingsChatPreviewItem.swift | 3 - .../TelegramCore/TelegramCore/Themes.swift | 9 +- .../TelegramUI/DeclareEncodables.swift | 2 + .../TelegramUI/OpenChatMessage.swift | 5 +- .../Sources/WallpaperResources.swift | 20 +- 6 files changed, 192 insertions(+), 141 deletions(-) diff --git a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift index bdc257b773..f487613827 100644 --- a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift @@ -176,12 +176,11 @@ private struct EditThemeControllerState: Equatable { var mode: EditThemeControllerMode var title: String var slug: String - var previewTheme: PresentationTheme var updatedTheme: PresentationTheme? var updating: Bool } -private func editThemeControllerEntries(presentationData: PresentationData, state: EditThemeControllerState) -> [EditThemeControllerEntry] { +private func editThemeControllerEntries(presentationData: PresentationData, state: EditThemeControllerState, previewTheme: PresentationTheme) -> [EditThemeControllerEntry] { var entries: [EditThemeControllerEntry] = [] var isCreate = false @@ -196,7 +195,7 @@ private func editThemeControllerEntries(presentationData: PresentationData, stat } entries.append(.chatPreviewHeader(presentationData.theme, presentationData.strings.EditTheme_Preview.uppercased())) - entries.append(.chatPreview(presentationData.theme, state.previewTheme, state.previewTheme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) + entries.append(.chatPreview(presentationData.theme, previewTheme, previewTheme.chat.defaultWallpaper, presentationData.fontSize, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder)) let uploadText: String let uploadInfo: String @@ -221,18 +220,26 @@ private func editThemeControllerEntries(presentationData: PresentationData, stat public func editThemeController(context: AccountContext, mode: EditThemeControllerMode, navigateToChat: ((PeerId) -> Void)? = nil) -> ViewController { let initialState: EditThemeControllerState + let previewThemePromise = Promise() switch mode { case .create: let presentationData = context.sharedContext.currentPresentationData.with { $0 } - initialState = EditThemeControllerState(mode: mode, title: "", slug: "", previewTheme: presentationData.theme.withUpdated(name: "", author: nil, defaultWallpaper: presentationData.chatWallpaper), updatedTheme: nil, updating: false) + initialState = EditThemeControllerState(mode: mode, title: "", slug: "", updatedTheme: nil, updating: false) + previewThemePromise.set(.single(presentationData.theme.withUpdated(name: "", author: nil, defaultWallpaper: presentationData.chatWallpaper))) case let .edit(theme): - let previewTheme: PresentationTheme - if let file = theme.theme.file, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let theme = makePresentationTheme(data: data, resolvedWallpaper: theme.resolvedWallpaper) { - previewTheme = theme + if let file = theme.theme.file, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let theme = makePresentationTheme(data: data) { + if case let .file(file) = theme.chat.defaultWallpaper, file.id == 0 { + previewThemePromise.set(cachedWallpaper(account: context.account, slug: file.slug) + |> map ({ wallpaper -> PresentationTheme in + return theme.withUpdated(name: nil, author: nil, defaultWallpaper: wallpaper?.wallpaper) + })) + } else { + previewThemePromise.set(.single(theme)) + } } else { - previewTheme = context.sharedContext.currentPresentationData.with { $0 }.theme + previewThemePromise.set(.single(context.sharedContext.currentPresentationData.with { $0 }.theme)) } - initialState = EditThemeControllerState(mode: mode, title: theme.theme.title, slug: theme.theme.slug, previewTheme: previewTheme, updatedTheme: nil, updating: false) + initialState = EditThemeControllerState(mode: mode, title: theme.theme.title, slug: theme.theme.slug, updatedTheme: nil, updating: false) } let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) @@ -249,22 +256,50 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll }, openFile: { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let controller = legacyICloudFilePicker(theme: presentationData.theme, mode: .import, documentTypes: ["org.telegram.Telegram-iOS.theme"], completion: { urls in - if let url = urls.first, let data = try? Data(contentsOf: url), let theme = makePresentationTheme(data: data) { - updateState { current in - var state = current - state.previewTheme = theme - state.updatedTheme = theme - return state + if let url = urls.first{ + if let data = try? Data(contentsOf: url), let theme = makePresentationTheme(data: data) { + if case let .file(file) = theme.chat.defaultWallpaper, file.id == 0 { + let _ = (cachedWallpaper(account: context.account, slug: file.slug) + |> mapToSignal { wallpaper -> Signal in + if let wallpaper = wallpaper, case let .file(file) = wallpaper.wallpaper { + var convertedRepresentations: [ImageRepresentationWithReference] = [] + convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: CGSize(width: 100.0, height: 100.0), resource: file.file.resource), reference: .wallpaper(resource: file.file.resource))) + return wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: .standalone(media: file.file), representations: convertedRepresentations, alwaysShowThumbnailFirst: false, thumbnail: false, onlyFullSize: true, autoFetchFullSize: true, synchronousLoad: false) + |> map { _ -> TelegramWallpaper? in + return wallpaper.wallpaper + } + } else { + return .single(nil) + } + } + |> deliverOnMainQueue).start(next: { wallpaper in + let updatedTheme = theme.withUpdated(name: nil, author: nil, defaultWallpaper: wallpaper) + updateState { current in + var state = current + previewThemePromise.set(.single(updatedTheme)) + state.updatedTheme = updatedTheme + return state + } + }) + } else { + updateState { current in + var state = current + previewThemePromise.set(.single(theme)) + state.updatedTheme = theme + return state + } + } + } + else { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.EditTheme_FileReadError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) } - } else { - presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.EditTheme_FileReadError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) } }) presentControllerImpl?(controller, nil) }) - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get()) - |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, EditThemeControllerEntry.ItemGenerationArguments)) in + let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get(), previewThemePromise.get()) + |> map { presentationData, state, previewTheme -> (ItemListControllerState, (ItemListNodeState, EditThemeControllerEntry.ItemGenerationArguments)) in let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { dismissImpl?() }) @@ -293,75 +328,121 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll return state } - let saveThemeTemplateFile: (String, LocalFileMediaResource, @escaping () -> Void) -> Void = { title, resource, completion in - let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: resource.fileId), partialReference: nil, resource: resource, previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgtheme-ios", size: nil, attributes: [.FileName(fileName: "\(title).tgios-theme")]) - let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: nil, localGroupingKey: nil) + let _ = (previewThemePromise.get() + |> deliverOnMainQueue).start(next: { previewTheme in + let saveThemeTemplateFile: (String, LocalFileMediaResource, @escaping () -> Void) -> Void = { title, resource, completion in + let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: resource.fileId), partialReference: nil, resource: resource, previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgtheme-ios", size: nil, attributes: [.FileName(fileName: "\(title).tgios-theme")]) + let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: nil, localGroupingKey: nil) - let _ = enqueueMessages(account: context.account, peerId: context.account.peerId, messages: [message]).start() + let _ = enqueueMessages(account: context.account, peerId: context.account.peerId, messages: [message]).start() - if let navigateToChat = navigateToChat { - presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.EditTheme_ThemeTemplateAlert, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { + if let navigateToChat = navigateToChat { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.EditTheme_ThemeTemplateAlert, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Settings_SavedMessages, action: { + completion() + navigateToChat(context.account.peerId) + }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { + completion() + })], actionLayout: .vertical), nil) + } else { completion() - navigateToChat(context.account.peerId) - }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { - completion() - })], actionLayout: .vertical), nil) - } else { - completion() + } } - } - - let theme: PresentationTheme? - let hasCustomFile: Bool - if let updatedTheme = state.updatedTheme { - theme = updatedTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) - hasCustomFile = true - } else { - if case let .edit(info) = mode, let _ = info.theme.file { - theme = nil + + let theme: PresentationTheme? + let hasCustomFile: Bool + if let updatedTheme = state.updatedTheme { + theme = updatedTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) hasCustomFile = true } else { - theme = state.previewTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) - hasCustomFile = false - } - } - - let themeResource: LocalFileMediaResource? - let themeData: Data? - let themeThumbnailData: Data? - if let theme = theme, let themeString = encodePresentationTheme(theme), let data = themeString.data(using: .utf8) { - let resource = LocalFileMediaResource(fileId: arc4random64()) - context.account.postbox.mediaBox.storeResourceData(resource.id, data: data) - context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) - themeResource = resource - themeData = data - - let themeThumbnail = generateImage(CGSize(width: 213, height: 320.0), contextGenerator: { size, context in - if let image = generateImage(CGSize(width: 194.0, height: 291.0), contextGenerator: { size, c in - drawThemeImage(context: c, theme: theme, size: size) - })?.cgImage { - context.draw(image, in: CGRect(origin: CGPoint(), size: size)) + if case let .edit(info) = mode, let _ = info.theme.file { + theme = nil + hasCustomFile = true + } else { + theme = previewTheme.withUpdated(name: state.title, author: "", defaultWallpaper: nil) + hasCustomFile = false } - }, scale: 1.0) - themeThumbnailData = themeThumbnail?.jpegData(compressionQuality: 0.6) - } else { - themeResource = nil - themeData = nil - themeThumbnailData = nil - } - - let resolvedWallpaper: TelegramWallpaper? - if let theme = theme, case let .file(file) = theme.chat.defaultWallpaper, file.id != 0 { - resolvedWallpaper = theme.chat.defaultWallpaper - updateCachedWallpaper(account: context.account, wallpaper: theme.chat.defaultWallpaper) - } else { - resolvedWallpaper = nil - } - - switch mode { - case .create: - if let themeResource = themeResource { - let _ = (createTheme(account: context.account, title: state.title, resource: themeResource, thumbnailData: themeThumbnailData) + } + + let themeResource: LocalFileMediaResource? + let themeData: Data? + let themeThumbnailData: Data? + if let theme = theme, let themeString = encodePresentationTheme(theme), let data = themeString.data(using: .utf8) { + let resource = LocalFileMediaResource(fileId: arc4random64()) + context.account.postbox.mediaBox.storeResourceData(resource.id, data: data) + context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) + themeResource = resource + themeData = data + + let themeThumbnail = generateImage(CGSize(width: 213, height: 320.0), contextGenerator: { size, context in + if let image = generateImage(CGSize(width: 194.0, height: 291.0), contextGenerator: { size, c in + drawThemeImage(context: c, theme: theme, size: size) + })?.cgImage { + context.draw(image, in: CGRect(origin: CGPoint(), size: size)) + } + }, scale: 1.0) + themeThumbnailData = themeThumbnail?.jpegData(compressionQuality: 0.6) + } else { + themeResource = nil + themeData = nil + themeThumbnailData = nil + } + + let resolvedWallpaper: TelegramWallpaper? + if let theme = theme, case let .file(file) = theme.chat.defaultWallpaper, file.id != 0 { + resolvedWallpaper = theme.chat.defaultWallpaper + updateCachedWallpaper(account: context.account, wallpaper: theme.chat.defaultWallpaper) + } else { + resolvedWallpaper = nil + } + + switch mode { + case .create: + if let themeResource = themeResource { + let _ = (createTheme(account: context.account, title: state.title, resource: themeResource, thumbnailData: themeThumbnailData) + |> deliverOnMainQueue).start(next: { next in + if case let .result(resultTheme) = next { + let _ = applyTheme(accountManager: context.sharedContext.accountManager, account: context.account, theme: resultTheme).start() + let _ = (context.sharedContext.accountManager.transaction { transaction -> Void in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in + let current: PresentationThemeSettings + if let entry = entry as? PresentationThemeSettings { + current = entry + } else { + current = PresentationThemeSettings.defaultSettings + } + + if let resource = resultTheme.file?.resource, let data = themeData { + context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) + } + + let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: resolvedWallpaper)) + var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers + if let theme = theme { + themeSpecificChatWallpapers[themeReference.index] = theme.chat.defaultWallpaper + } + + return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) + }) + } |> deliverOnMainQueue).start(completed: { + if !hasCustomFile { + saveThemeTemplateFile(state.title, themeResource, { + dismissImpl?() + }) + } else { + dismissImpl?() + } + }) + } + }, error: { error in + arguments.updateState { current in + var state = current + state.updating = false + return state + } + }) + } + case let .edit(info): + let _ = (updateTheme(account: context.account, theme: info.theme, title: state.title, slug: state.slug, resource: themeResource) |> deliverOnMainQueue).start(next: { next in if case let .result(resultTheme) = next { let _ = applyTheme(accountManager: context.sharedContext.accountManager, account: context.account, theme: resultTheme).start() @@ -387,7 +468,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) } |> deliverOnMainQueue).start(completed: { - if !hasCustomFile { + if let themeResource = themeResource, !hasCustomFile { saveThemeTemplateFile(state.title, themeResource, { dismissImpl?() }) @@ -403,51 +484,8 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll return state } }) - } - case let .edit(info): - let _ = (updateTheme(account: context.account, theme: info.theme, title: state.title, slug: state.slug, resource: themeResource) - |> deliverOnMainQueue).start(next: { next in - if case let .result(resultTheme) = next { - let _ = applyTheme(accountManager: context.sharedContext.accountManager, account: context.account, theme: resultTheme).start() - let _ = (context.sharedContext.accountManager.transaction { transaction -> Void in - transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationThemeSettings, { entry in - let current: PresentationThemeSettings - if let entry = entry as? PresentationThemeSettings { - current = entry - } else { - current = PresentationThemeSettings.defaultSettings - } - - if let resource = resultTheme.file?.resource, let data = themeData { - context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) - } - - let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: resolvedWallpaper)) - var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers - if let theme = theme { - themeSpecificChatWallpapers[themeReference.index] = theme.chat.defaultWallpaper - } - - return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) - }) - } |> deliverOnMainQueue).start(completed: { - if let themeResource = themeResource, !hasCustomFile { - saveThemeTemplateFile(state.title, themeResource, { - dismissImpl?() - }) - } else { - dismissImpl?() - } - }) - } - }, error: { error in - arguments.updateState { current in - var state = current - state.updating = false - return state - } - }) - } + } + }) }) } @@ -463,7 +501,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll } } let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) - let listState = ItemListNodeState(entries: editThemeControllerEntries(presentationData: presentationData, state: state), style: .blocks, focusItemTag: focusItemTag, emptyStateItem: nil, animateChanges: false) + let listState = ItemListNodeState(entries: editThemeControllerEntries(presentationData: presentationData, state: state, previewTheme: previewTheme), style: .blocks, focusItemTag: focusItemTag, emptyStateItem: nil, animateChanges: false) return (controllerState, (listState, arguments)) } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift index 3cf4de2a2d..411c10018d 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift @@ -124,9 +124,6 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: item.strings.Appearance_PreviewReplyText, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) - //let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: item.componentTheme, wallpaper: item.wallpaper), fontSize: item.fontSize, strings: item.strings, dateTimeFormat: item.dateTimeFormat, nameDisplayOrder: item.nameDisplayOrder, disableAnimations: false, largeEmoji: false) - - //let item2: ChatMessageItem = ChatMessageItem(presentationData: chatPresentationData, context: item.context, chatLocation: .peer(peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: nil, text: item.strings.Appearance_PreviewIncomingText, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: true) let message2 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: nil, text: item.strings.Appearance_PreviewIncomingText, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) let message1 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: TelegramUser(id: item.context.account.peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []), text: item.strings.Appearance_PreviewOutgoingText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index bada345a5b..ccff559eb4 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -260,6 +260,7 @@ private func uploadTheme(account: Account, resource: MediaResource, thumbnailDat public enum CreateThemeError { case generic + case slugOccupied } public enum CreateThemeResult { @@ -319,6 +320,7 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, } let uploadSignal: Signal if let resource = resource { + flags |= 1 << 2 uploadSignal = uploadTheme(account: account, resource: resource, thumbnailData: thumbnailData) |> map(Optional.init) } else { @@ -346,7 +348,12 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, } return account.network.request(Api.functions.account.updateTheme(flags: flags, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: inputDocument)) - |> mapError { _ in return CreateThemeError.generic } + |> mapError { error -> CreateThemeError in + if error.errorDescription.hasPrefix("THEME_SLUG_OCCUPIED") { + return .slugOccupied + } + return .generic + } |> mapToSignal { apiTheme -> Signal in if let result = TelegramTheme(apiTheme: apiTheme) { return account.postbox.transaction { transaction -> CreateThemeResult in diff --git a/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift b/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift index 11cc745962..5ba39fe5e9 100644 --- a/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift +++ b/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift @@ -8,6 +8,7 @@ import LocalMediaResources import WebSearchUI import InstantPageCache import SettingsUI +import WallpaperResources private var telegramUIDeclaredEncodables: Void = { declareEncodable(InAppNotificationSettings.self, f: { InAppNotificationSettings(decoder: $0) }) @@ -40,6 +41,7 @@ private var telegramUIDeclaredEncodables: Void = { declareEncodable(InstantPageStoredState.self, f: { InstantPageStoredState(decoder: $0) }) declareEncodable(InstantPageStoredDetailsState.self, f: { InstantPageStoredDetailsState(decoder: $0) }) declareEncodable(CachedInstantPage.self, f: { CachedInstantPage(decoder: $0) }) + declareEncodable(CachedWallpaper.self, f: { CachedWallpaper(decoder: $0) }) declareEncodable(WatchPresetSettings.self, f: { WatchPresetSettings(decoder: $0) }) declareEncodable(WebSearchSettings.self, f: { WebSearchSettings(decoder: $0) }) declareEncodable(RecentWebSearchQueryItem.self, f: { RecentWebSearchQueryItem(decoder: $0) }) diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index 2eaeceb1b5..447b148095 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -462,9 +462,8 @@ func openChatTheme(context: AccountContext, message: Message, present: @escaping if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content { let _ = (context.sharedContext.resolveUrl(account: context.account, url: content.url) |> deliverOnMainQueue).start(next: { resolvedUrl in - if case let .theme(slug) = resolvedUrl { - let file = content.files!.first! - if let path = context.account.postbox.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let theme = makePresentationTheme(data: data) { + if case let .theme(slug) = resolvedUrl, let files = content.files { + if let file = files.filter({ $0.mimeType == "application/x-tgtheme-ios" }).first, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let theme = makePresentationTheme(data: data) { let controller = ThemePreviewController(context: context, previewTheme: theme, source: .slug(slug, file)) present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) } diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index 205b3fb165..f46d37391e 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -11,7 +11,7 @@ import PhotoResources import LocalMediaResources import TelegramPresentationData -private func wallpaperDatas(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(Data?, Data?, Bool), NoError> { +private func wallpaperDatas(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, onlyFullSize: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(Data?, Data?, Bool), NoError> { if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = largestImageRepresentation(representations.map({ $0.representation })), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) { let maybeFullSize: Signal @@ -143,10 +143,15 @@ private func wallpaperDatas(account: Account, accountManager: AccountManager, fi } } } else { - - return thumbnailData |> mapToSignal { thumbnailData in + if onlyFullSize { return fullSizeData |> map { (fullSizeData, complete) in - return (thumbnailData, fullSizeData, complete) + return (nil, fullSizeData, complete) + } + } else { + return thumbnailData |> mapToSignal { thumbnailData in + return fullSizeData |> map { (fullSizeData, complete) in + return (thumbnailData, fullSizeData, complete) + } } } } @@ -158,11 +163,14 @@ private func wallpaperDatas(account: Account, accountManager: AccountManager, fi } } -public func wallpaperImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { - let signal = wallpaperDatas(account: account, accountManager: accountManager, fileReference: fileReference, representations: representations, alwaysShowThumbnailFirst: alwaysShowThumbnailFirst, thumbnail: thumbnail, autoFetchFullSize: autoFetchFullSize, synchronousLoad: synchronousLoad) +public func wallpaperImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference? = nil, representations: [ImageRepresentationWithReference], alwaysShowThumbnailFirst: Bool = false, thumbnail: Bool = false, onlyFullSize: Bool = false, autoFetchFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + let signal = wallpaperDatas(account: account, accountManager: accountManager, fileReference: fileReference, representations: representations, alwaysShowThumbnailFirst: alwaysShowThumbnailFirst, thumbnail: thumbnail, onlyFullSize: onlyFullSize, autoFetchFullSize: autoFetchFullSize, synchronousLoad: synchronousLoad) return signal |> map { (thumbnailData, fullSizeData, fullSizeComplete) in + if let fullSizeData = fullSizeData, let fileReference = fileReference { + accountManager.mediaBox.storeResourceData(fileReference.media.resource.id, data: fullSizeData) + } return { arguments in let drawingRect = arguments.drawingRect var fittedSize = arguments.imageSize From 40ad219d97a2418b3baddc7096f2bfe1cba40d5a Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 20:25:05 +0400 Subject: [PATCH 71/86] Cleanup --- .../TelegramCore/TelegramCore/FetchedMediaResource.swift | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift b/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift index 4804fd5553..8f06bcf2f1 100644 --- a/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift +++ b/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift @@ -699,12 +699,7 @@ private final class MediaReferenceRevalidationContextImpl { } } } - }, { [weak self] _ in - /*queue.async { - guard let strongSelf = self else { - return - } - }*/ + }, { _ in })) } From bc7003d6d375ab996d24d02345e3f8653b2abfd7 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 20:25:26 +0400 Subject: [PATCH 72/86] Fetch scheduled messages if necessary --- submodules/TelegramCore/TelegramCore/SearchMessages.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramCore/TelegramCore/SearchMessages.swift b/submodules/TelegramCore/TelegramCore/SearchMessages.swift index 5fb26815b1..2e932f58d8 100644 --- a/submodules/TelegramCore/TelegramCore/SearchMessages.swift +++ b/submodules/TelegramCore/TelegramCore/SearchMessages.swift @@ -413,7 +413,9 @@ func fetchRemoteMessage(postbox: Postbox, source: FetchMessageHistoryHoleSource, return .single(nil) } let signal: Signal - if id.peerId.namespace == Namespaces.Peer.CloudChannel { + if id.namespace == Namespaces.Message.ScheduledCloud { + signal = source.request(Api.functions.messages.getScheduledMessages(peer: peer.inputPeer, id: [id.id])) + } else if id.peerId.namespace == Namespaces.Peer.CloudChannel { if let channel = peer.inputChannel { signal = source.request(Api.functions.channels.getMessages(channel: channel, id: [Api.InputMessage.inputMessageID(id: id.id)])) } else { From c04705502f32ad00c7d51a952c0ba665c3d215f7 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 20:25:48 +0400 Subject: [PATCH 73/86] Fix keyboard animations --- .../TelegramUI/ChatControllerNode.swift | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index f03d95b54e..5495db5a4a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -568,9 +568,11 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { var immediatelyLayoutInputNodeAndAnimateAppearance = false var inputNodeHeightAndOverflow: (CGFloat, CGFloat)? if let inputNode = inputNodeForChatPresentationIntefaceState(self.chatPresentationInterfaceState, context: self.context, currentNode: self.inputNode, interfaceInteraction: self.interfaceInteraction, inputMediaNode: self.inputMediaNode, controllerInteraction: self.controllerInteraction, inputPanelNode: self.inputPanelNode) { - if let _ = self.inputPanelNode as? ChatTextInputPanelNode { - self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) - //inputTextPanelNode.ensureUnfocused() + if let inputPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { + if inputPanelNode.isFocused { + self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) + //inputTextPanelNode.ensureUnfocused() + } } if let inputMediaNode = inputNode as? ChatMediaInputNode, self.inputMediaNode == nil { self.inputMediaNode = inputMediaNode @@ -646,8 +648,10 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { if let inputPanelNode = inputPanelForChatPresentationIntefaceState(self.chatPresentationInterfaceState, context: self.context, currentPanel: self.inputPanelNode, textInputPanelNode: self.textInputPanelNode, interfaceInteraction: self.interfaceInteraction), !previewing { if inputPanelNode !== self.inputPanelNode { if let inputTextPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { - self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) - //inputTextPanelNode.ensureUnfocused() + if inputTextPanelNode.isFocused { + self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) + //inputTextPanelNode.ensureUnfocused() + } let _ = inputTextPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, maxHeight: layout.size.height - insets.top - insets.bottom, transition: transition, interfaceState: self.chatPresentationInterfaceState, metrics: layout.metrics) } dismissedInputPanelNode = self.inputPanelNode @@ -1037,6 +1041,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { apparentNavigateButtonsFrame.origin.y += verticalOffset } + let previousInputPanelBackgroundFrame = self.inputPanelBackgroundNode.frame transition.updateFrame(node: self.inputPanelBackgroundNode, frame: apparentInputBackgroundFrame) transition.updateFrame(node: self.inputPanelBackgroundSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: apparentInputBackgroundFrame.origin.y - UIScreenPixel), size: CGSize(width: apparentInputBackgroundFrame.size.width, height: UIScreenPixel))) transition.updateFrame(node: self.navigateButtons, frame: apparentNavigateButtonsFrame) @@ -1050,7 +1055,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { if let inputPanelNode = self.inputPanelNode, let apparentInputPanelFrame = apparentInputPanelFrame, !inputPanelNode.frame.equalTo(apparentInputPanelFrame) { if immediatelyLayoutInputPanelAndAnimateAppearance { - inputPanelNode.frame = apparentInputPanelFrame.offsetBy(dx: 0.0, dy: apparentInputPanelFrame.height) + inputPanelNode.frame = apparentInputPanelFrame.offsetBy(dx: 0.0, dy: apparentInputPanelFrame.height + previousInputPanelBackgroundFrame.maxY - apparentInputBackgroundFrame.maxY) inputPanelNode.alpha = 0.0 } @@ -1427,9 +1432,11 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { if self.chatPresentationInterfaceStateRequiresInputFocus(chatPresentationInterfaceState) { self.ensureInputViewFocused() } else { - if let _ = self.inputPanelNode as? ChatTextInputPanelNode { - self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) - //inputTextPanelNode.ensureUnfocused() + if let inputPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { + if inputPanelNode.isFocused { + self.context.sharedContext.mainWindow?.simulateKeyboardDismiss(transition: .animated(duration: 0.5, curve: .spring)) + //inputTextPanelNode.ensureUnfocused() + } } } } else { From 7a930fd68a43e527c5b24a9afdcd7a6a0f99485b Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 21:23:26 +0400 Subject: [PATCH 74/86] Fix gallery transition --- .../Display/Display/GlobalOverlayPresentationContext.swift | 4 ++-- submodules/GalleryUI/Sources/GalleryItemTransitionNode.swift | 1 + .../GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift | 2 +- .../InstantPageUI/Sources/InstantPagePlayableVideoNode.swift | 4 ++++ .../TelegramUI/ChatMessageInteractiveMediaNode.swift | 4 ++++ 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/submodules/Display/Display/GlobalOverlayPresentationContext.swift b/submodules/Display/Display/GlobalOverlayPresentationContext.swift index 4794e0b8a8..b9462e2fee 100644 --- a/submodules/Display/Display/GlobalOverlayPresentationContext.swift +++ b/submodules/Display/Display/GlobalOverlayPresentationContext.swift @@ -80,7 +80,7 @@ final class GlobalOverlayPresentationContext { } if updateTrackingNode { - self.currentTrackingNode?.removeFromSupernode() + /*self.currentTrackingNode?.removeFromSupernode() let trackingNode = HierarchyTrackingNode({ [weak self] value in guard let strongSelf = self else { return @@ -91,7 +91,7 @@ final class GlobalOverlayPresentationContext { }) self.currentTrackingNode = trackingNode - keyboardView.layer.addSublayer(trackingNode.layer) + keyboardView.layer.addSublayer(trackingNode.layer)*/ } return keyboardWindow } else { diff --git a/submodules/GalleryUI/Sources/GalleryItemTransitionNode.swift b/submodules/GalleryUI/Sources/GalleryItemTransitionNode.swift index 040a3e0ad4..f3ca3f979e 100644 --- a/submodules/GalleryUI/Sources/GalleryItemTransitionNode.swift +++ b/submodules/GalleryUI/Sources/GalleryItemTransitionNode.swift @@ -3,5 +3,6 @@ import AccountContext public protocol GalleryItemTransitionNode: class { func isAvailableForGalleryTransition() -> Bool + func isAvailableForInstantPageTransition() -> Bool var decoration: UniversalVideoDecoration? { get } } diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index f84bfaad60..08f500b27e 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -922,7 +922,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { videoNode.continuePlayingWithoutSound() } } - } else if let _ = node.0 as? GalleryItemTransitionNode, videoNode.hasAttachedContext { + } else if let instantNode = node.0 as? GalleryItemTransitionNode, instantNode.isAvailableForInstantPageTransition(), videoNode.hasAttachedContext { copyView.removeFromSuperview() let previousFrame = videoNode.frame diff --git a/submodules/InstantPageUI/Sources/InstantPagePlayableVideoNode.swift b/submodules/InstantPageUI/Sources/InstantPagePlayableVideoNode.swift index a96cb1c688..998b3cdcdd 100644 --- a/submodules/InstantPageUI/Sources/InstantPagePlayableVideoNode.swift +++ b/submodules/InstantPageUI/Sources/InstantPagePlayableVideoNode.swift @@ -86,6 +86,10 @@ final class InstantPagePlayableVideoNode: ASDisplayNode, InstantPageNode, Galler return true } + func isAvailableForInstantPageTransition() -> Bool { + return true + } + override func didLoad() { super.didLoad() diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index bd592ac4ad..245fb998ed 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -153,6 +153,10 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio return self.automaticPlayback ?? false } + func isAvailableForInstantPageTransition() -> Bool { + return false + } + override func didLoad() { super.didLoad() From 66966860ca323620fa829154d1ddce0a98863562 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 21:48:56 +0400 Subject: [PATCH 75/86] Don't animate avatar with message bubble --- .../TelegramUI/ChatMessageBubbleItemNode.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 9f4eccce17..ce6017c57e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -276,7 +276,15 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode if let subnodes = self.subnodes { for node in subnodes { - if node !== self.accessoryItemNode { + if let contextNode = node as? ContextContentContainingNode { + if let contextSubnodes = contextNode.contentNode.subnodes { + for contextSubnode in contextSubnodes { + if contextSubnode !== self.accessoryItemNode { + contextSubnode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + } + } + } else if node !== self.accessoryItemNode { node.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) } } From 1610b39fec4704f5048f86ce7d4207687d621372 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 22:24:48 +0400 Subject: [PATCH 76/86] Use default effect on older systems --- submodules/Display/Display/UIKitUtils.m | 36 ++++++++++++++----------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/submodules/Display/Display/UIKitUtils.m b/submodules/Display/Display/UIKitUtils.m index c7989b2c86..7d5210910d 100644 --- a/submodules/Display/Display/UIKitUtils.m +++ b/submodules/Display/Display/UIKitUtils.m @@ -155,22 +155,26 @@ static void setNilField(CustomBlurEffect *object, NSString *name) { } UIBlurEffect *makeCustomZoomBlurEffect() { - NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; - CustomBlurEffect *result = (CustomBlurEffect *)[NSClassFromString(string) effectWithStyle:0]; - - setField(result, encodeText(@"tfuCmvsSbejvt;", -1), 10.0); - setField(result, encodeText(@"tfu[ppn;", -1), 0.015); - setNilField(result, encodeText(@"tfuDpmpsUjou;", -1)); - setField(result, encodeText(@"tfuDpmpsUjouBmqib;", -1), 0.0); - setField(result, encodeText(@"tfuEbslfojohUjouBmqib;", -1), 0.0); - setField(result, encodeText(@"tfuHsbztdbmfUjouBmqib;", -1), 0.0); - setField(result, encodeText(@"tfuTbuvsbujpoEfmubGbdups;", -1), 1.0); - - if ([UIScreen mainScreen].scale > 2.5f) { - setField(result, encodeText(@"setScale:", 0), 0.3); + if (@available(iOS 11.0, *)) { + NSString *string = [@[@"_", @"UI", @"Custom", @"BlurEffect"] componentsJoinedByString:@""]; + CustomBlurEffect *result = (CustomBlurEffect *)[NSClassFromString(string) effectWithStyle:0]; + + setField(result, encodeText(@"tfuCmvsSbejvt;", -1), 10.0); + setField(result, encodeText(@"tfu[ppn;", -1), 0.015); + setNilField(result, encodeText(@"tfuDpmpsUjou;", -1)); + setField(result, encodeText(@"tfuDpmpsUjouBmqib;", -1), 0.0); + setField(result, encodeText(@"tfuEbslfojohUjouBmqib;", -1), 0.0); + setField(result, encodeText(@"tfuHsbztdbmfUjouBmqib;", -1), 0.0); + setField(result, encodeText(@"tfuTbuvsbujpoEfmubGbdups;", -1), 1.0); + + if ([UIScreen mainScreen].scale > 2.5f) { + setField(result, encodeText(@"setScale:", 0), 0.3); + } else { + setField(result, encodeText(@"setScale:", 0), 0.5); + } + + return result; } else { - setField(result, encodeText(@"setScale:", 0), 0.5); + return [UIBlurEffect effectWithStyle:UIBlurEffectStyleRegular]; } - - return result; } From 339a01463e57c38ee4f2dfe7c6087cbdaa857545 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Thu, 29 Aug 2019 21:41:02 +0300 Subject: [PATCH 77/86] no message --- submodules/TelegramCore/TelegramCore/Themes.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index e5e22a50c4..e816cea045 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -92,6 +92,7 @@ public func telegramThemes(postbox: Postbox, network: Network, forceUpdate: Bool public enum GetThemeError { case generic case unsupported + case slugInvalid } public func getTheme(account: Account, slug: String) -> Signal { @@ -100,6 +101,9 @@ public func getTheme(account: Account, slug: String) -> Signal mapToSignal { theme -> Signal in From edd5fe34d6455e6722689b999d48aca283323d26 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 23:01:05 +0400 Subject: [PATCH 78/86] Don't send preview frame after scrubbing was stopped --- .../GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 08f500b27e..0f65cb8abe 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -287,7 +287,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { guard let strongSelf = self else { return } - if let result = result { + if let result = result, strongSelf.scrubbingFrames { switch result { case .waitingForData: strongSelf.footerContentNode.setFramePreviewImageIsLoading() From c68b4c5330c2c81ec9696fafe989ca14b84b510f Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 23:02:00 +0400 Subject: [PATCH 79/86] Don't report screenshots while setting up a chat or after it was terminated --- ...tSecretChatMessageAutoremoveTimeoutInteractively.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramCore/TelegramCore/SetSecretChatMessageAutoremoveTimeoutInteractively.swift b/submodules/TelegramCore/TelegramCore/SetSecretChatMessageAutoremoveTimeoutInteractively.swift index 8859413bd9..a03dcc3e59 100644 --- a/submodules/TelegramCore/TelegramCore/SetSecretChatMessageAutoremoveTimeoutInteractively.swift +++ b/submodules/TelegramCore/TelegramCore/SetSecretChatMessageAutoremoveTimeoutInteractively.swift @@ -28,7 +28,13 @@ public func setSecretChatMessageAutoremoveTimeoutInteractively(account: Account, public func addSecretChatMessageScreenshot(account: Account, peerId: PeerId) -> Signal { return account.postbox.transaction { transaction -> Void in - if let peer = transaction.getPeer(peerId) as? TelegramSecretChat, let state = transaction.getPeerChatState(peerId) as? SecretChatState { + if let _ = transaction.getPeer(peerId) as? TelegramSecretChat, let state = transaction.getPeerChatState(peerId) as? SecretChatState { + switch state.embeddedState { + case .handshake, .terminated: + return + default: + break + } let _ = enqueueMessages(transaction: transaction, account: account, peerId: peerId, messages: [(true, .message(text: "", attributes: [], mediaReference: .standalone(media: TelegramMediaAction(action: TelegramMediaActionType.historyScreenshot)), replyToMessageId: nil, localGroupingKey: nil))]) } } From db8c1f104ae916e8676770c348daaf91a4fee938 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 29 Aug 2019 23:02:37 +0400 Subject: [PATCH 80/86] Check if keyboard is actually visible when calculating height --- .../Display/Display/KeyboardManager.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/submodules/Display/Display/KeyboardManager.swift b/submodules/Display/Display/KeyboardManager.swift index 086f578ea0..0a63a1ebb4 100644 --- a/submodules/Display/Display/KeyboardManager.swift +++ b/submodules/Display/Display/KeyboardManager.swift @@ -23,6 +23,26 @@ private func getFirstResponder(_ view: UIView) -> UIView? { } } +private func isViewVisibleInHierarchy(_ view: UIView, _ initial: Bool = true) -> Bool { + guard let window = view.window else { + return false + } + if view.isHidden || view.alpha == 0.0 { + return false + } + if view.superview === window { + return true + } else if let superview = view.superview { + if initial && view.frame.minY >= superview.frame.height { + return false + } else { + return isViewVisibleInHierarchy(superview, false) + } + } else { + return false + } +} + class KeyboardManager { private let host: StatusBarHost @@ -44,6 +64,9 @@ class KeyboardManager { guard let keyboardView = self.host.keyboardView else { return 0.0 } + if !isViewVisibleInHierarchy(keyboardView) { + return 0.0 + } return keyboardView.bounds.height } From 5674265ccf3191aa3a7693ab30a2edd29786de1d Mon Sep 17 00:00:00 2001 From: overtake <> Date: Thu, 29 Aug 2019 22:03:10 +0300 Subject: [PATCH 81/86] fixes [skip ci] --- .../TelegramCore/TelegramCore/Themes.swift | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index e816cea045..2775a36db0 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -264,6 +264,7 @@ private func uploadTheme(account: Account, resource: MediaResource, thumbnailDat public enum CreateThemeError { case generic + case slugInvalid } public enum CreateThemeResult { @@ -279,7 +280,12 @@ public func createTheme(account: Account, title: String, resource: MediaResource case let .complete(file): if let resource = file.resource as? CloudDocumentMediaResource { return account.network.request(Api.functions.account.createTheme(slug: "", title: title, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)))) - |> mapError { _ in return CreateThemeError.generic } + |> mapError { error in + if error.errorDescription == "THEME_SLUG_INVALID" { + return .slugInvalid + } + return CreateThemeError.generic + } |> mapToSignal { apiTheme -> Signal in if let theme = TelegramTheme(apiTheme: apiTheme) { return account.postbox.transaction { transaction -> CreateThemeResult in @@ -318,7 +324,7 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, if let _ = title { flags |= 1 << 1 } - if let _ = slug { + if let slug = slug, !slug.isEmpty { flags |= 1 << 0 } if let _ = resource { @@ -353,7 +359,12 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, } return account.network.request(Api.functions.account.updateTheme(flags: flags, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: inputDocument)) - |> mapError { _ in return CreateThemeError.generic } + |> mapError { error in + if error.errorDescription == "THEME_SLUG_INVALID" { + return .slugInvalid + } + return CreateThemeError.generic + } |> mapToSignal { apiTheme -> Signal in if let result = TelegramTheme(apiTheme: apiTheme) { return account.postbox.transaction { transaction -> CreateThemeResult in From 2c624975c58c7305264ec3080d00e20d0112d209 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 29 Aug 2019 22:08:13 +0300 Subject: [PATCH 82/86] Cloud Themes wallpapers improvements --- .../Sources/Themes/EditThemeController.swift | 23 ++- .../ThemeAccentColorControllerNode.swift | 6 +- .../Themes/ThemePreviewController.swift | 11 ++ .../Themes/ThemePreviewControllerNode.swift | 34 ++-- .../HistoryViewStateValidation.swift | 36 ++-- .../TelegramCore/MessageUtils.swift | 2 +- .../Sources/PresentationThemeCodable.swift | 2 +- .../TelegramUI/ChatController.swift | 4 +- .../TelegramUI/ChatHistoryListNode.swift | 52 ++++-- .../ChatHistoryViewForLocation.swift | 2 +- .../TelegramUI/OpenChatMessage.swift | 1 + .../Sources/PresentationThemeSettings.swift | 14 +- .../Sources/WallpaperResources.swift | 167 ++++++++++++++++-- 13 files changed, 277 insertions(+), 77 deletions(-) diff --git a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift index f487613827..92e97264fc 100644 --- a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift @@ -226,20 +226,24 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll let presentationData = context.sharedContext.currentPresentationData.with { $0 } initialState = EditThemeControllerState(mode: mode, title: "", slug: "", updatedTheme: nil, updating: false) previewThemePromise.set(.single(presentationData.theme.withUpdated(name: "", author: nil, defaultWallpaper: presentationData.chatWallpaper))) - case let .edit(theme): - if let file = theme.theme.file, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let theme = makePresentationTheme(data: data) { + case let .edit(info): + if let file = info.theme.file, let path = context.sharedContext.accountManager.mediaBox.completedResourcePath(file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let theme = makePresentationTheme(data: data, resolvedWallpaper: info.resolvedWallpaper) { if case let .file(file) = theme.chat.defaultWallpaper, file.id == 0 { previewThemePromise.set(cachedWallpaper(account: context.account, slug: file.slug) |> map ({ wallpaper -> PresentationTheme in - return theme.withUpdated(name: nil, author: nil, defaultWallpaper: wallpaper?.wallpaper) + if let wallpaper = wallpaper { + return theme.withUpdated(name: nil, author: nil, defaultWallpaper: wallpaper.wallpaper) + } else { + return theme.withUpdated(name: nil, author: nil, defaultWallpaper: .color(Int32(bitPattern: theme.chatList.backgroundColor.rgb))) + } })) } else { - previewThemePromise.set(.single(theme)) + previewThemePromise.set(.single(theme.withUpdated(name: nil, author: nil, defaultWallpaper: info.resolvedWallpaper))) } } else { previewThemePromise.set(.single(context.sharedContext.currentPresentationData.with { $0 }.theme)) } - initialState = EditThemeControllerState(mode: mode, title: theme.theme.title, slug: theme.theme.slug, updatedTheme: nil, updating: false) + initialState = EditThemeControllerState(mode: mode, title: info.theme.title, slug: info.theme.slug, updatedTheme: nil, updating: false) } let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) @@ -373,9 +377,13 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll themeResource = resource themeData = data + var wallpaperImage: UIImage? + if case .file = theme.chat.defaultWallpaper { + wallpaperImage = chatControllerBackgroundImage(theme: theme, wallpaper: theme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: false) + } let themeThumbnail = generateImage(CGSize(width: 213, height: 320.0), contextGenerator: { size, context in if let image = generateImage(CGSize(width: 194.0, height: 291.0), contextGenerator: { size, c in - drawThemeImage(context: c, theme: theme, size: size) + drawThemeImage(context: c, theme: theme, wallpaperImage: wallpaperImage, size: size) })?.cgImage { context.draw(image, in: CGRect(origin: CGPoint(), size: size)) } @@ -410,17 +418,14 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll } else { current = PresentationThemeSettings.defaultSettings } - if let resource = resultTheme.file?.resource, let data = themeData { context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data) } - let themeReference: PresentationThemeReference = .cloud(PresentationCloudTheme(theme: resultTheme, resolvedWallpaper: resolvedWallpaper)) var themeSpecificChatWallpapers = current.themeSpecificChatWallpapers if let theme = theme { themeSpecificChatWallpapers[themeReference.index] = theme.chat.defaultWallpaper } - return PresentationThemeSettings(chatWallpaper: theme?.chat.defaultWallpaper ?? current.chatWallpaper, theme: themeReference, themeSpecificAccentColors: current.themeSpecificAccentColors, themeSpecificChatWallpapers: themeSpecificChatWallpapers, fontSize: current.fontSize, automaticThemeSwitchSetting: current.automaticThemeSwitchSetting, largeEmoji: current.largeEmoji, disableAnimations: current.disableAnimations) }) } |> deliverOnMainQueue).start(completed: { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index fee231be66..5f0bcd8983 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -75,7 +75,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.scrollNode = ASScrollNode() self.pageControlBackgroundNode = ASDisplayNode() self.pageControlBackgroundNode.backgroundColor = UIColor(rgb: 0x000000, alpha: 0.3) - self.pageControlBackgroundNode.cornerRadius = 6.0 + self.pageControlBackgroundNode.cornerRadius = 8.0 self.pageControlNode = PageControlNode(dotColor: self.theme.chatList.unreadBadgeActiveBackgroundColor, inactiveDotColor: self.presentationData.theme.list.pageIndicatorInactiveColor) @@ -168,10 +168,10 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate } }) - self.serviceColorDisposable = (chatServiceBackgroundColor(wallpaper: self.presentationData.theme.chat.defaultWallpaper, mediaBox: context.account.postbox.mediaBox) + self.serviceColorDisposable = (chatServiceBackgroundColor(wallpaper: self.presentationData.chatWallpaper, mediaBox: context.account.postbox.mediaBox) |> deliverOnMainQueue).start(next: { [weak self] color in if let strongSelf = self { - if strongSelf.presentationData.theme.chat.defaultWallpaper.hasWallpaper { + if strongSelf.presentationData.chatWallpaper.hasWallpaper { strongSelf.pageControlBackgroundNode.backgroundColor = color } else { strongSelf.pageControlBackgroundNode.backgroundColor = .clear diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index d1343ca9d6..d79d7080de 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -10,6 +10,7 @@ import TelegramUIPreferences import AccountContext import ShareController import CounterContollerTitleView +import WallpaperResources public enum ThemePreviewSource { case theme(TelegramTheme) @@ -22,6 +23,7 @@ public final class ThemePreviewController: ViewController { private let previewTheme: PresentationTheme private let source: ThemePreviewSource private let theme = Promise() + private let wallpaper = Promise() private var controllerNode: ThemePreviewControllerNode { return self.displayNode as! ThemePreviewControllerNode @@ -57,6 +59,15 @@ public final class ThemePreviewController: ViewController { themeName = previewTheme.name.string } + if case let .file(file) = previewTheme.chat.defaultWallpaper, file.id == 0 { + self.wallpaper.set(cachedWallpaper(account: context.account, slug: file.slug) + |> mapToSignal { wallpaper in + return .single(wallpaper?.wallpaper ?? .color(Int32(bitPattern: previewTheme.chatList.backgroundColor.rgb))) + }) + } else { + self.wallpaper.set(.single(previewTheme.chat.defaultWallpaper)) + } + if let author = previewTheme.author { let titleView = CounterContollerTitleView(theme: self.previewTheme) titleView.title = CounterContollerTitle(title: themeName, counter: author) diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 419713d492..535ecd470f 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -30,6 +30,8 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { private let previewTheme: PresentationTheme private var presentationData: PresentationData + public let wallpaperPromise = Promise() + private let referenceTimestamp: Int32 private let scrollNode: ASScrollNode @@ -40,13 +42,15 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { private var chatNodes: [ListViewItemNode]? private let maskNode: ASImageNode - private let chatBackgroundNode: WallpaperBackgroundNode + private let instantChatBackgroundNode: WallpaperBackgroundNode + private let remoteChatBackgroundNode: TransformImageNode private var messageNodes: [ListViewItemNode]? private let toolbarNode: WallpaperGalleryToolbarNode private var validLayout: (ContainerViewLayout, CGFloat)? + private var wallpaperDisposable: Disposable? private var colorDisposable: Disposable? init(context: AccountContext, previewTheme: PresentationTheme, dismiss: @escaping () -> Void, apply: @escaping () -> Void) { @@ -63,17 +67,20 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.referenceTimestamp = Int32(calendar.date(from: components)?.timeIntervalSince1970 ?? 0.0) self.scrollNode = ASScrollNode() + self.pageControlBackgroundNode = ASDisplayNode() self.pageControlBackgroundNode.backgroundColor = UIColor(rgb: 0x000000, alpha: 0.3) - self.pageControlBackgroundNode.cornerRadius = 6.0 + self.pageControlBackgroundNode.cornerRadius = 8.0 self.pageControlNode = PageControlNode(dotColor: previewTheme.chatList.unreadBadgeActiveBackgroundColor, inactiveDotColor: previewTheme.list.pageIndicatorInactiveColor) self.chatListBackgroundNode = ASDisplayNode() - self.chatBackgroundNode = WallpaperBackgroundNode() - self.chatBackgroundNode.displaysAsynchronously = false - self.chatBackgroundNode.image = chatControllerBackgroundImage(theme: previewTheme, wallpaper: previewTheme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) - self.chatBackgroundNode.motionEnabled = previewTheme.chat.defaultWallpaper.settings?.motion ?? false + self.instantChatBackgroundNode = WallpaperBackgroundNode() + self.instantChatBackgroundNode.displaysAsynchronously = false + self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: previewTheme, wallpaper: previewTheme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) + self.instantChatBackgroundNode.motionEnabled = previewTheme.chat.defaultWallpaper.settings?.motion ?? false + + self.remoteChatBackgroundNode = TransformImageNode() self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.previewTheme, strings: self.presentationData.strings) @@ -94,7 +101,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.maskNode.image = generateMaskImage(color: self.previewTheme.chatList.backgroundColor) if case let .color(value) = self.previewTheme.chat.defaultWallpaper { - self.chatBackgroundNode.backgroundColor = UIColor(rgb: UInt32(bitPattern: value)) + self.instantChatBackgroundNode.backgroundColor = UIColor(rgb: UInt32(bitPattern: value)) } self.pageControlNode.isUserInteractionEnabled = false @@ -107,7 +114,8 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.addSubnode(self.toolbarNode) self.scrollNode.addSubnode(self.chatListBackgroundNode) - self.scrollNode.addSubnode(self.chatBackgroundNode) + self.scrollNode.addSubnode(self.instantChatBackgroundNode) + self.scrollNode.addSubnode(self.remoteChatBackgroundNode) self.toolbarNode.cancel = { dismiss() @@ -116,7 +124,10 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { apply() } - self.colorDisposable = (chatServiceBackgroundColor(wallpaper: self.previewTheme.chat.defaultWallpaper, mediaBox: context.account.postbox.mediaBox) + self.colorDisposable = (self.wallpaperPromise.get() + |> mapToSignal { wallpaper in + return chatServiceBackgroundColor(wallpaper: wallpaper, mediaBox: context.account.postbox.mediaBox) + } |> deliverOnMainQueue).start(next: { [weak self] color in if let strongSelf = self { if strongSelf.previewTheme.chat.defaultWallpaper.hasWallpaper { @@ -294,7 +305,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { itemNode!.subnodeTransform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) itemNode!.isUserInteractionEnabled = false messageNodes.append(itemNode!) - self.chatBackgroundNode.addSubnode(itemNode!) + self.instantChatBackgroundNode.addSubnode(itemNode!) } self.messageNodes = messageNodes } @@ -315,7 +326,8 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let toolbarHeight = 49.0 + layout.intrinsicInsets.bottom self.chatListBackgroundNode.frame = CGRect(x: bounds.width, y: 0.0, width: bounds.width, height: bounds.height) - self.chatBackgroundNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) + self.instantChatBackgroundNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) + self.remoteChatBackgroundNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) self.scrollNode.view.contentSize = CGSize(width: bounds.width * 2.0, height: bounds.height) diff --git a/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift b/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift index 6911b76297..12091534d8 100644 --- a/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift +++ b/submodules/TelegramCore/TelegramCore/HistoryViewStateValidation.swift @@ -138,6 +138,8 @@ final class HistoryViewStateValidationContexts { private var contexts: [Int32: HistoryStateValidationContext] = [:] + private var previousPeerValidationTimestamps: [PeerId: Double] = [:] + init(queue: Queue, postbox: Postbox, network: Network, accountPeerId: PeerId) { self.queue = queue self.postbox = postbox @@ -264,21 +266,27 @@ final class HistoryViewStateValidationContexts { } else if view.namespaces.contains(Namespaces.Message.ScheduledCloud) { if let _ = self.contexts[id] { } else if let location = location, case let .peer(peerId) = location { - let context = HistoryStateValidationContext() - self.contexts[id] = context - - let disposable = MetaDisposable() - let batch = HistoryStateValidationBatch(disposable: disposable) - context.batch = batch - - let messages: [Message] = view.entries.map { $0.message }.filter { $0.id.namespace == Namespaces.Message.ScheduledCloud } + let timestamp = self.network.context.globalTime() + if let previousTimestamp = self.previousPeerValidationTimestamps[peerId], timestamp < previousTimestamp + 60 { + } else { + self.previousPeerValidationTimestamps[peerId] = timestamp + + let context = HistoryStateValidationContext() + self.contexts[id] = context - disposable.set((validateScheduledMessagesBatch(postbox: self.postbox, network: self.network, accountPeerId: peerId, tag: nil, messages: messages, historyState: .scheduledMessages(peerId)) - |> deliverOn(self.queue)).start(completed: { [weak self] in - if let strongSelf = self, let context = strongSelf.contexts[id] { - context.batch = nil - } - })) + let disposable = MetaDisposable() + let batch = HistoryStateValidationBatch(disposable: disposable) + context.batch = batch + + let messages: [Message] = view.entries.map { $0.message }.filter { $0.id.namespace == Namespaces.Message.ScheduledCloud } + + disposable.set((validateScheduledMessagesBatch(postbox: self.postbox, network: self.network, accountPeerId: peerId, tag: nil, messages: messages, historyState: .scheduledMessages(peerId)) + |> deliverOn(self.queue)).start(completed: { [weak self] in + if let strongSelf = self, let context = strongSelf.contexts[id] { + context.batch = nil + } + })) + } } } } diff --git a/submodules/TelegramCore/TelegramCore/MessageUtils.swift b/submodules/TelegramCore/TelegramCore/MessageUtils.swift index 1709b078fe..3a354e6fab 100644 --- a/submodules/TelegramCore/TelegramCore/MessageUtils.swift +++ b/submodules/TelegramCore/TelegramCore/MessageUtils.swift @@ -194,7 +194,7 @@ public extension Message { if self.flags.contains(.Failed) { return true } else if self.id.namespace == Namespaces.Message.ScheduledCloud { - return timestamp > self.timestamp + 30 + return timestamp > self.timestamp + 60 } else { return false } diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index a18ed8f262..d4a617ca26 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -33,7 +33,7 @@ extension TelegramWallpaper: Codable { case "builtin": self = .builtin(WallpaperSettings()) default: - if let color = UIColor(hexString: value) { + if value.count == 6, let color = UIColor(hexString: value) { self = .color(Int32(bitPattern: color.rgb)) } else { self = .file(id: 0, accessHash: 0, isCreator: false, isDefault: false, isPattern: false, isDark: false, slug: value, file: TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], immediateThumbnailData: nil, mimeType: "", size: nil, attributes: []), settings: WallpaperSettings(blur: false, motion: false, color: nil, intensity: nil)) diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index b8ee8e6d9c..c081e71947 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -5561,7 +5561,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let _ = (enqueueMessages(account: self.context.account, peerId: peerId, messages: self.transformEnqueueMessages(messages)) |> deliverOnMainQueue).start(next: { [weak self] _ in - self?.chatDisplayNode.historyNode.scrollToEndOfHistory() + if let strongSelf = self, !strongSelf.presentationInterfaceState.isScheduledMessages { + strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory() + } }) self.donateIntent() diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index 7d22680efb..a1e8346487 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -1075,27 +1075,43 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { } public func scrollScreenToTop() { - var currentMessage: Message? - if let historyView = self.historyView { - if let visibleRange = self.displayedItemRange.loadedRange { - var index = historyView.filteredEntries.count - 1 - loop: for entry in historyView.filteredEntries { - if index >= visibleRange.firstIndex && index <= visibleRange.lastIndex { - if case let .MessageEntry(message, _, _, _, _, _) = entry { - currentMessage = message - break loop - } else if case let .MessageGroupEntry(_, messages, _) = entry { - currentMessage = messages.first?.0 - break loop - } + if let subject = self.subject, case .scheduledMessages = subject { + if let historyView = self.historyView { + if let entry = historyView.filteredEntries.first { + var currentMessage: Message? + if case let .MessageEntry(message, _, _, _, _, _) = entry { + currentMessage = message + } else if case let .MessageGroupEntry(_, messages, _) = entry { + currentMessage = messages.first?.0 + } + if let message = currentMessage, let anchorMessage = self.anchorMessageInCurrentHistoryView() { + self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Scroll(index: .message(message.index), anchorIndex: .message(message.index), sourceIndex: .upperBound, scrollPosition: .bottom(0.0), animated: true), id: self.takeNextHistoryLocationId()) } - index -= 1 } } - } - - if let currentMessage = currentMessage { - self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Scroll(index: .message(currentMessage.index), anchorIndex: .message(currentMessage.index), sourceIndex: .upperBound, scrollPosition: .top(0.0), animated: true), id: self.takeNextHistoryLocationId()) + } else { + var currentMessage: Message? + if let historyView = self.historyView { + if let visibleRange = self.displayedItemRange.loadedRange { + var index = historyView.filteredEntries.count - 1 + loop: for entry in historyView.filteredEntries { + if index >= visibleRange.firstIndex && index <= visibleRange.lastIndex { + if case let .MessageEntry(message, _, _, _, _, _) = entry { + currentMessage = message + break loop + } else if case let .MessageGroupEntry(_, messages, _) = entry { + currentMessage = messages.first?.0 + break loop + } + } + index -= 1 + } + } + } + + if let currentMessage = currentMessage { + self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Scroll(index: .message(currentMessage.index), anchorIndex: .message(currentMessage.index), sourceIndex: .upperBound, scrollPosition: .top(0.0), animated: true), id: self.takeNextHistoryLocationId()) + } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift index 8913fed713..c40297243b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift @@ -53,7 +53,7 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, account: A type = .Generic(type: .UpdateVisible) } } else { - type = .Generic(type: updateType) + type = .Generic(type: .Generic) } return .HistoryView(view: view, type: type, scrollPosition: scrollPosition, flashIndicators: false, originalScrollPosition: chatScrollPosition, initialData: ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData), id: location.id) } diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index 447b148095..8856221b1d 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -367,6 +367,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool { return nil })) case let .theme(media): + params.dismissInput() let path = params.context.account.postbox.mediaBox.completedResourcePath(media.resource) var previewTheme: PresentationTheme? if let path = path, let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) { diff --git a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index 1832a1b0ad..21bbec0ad5 100644 --- a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -98,9 +98,17 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { case 0: self = .builtin(PresentationBuiltinThemeReference(rawValue: decoder.decodeInt32ForKey("t", orElse: 0))!) case 1: - self = .local(decoder.decodeObjectForKey("localTheme", decoder: { PresentationLocalTheme(decoder: $0) }) as! PresentationLocalTheme) + if let localTheme = decoder.decodeObjectForKey("localTheme", decoder: { PresentationLocalTheme(decoder: $0) }) as? PresentationLocalTheme { + self = .local(localTheme) + } else { + self = .builtin(.dayClassic) + } case 2: - self = .cloud(decoder.decodeObjectForKey("cloudTheme", decoder: { PresentationCloudTheme(decoder: $0) }) as! PresentationCloudTheme) + if let cloudTheme = decoder.decodeObjectForKey("cloudTheme", decoder: { PresentationCloudTheme(decoder: $0) }) as? PresentationCloudTheme { + self = .cloud(cloudTheme) + } else { + self = .builtin(.dayClassic) + } default: assertionFailure() self = .builtin(.dayClassic) @@ -438,7 +446,7 @@ public struct PresentationThemeSettings: PreferencesEntry { public init(decoder: PostboxDecoder) { self.chatWallpaper = (decoder.decodeObjectForKey("w", decoder: { TelegramWallpaper(decoder: $0) }) as? TelegramWallpaper) ?? .builtin(WallpaperSettings()) - self.theme = decoder.decodeObjectForKey("t", decoder: { PresentationThemeReference(decoder: $0) }) as! PresentationThemeReference + self.theme = decoder.decodeObjectForKey("t", decoder: { PresentationThemeReference(decoder: $0) }) as? PresentationThemeReference ?? .builtin(.dayClassic) self.themeSpecificChatWallpapers = decoder.decodeObjectDictionaryForKey("themeSpecificChatWallpapers", keyDecoder: { decoder in return decoder.decodeInt64ForKey("k", orElse: 0) diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index f46d37391e..f3b13736f7 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -641,7 +641,7 @@ private func generateBackArrowImage(color: UIColor) -> UIImage? { }) } -public func drawThemeImage(context c: CGContext, theme: PresentationTheme, size: CGSize) { +public func drawThemeImage(context c: CGContext, theme: PresentationTheme, wallpaperImage: UIImage? = nil, size: CGSize) { let drawingRect = CGRect(origin: CGPoint(), size: size) switch theme.chat.defaultWallpaper { @@ -656,6 +656,11 @@ public func drawThemeImage(context c: CGContext, theme: PresentationTheme, size: case let .file(file): c.setFillColor(theme.chatList.backgroundColor.cgColor) c.fill(drawingRect) + + if let image = wallpaperImage, let cgImage = image.cgImage { + let size = image.size.aspectFilled(drawingRect.size) + c.draw(cgImage, in: CGRect(origin: CGPoint(x: (drawingRect.size.width - size.width) / 2.0, y: (drawingRect.size.height - size.height) / 2.0), size: size)) + } default: break } @@ -722,30 +727,162 @@ public func drawThemeImage(context c: CGContext, theme: PresentationTheme, size: } public func themeImage(account: Account, accountManager: AccountManager, fileReference: FileMediaReference, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { - return telegramThemeData(account: account, accountManager: accountManager, resource: fileReference.media.resource, synchronousLoad: synchronousLoad) - |> map { data in - let theme: PresentationTheme? - if let data = data { - theme = makePresentationTheme(data: data) + let maybeFetched = accountManager.mediaBox.resourceData(fileReference.media.resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: synchronousLoad) + let data = maybeFetched + |> take(1) + |> mapToSignal { maybeData -> Signal<(Data?, Data?), NoError> in + if maybeData.complete { + let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) + return .single((loadedData, nil)) } else { - theme = nil + let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) + + let previewRepresentation = fileReference.media.previewRepresentations.first + let fetchedThumbnail: Signal + if let previewRepresentation = previewRepresentation { + fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(previewRepresentation.resource)) + } else { + fetchedThumbnail = .complete() + } + + let thumbnailData: Signal + if let previewRepresentation = previewRepresentation { + thumbnailData = Signal { subscriber in + let fetchedDisposable = fetchedThumbnail.start() + let thumbnailDisposable = account.postbox.mediaBox.resourceData(previewRepresentation.resource).start(next: { next in + let data = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) + if let data = data, data.count > 0 { + subscriber.putNext(data) + } else { + subscriber.putNext(decodedThumbnailData) + } + }, error: subscriber.putError, completed: subscriber.putCompletion) + + return ActionDisposable { + fetchedDisposable.dispose() + thumbnailDisposable.dispose() + } + } + } else { + thumbnailData = .single(decodedThumbnailData) + } + + let reference = fileReference.resourceReference(fileReference.media.resource) + let fullSizeData = Signal { subscriber in + let fetch = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: reference).start() + let disposable = (account.postbox.mediaBox.resourceData(reference.resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: false) + |> map { data -> Data? in + return data.complete ? try? Data(contentsOf: URL(fileURLWithPath: data.path)) : nil + }).start(next: { next in + if let data = next { + accountManager.mediaBox.storeResourceData(reference.resource.id, data: data) + } + subscriber.putNext(next) + }, error: { error in + subscriber.putError(error) + }, completed: { + subscriber.putCompletion() + }) + return ActionDisposable { + fetch.dispose() + disposable.dispose() + } + } + + return thumbnailData |> mapToSignal { thumbnailData in + return fullSizeData |> map { fullSizeData in + return (fullSizeData, thumbnailData) + } + } } + } + |> mapToSignal { (fullSizeData, thumbnailData) -> Signal<(PresentationTheme?, UIImage?, Data?), NoError> in + if let fullSizeData = fullSizeData, let theme = makePresentationTheme(data: fullSizeData) { + if case let .file(file) = theme.chat.defaultWallpaper, file.id == 0 { + return cachedWallpaper(account: account, slug: file.slug) + |> mapToSignal { wallpaper -> Signal<(PresentationTheme?, UIImage?, Data?), NoError> in + if let wallpaper = wallpaper, case let .file(file) = wallpaper.wallpaper { + var convertedRepresentations: [ImageRepresentationWithReference] = [] + convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: CGSize(width: 100.0, height: 100.0), resource: file.file.resource), reference: .wallpaper(resource: file.file.resource))) + return wallpaperImage(account: account, accountManager: accountManager, fileReference: .standalone(media: file.file), representations: convertedRepresentations, alwaysShowThumbnailFirst: false, thumbnail: false, onlyFullSize: true, autoFetchFullSize: true, synchronousLoad: false) + |> map { _ -> (PresentationTheme?, UIImage?, Data?) in + if let path = accountManager.mediaBox.completedResourcePath(file.file.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let image = UIImage(data: data) { + return (theme, image, thumbnailData) + } else { + return (theme, nil, thumbnailData) + } + } + } else { + return .single((theme, nil, thumbnailData)) + } + } + } else { + return .single((theme, nil, thumbnailData)) + } + } else { + return .single((nil, nil, thumbnailData)) + } + } + return data + |> map { theme, wallpaperImage, thumbnailData in return { arguments in - let context = DrawingContext(size: arguments.drawingSize, scale: 0.0, clear: true) + var thumbnailImage: CGImage? + if let thumbnailData = thumbnailData, let imageSource = CGImageSourceCreateWithData(thumbnailData as CFData, nil), let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) { + thumbnailImage = image + } + + var blurredThumbnailImage: UIImage? + if let thumbnailImage = thumbnailImage { + let thumbnailSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height) + if thumbnailSize.width > 200.0 { + blurredThumbnailImage = UIImage(cgImage: thumbnailImage) + } else { + let initialThumbnailContextFittingSize = arguments.imageSize.fitted(CGSize(width: 90.0, height: 90.0)) + + let thumbnailContextSize = thumbnailSize.aspectFitted(initialThumbnailContextFittingSize) + let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) + thumbnailContext.withFlippedContext { c in + c.draw(thumbnailImage, in: CGRect(origin: CGPoint(), size: thumbnailContextSize)) + } + telegramFastBlurMore(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + + var thumbnailContextFittingSize = CGSize(width: floor(arguments.drawingSize.width * 0.5), height: floor(arguments.drawingSize.width * 0.5)) + if thumbnailContextFittingSize.width < 150.0 || thumbnailContextFittingSize.height < 150.0 { + thumbnailContextFittingSize = thumbnailContextFittingSize.aspectFilled(CGSize(width: 150.0, height: 150.0)) + } + + blurredThumbnailImage = thumbnailContext.generateImage() + } + } + let drawingRect = arguments.drawingRect - context.withFlippedContext { c in - c.setBlendMode(.normal) - if let theme = theme { - drawThemeImage(context: c, theme: theme, size: arguments.drawingSize) + if let blurredThumbnailImage = blurredThumbnailImage, theme == nil { + let context = DrawingContext(size: arguments.drawingSize, scale: 0.0, clear: true) + context.withFlippedContext { c in + c.setBlendMode(.copy) + if let cgImage = blurredThumbnailImage.cgImage { + c.interpolationQuality = .none + let fittedSize = blurredThumbnailImage.size.aspectFilled(arguments.drawingSize) + drawImage(context: c, image: cgImage, orientation: .up, in: CGRect(origin: CGPoint(x: (drawingRect.width - fittedSize.width) / 2.0, y: (drawingRect.height - fittedSize.height) / 2.0), size: fittedSize)) + c.setBlendMode(.normal) + } + } + addCorners(context, arguments: arguments) + return context + } + + let context = DrawingContext(size: arguments.drawingSize, scale: 0.0, clear: true) + if let theme = theme { + context.withFlippedContext { c in + c.setBlendMode(.normal) + + drawThemeImage(context: c, theme: theme, wallpaperImage: wallpaperImage, size: arguments.drawingSize) c.setStrokeColor(theme.rootController.navigationBar.separatorColor.cgColor) c.setLineWidth(2.0) let borderPath = UIBezierPath(roundedRect: drawingRect, cornerRadius: 4.0) c.addPath(borderPath.cgPath) c.drawPath(using: .stroke) - } else if let emptyColor = arguments.emptyColor { - c.setFillColor(emptyColor.cgColor) - c.fill(drawingRect) } } addCorners(context, arguments: arguments) From 8231bb2e721be06a1a3ecec90b3cc58d3d09d675 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 29 Aug 2019 22:43:21 +0300 Subject: [PATCH 83/86] API update [skip ci] --- submodules/TelegramApi/Sources/Api3.swift | 111 +++++++++--------- .../TelegramCore/TelegramCore/Themes.swift | 3 +- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 42bf07db5b..293a4adf9f 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -2924,6 +2924,33 @@ public extension Api { }) } + public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-637606386) + serializeInt32(flags, buffer: buffer, boxed: false) + fromPeer.serialize(buffer, true) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(randomId.count)) + for item in randomId { + serializeInt64(item, buffer: buffer, boxed: false) + } + toPeer.serialize(buffer, true) + if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(570955184) @@ -2944,6 +2971,31 @@ public extension Api { }) } + public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1224152952) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt32(id, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} + if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(entities!.count)) + for item in entities! { + item.serialize(buffer, true) + }} + if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } + public static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia], scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-872345397) @@ -2966,33 +3018,6 @@ public extension Api { }) } - public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-637606386) - serializeInt32(flags, buffer: buffer, boxed: false) - fromPeer.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt32(item, buffer: buffer, boxed: false) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(randomId.count)) - for item in randomId { - serializeInt64(item, buffer: buffer, boxed: false) - } - toPeer.serialize(buffer, true) - if Int(flags) & Int(1 << 10) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.forwardMessages", parameters: [("flags", flags), ("fromPeer", fromPeer), ("id", id), ("randomId", randomId), ("toPeer", toPeer), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } - public static func getScheduledHistory(peer: Api.InputPeer, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-490575781) @@ -3064,31 +3089,6 @@ public extension Api { return result }) } - - public static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1224152952) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - serializeInt32(id, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 11) != 0 {serializeString(message!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 14) != 0 {media!.serialize(buffer, true)} - if Int(flags) & Int(1 << 2) != 0 {replyMarkup!.serialize(buffer, true)} - if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) - buffer.appendInt32(Int32(entities!.count)) - for item in entities! { - item.serialize(buffer, true) - }} - if Int(flags) & Int(1 << 15) != 0 {serializeInt32(scheduleDate!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.editMessage", parameters: [("flags", flags), ("peer", peer), ("id", id), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("scheduleDate", scheduleDate)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in - let reader = BufferReader(buffer) - var result: Api.Updates? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates - } - return result - }) - } } public struct channels { public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { @@ -5683,15 +5683,16 @@ public extension Api { }) } - public static func updateTheme(flags: Int32, theme: Api.InputTheme, slug: String?, title: String?, document: Api.InputDocument?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updateTheme(flags: Int32, format: String, theme: Api.InputTheme, slug: String?, title: String?, document: Api.InputDocument?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-124161674) + buffer.appendInt32(999203330) serializeInt32(flags, buffer: buffer, boxed: false) + serializeString(format, buffer: buffer, boxed: false) theme.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {serializeString(slug!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 1) != 0 {serializeString(title!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 2) != 0 {document!.serialize(buffer, true)} - return (FunctionDescription(name: "account.updateTheme", parameters: [("flags", flags), ("theme", theme), ("slug", slug), ("title", title), ("document", document)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Theme? in + return (FunctionDescription(name: "account.updateTheme", parameters: [("flags", flags), ("format", format), ("theme", theme), ("slug", slug), ("title", title), ("document", document)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Theme? in let reader = BufferReader(buffer) var result: Api.Theme? if let signature = reader.readInt32() { diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index 6753b7eafa..3450b719e1 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -332,7 +332,6 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, } let uploadSignal: Signal if let resource = resource { - flags |= 1 << 2 uploadSignal = uploadTheme(account: account, resource: resource, thumbnailData: thumbnailData) |> map(Optional.init) } else { @@ -359,7 +358,7 @@ public func updateTheme(account: Account, theme: TelegramTheme, title: String?, inputDocument = nil } - return account.network.request(Api.functions.account.updateTheme(flags: flags, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: inputDocument)) + return account.network.request(Api.functions.account.updateTheme(flags: flags, format: themeFormat, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), slug: slug, title: title, document: inputDocument)) |> mapError { error in if error.errorDescription == "THEME_SLUG_INVALID" { return .slugInvalid From 569c3d6ac60ddfc3fe8404b1bfe9bb8c13024dc5 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 29 Aug 2019 23:57:12 +0300 Subject: [PATCH 84/86] API update --- .../Themes/ThemePreviewController.swift | 31 +++++---- .../Themes/ThemePreviewControllerNode.swift | 69 +++++++++++++++++-- .../Themes/ThemeSettingsController.swift | 2 +- .../Themes/ThemeSettingsThemeItem.swift | 2 +- .../TelegramCore/TelegramCore/Account.swift | 1 + .../AccountStateManagementUtils.swift | 8 +++ .../TelegramCore/TelegramCore/Themes.swift | 53 ++++++++++++-- 7 files changed, 141 insertions(+), 25 deletions(-) diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index d79d7080de..c2bcfa24e4 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -23,7 +23,6 @@ public final class ThemePreviewController: ViewController { private let previewTheme: PresentationTheme private let source: ThemePreviewSource private let theme = Promise() - private let wallpaper = Promise() private var controllerNode: ThemePreviewControllerNode { return self.displayNode as! ThemePreviewControllerNode @@ -59,15 +58,6 @@ public final class ThemePreviewController: ViewController { themeName = previewTheme.name.string } - if case let .file(file) = previewTheme.chat.defaultWallpaper, file.id == 0 { - self.wallpaper.set(cachedWallpaper(account: context.account, slug: file.slug) - |> mapToSignal { wallpaper in - return .single(wallpaper?.wallpaper ?? .color(Int32(bitPattern: previewTheme.chatList.backgroundColor.rgb))) - }) - } else { - self.wallpaper.set(.single(previewTheme.chat.defaultWallpaper)) - } - if let author = previewTheme.author { let titleView = CounterContollerTitleView(theme: self.previewTheme) titleView.title = CounterContollerTitle(title: themeName, counter: author) @@ -123,11 +113,14 @@ public final class ThemePreviewController: ViewController { switch strongSelf.source { case .theme, .slug: - theme = strongSelf.theme.get() - |> take(1) - |> map { theme in + theme = combineLatest(strongSelf.theme.get() |> take(1), strongSelf.controllerNode.wallpaperPromise.get() |> take(1)) + |> map { theme, wallpaper in if let theme = theme { - return .cloud(PresentationCloudTheme(theme: theme, resolvedWallpaper: nil)) + if case let .file(file) = wallpaper, file.id != 0 { + return .cloud(PresentationCloudTheme(theme: theme, resolvedWallpaper: wallpaper)) + } else { + return .cloud(PresentationCloudTheme(theme: theme, resolvedWallpaper: nil)) + } } else { return nil } @@ -175,6 +168,16 @@ public final class ThemePreviewController: ViewController { } }) self.displayNodeDidLoad() + + let previewTheme = self.previewTheme + if case let .file(file) = previewTheme.chat.defaultWallpaper, file.id == 0 { + self.controllerNode.wallpaperPromise.set(cachedWallpaper(account: self.context.account, slug: file.slug) + |> mapToSignal { wallpaper in + return .single(wallpaper?.wallpaper ?? .color(Int32(bitPattern: previewTheme.chatList.backgroundColor.rgb))) + }) + } else { + self.controllerNode.wallpaperPromise.set(.single(previewTheme.chat.defaultWallpaper)) + } } private func updateStrings() { diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 535ecd470f..f7cd71c286 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import TelegramUIPreferences import AccountContext import ChatListUI +import WallpaperResources private func generateMaskImage(color: UIColor) -> UIImage? { return generateImage(CGSize(width: 1.0, height: 60.0), opaque: false, rotatedContext: { size, context in @@ -42,6 +43,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { private var chatNodes: [ListViewItemNode]? private let maskNode: ASImageNode + private let chatContainerNode: ASDisplayNode private let instantChatBackgroundNode: WallpaperBackgroundNode private let remoteChatBackgroundNode: TransformImageNode private var messageNodes: [ListViewItemNode]? @@ -52,6 +54,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { private var wallpaperDisposable: Disposable? private var colorDisposable: Disposable? + private var statusDisposable: Disposable? init(context: AccountContext, previewTheme: PresentationTheme, dismiss: @escaping () -> Void, apply: @escaping () -> Void) { self.context = context @@ -75,15 +78,25 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.pageControlNode = PageControlNode(dotColor: previewTheme.chatList.unreadBadgeActiveBackgroundColor, inactiveDotColor: previewTheme.list.pageIndicatorInactiveColor) self.chatListBackgroundNode = ASDisplayNode() + + self.chatContainerNode = ASDisplayNode() self.instantChatBackgroundNode = WallpaperBackgroundNode() self.instantChatBackgroundNode.displaysAsynchronously = false self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: previewTheme, wallpaper: previewTheme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) self.instantChatBackgroundNode.motionEnabled = previewTheme.chat.defaultWallpaper.settings?.motion ?? false self.remoteChatBackgroundNode = TransformImageNode() + self.remoteChatBackgroundNode.backgroundColor = previewTheme.chatList.backgroundColor self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.previewTheme, strings: self.presentationData.strings) + if case let .file(file) = previewTheme.chat.defaultWallpaper, file.id == 0 { + self.remoteChatBackgroundNode.isHidden = false + self.toolbarNode.setDoneEnabled(false) + } else { + self.remoteChatBackgroundNode.isHidden = true + } + self.maskNode = ASImageNode() self.maskNode.displaysAsynchronously = false self.maskNode.displayWithoutProcessing = true @@ -114,8 +127,10 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { self.addSubnode(self.toolbarNode) self.scrollNode.addSubnode(self.chatListBackgroundNode) - self.scrollNode.addSubnode(self.instantChatBackgroundNode) - self.scrollNode.addSubnode(self.remoteChatBackgroundNode) + self.scrollNode.addSubnode(self.chatContainerNode) + + self.chatContainerNode.addSubnode(self.instantChatBackgroundNode) + self.chatContainerNode.addSubnode(self.remoteChatBackgroundNode) self.toolbarNode.cancel = { dismiss() @@ -137,10 +152,53 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { } } }) + + self.wallpaperDisposable = (self.wallpaperPromise.get() + |> deliverOnMainQueue).start(next: { [weak self] wallpaper in + guard let strongSelf = self else { + return + } + if case let .file(file) = wallpaper { + let dimensions = file.file.dimensions ?? CGSize(width: 100.0, height: 100.0) + let displaySize = dimensions.dividedByScreenScale().integralFloor + + var convertedRepresentations: [ImageRepresentationWithReference] = [] + for representation in file.file.previewRepresentations { + convertedRepresentations.append(ImageRepresentationWithReference(representation: representation, reference: .wallpaper(resource: representation.resource))) + } + convertedRepresentations.append(ImageRepresentationWithReference(representation: .init(dimensions: dimensions, resource: file.file.resource), reference: .wallpaper(resource: file.file.resource))) + + let fileReference = FileMediaReference.standalone(media: file.file) + let signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: fileReference, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false) + strongSelf.remoteChatBackgroundNode.setSignal(signal) + + let account = strongSelf.context.account + let statusSignal = strongSelf.context.sharedContext.accountManager.mediaBox.resourceStatus(file.file.resource) + |> take(1) + |> mapToSignal { status -> Signal in + if case .Local = status { + return .single(status) + } else { + return account.postbox.mediaBox.resourceStatus(file.file.resource) + } + } + + strongSelf.statusDisposable = (statusSignal + |> deliverOnMainQueue).start(next: { [weak self] status in + if let strongSelf = self, case .Local = status { + strongSelf.toolbarNode.setDoneEnabled(true) + } + }) + + strongSelf.remoteChatBackgroundNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets(), emptyColor: nil))() + } + }) } deinit { self.colorDisposable?.dispose() + self.wallpaperDisposable?.dispose() + self.statusDisposable?.dispose() } override func didLoad() { @@ -305,7 +363,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { itemNode!.subnodeTransform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) itemNode!.isUserInteractionEnabled = false messageNodes.append(itemNode!) - self.instantChatBackgroundNode.addSubnode(itemNode!) + self.chatContainerNode.addSubnode(itemNode!) } self.messageNodes = messageNodes } @@ -326,8 +384,9 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { let toolbarHeight = 49.0 + layout.intrinsicInsets.bottom self.chatListBackgroundNode.frame = CGRect(x: bounds.width, y: 0.0, width: bounds.width, height: bounds.height) - self.instantChatBackgroundNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) - self.remoteChatBackgroundNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) + self.chatContainerNode.frame = CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height) + self.instantChatBackgroundNode.frame = self.chatContainerNode.bounds + self.remoteChatBackgroundNode.frame = self.chatContainerNode.bounds self.scrollNode.view.contentSize = CGSize(width: bounds.width * 2.0, height: bounds.height) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index 2e54688f2e..8a51e2d4aa 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -562,7 +562,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The let cloudThemes: [PresentationThemeReference] = cloudThemes.map { .cloud(PresentationCloudTheme(theme: $0, resolvedWallpaper: nil)) } var availableThemes = defaultThemes - if !defaultThemes.contains(settings.theme) && !cloudThemes.contains(settings.theme) { + if defaultThemes.first(where: { $0.index == settings.theme.index }) == nil && cloudThemes.first(where: { $0.index == settings.theme.index }) == nil { availableThemes.append(settings.theme) } availableThemes.append(contentsOf: cloudThemes) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift index 72f6822ef4..bac5203446 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift @@ -412,7 +412,7 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { updated = true } - let selected = theme == item.currentTheme + let selected = theme.index == item.currentTheme.index if selected { selectedNode = imageNode } diff --git a/submodules/TelegramCore/TelegramCore/Account.swift b/submodules/TelegramCore/TelegramCore/Account.swift index 28d757fcc7..7792dd34c7 100644 --- a/submodules/TelegramCore/TelegramCore/Account.swift +++ b/submodules/TelegramCore/TelegramCore/Account.swift @@ -1305,6 +1305,7 @@ public class Account { self.managedOperationsDisposable.add(managedPendingPeerNotificationSettings(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedSynchronizeAppLogEventsOperations(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedNotificationSettingsBehaviors(postbox: self.postbox).start()) + self.managedOperationsDisposable.add(managedThemesUpdates(accountManager: accountManager, postbox: self.postbox, network: self.network).start()) if !self.supplementary { self.managedOperationsDisposable.add(managedAnimatedEmojiUpdates(postbox: self.postbox, network: self.network).start()) diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index ed73718a1b..af4f8c2a57 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -2955,6 +2955,14 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP updatedEntries.append(OrderedItemListEntry(id: id, contents: theme)) } transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) + accountManager.transaction { transaction in + transaction.updateSharedData(SharedDataKeys.themeSettings, { current in + if let current = current as? ThemeSettings, let theme = current.currentTheme, let updatedTheme = updatedThemes[theme.id] { + return ThemeSettings(currentTheme: updatedTheme) + } + return current + }) + } } addedIncomingMessageIds.append(contentsOf: addedSecretMessageIds) diff --git a/submodules/TelegramCore/TelegramCore/Themes.swift b/submodules/TelegramCore/TelegramCore/Themes.swift index 3450b719e1..f7ee62972b 100644 --- a/submodules/TelegramCore/TelegramCore/Themes.swift +++ b/submodules/TelegramCore/TelegramCore/Themes.swift @@ -115,18 +115,18 @@ public func getTheme(account: Account, slug: String) -> Signal Signal { +private func checkThemeUpdated(network: Network, theme: TelegramTheme) -> Signal { guard let file = theme.file, let fileId = file.id?.id else { return .fail(.generic) } - return account.network.request(Api.functions.account.getTheme(format: themeFormat, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), documentId: fileId)) + return network.request(Api.functions.account.getTheme(format: themeFormat, theme: .inputTheme(id: theme.id, accessHash: theme.accessHash), documentId: fileId)) |> mapError { _ -> GetThemeError in return .generic } - |> map { theme -> CheckThemeUpdatedResult in + |> map { theme -> ThemeUpdatedResult in if let theme = TelegramTheme(apiTheme: theme) { return .updated(theme) } else { @@ -448,3 +448,48 @@ public func applyTheme(accountManager: AccountManager, account: Account, theme: } |> switchToLatest } + +func managedThemesUpdates(accountManager: AccountManager, postbox: Postbox, network: Network) -> Signal { + return accountManager.sharedData(keys: [SharedDataKeys.themeSettings]) + |> mapToSignal { sharedData -> Signal in + let themeSettings = (sharedData.entries[SharedDataKeys.themeSettings] as? ThemeSettings) ?? ThemeSettings(currentTheme: nil) + if let currentTheme = themeSettings.currentTheme { + let poll = Signal { subscriber in + return checkThemeUpdated(network: network, theme: currentTheme).start(next: { result in + if case let .updated(updatedTheme) = result { + let _ = accountManager.transaction { transaction in + transaction.updateSharedData(SharedDataKeys.themeSettings, { _ in + return ThemeSettings(currentTheme: updatedTheme) + }) + }.start() + let _ = postbox.transaction { transaction in + + } + } + subscriber.putCompletion() + }) + } + return ((.complete() |> suspendAwareDelay(1.0 * 60.0 * 60.0, queue: Queue.concurrentDefaultQueue())) |> then(poll)) |> restart + } else { + return .complete() + } + } +} + +public func actualizedTheme(accountManager: AccountManager, theme: TelegramTheme) -> Signal { + var currentTheme = theme + return accountManager.sharedData(keys: [SharedDataKeys.themeSettings]) + |> map { sharedData -> TelegramTheme in + let themeSettings = (sharedData.entries[SharedDataKeys.themeSettings] as? ThemeSettings) ?? ThemeSettings(currentTheme: nil) + if let updatedTheme = themeSettings.currentTheme, updatedTheme.id == currentTheme.id { + if updatedTheme != currentTheme { + currentTheme = updatedTheme + return updatedTheme + } else { + return currentTheme + } + } else { + return theme + } + } +} From b9027825d2af75276aeb6af9a1be05d655e42477 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 30 Aug 2019 01:06:21 +0400 Subject: [PATCH 85/86] Copy goes before Edit --- .../ChatInterfaceStateContextMenus.swift | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift index 7b56e4f7a3..4a65f4bee8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift @@ -382,34 +382,6 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: }))) } - if data.messageActions.options.contains(.sendScheduledNow) { - actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.ScheduledMessages_SendNow, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.actionSheet.primaryTextColor) - }, action: { _, f in - controllerInteraction.sendScheduledMessagesNow(selectAll ? messages.map { $0.id } : [message.id]) - f(.dismissWithoutContent) - }))) - } - - if data.messageActions.options.contains(.editScheduledTime) { - actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.ScheduledMessages_EditTime, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Schedule"), color: theme.actionSheet.primaryTextColor) - }, action: { _, f in - controllerInteraction.editScheduledMessagesTime(selectAll ? messages.map { $0.id } : [message.id]) - f(.dismissWithoutContent) - }))) - } - - if data.canEdit { - actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_MessageDialogEdit, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.actionSheet.primaryTextColor) - }, action: { _, f in - interfaceInteraction.setupEditMessage(messages[0].id, { transition in - f(.custom(transition)) - }) - }))) - } - let resourceAvailable: Bool if let resourceStatus = data.resourceStatus, case .Local = resourceStatus { resourceAvailable = true @@ -462,6 +434,34 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: }))) } + if data.messageActions.options.contains(.sendScheduledNow) { + actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.ScheduledMessages_SendNow, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.actionSheet.primaryTextColor) + }, action: { _, f in + controllerInteraction.sendScheduledMessagesNow(selectAll ? messages.map { $0.id } : [message.id]) + f(.dismissWithoutContent) + }))) + } + + if data.messageActions.options.contains(.editScheduledTime) { + actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.ScheduledMessages_EditTime, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Schedule"), color: theme.actionSheet.primaryTextColor) + }, action: { _, f in + controllerInteraction.editScheduledMessagesTime(selectAll ? messages.map { $0.id } : [message.id]) + f(.dismissWithoutContent) + }))) + } + + if data.canEdit { + actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_MessageDialogEdit, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.actionSheet.primaryTextColor) + }, action: { _, f in + interfaceInteraction.setupEditMessage(messages[0].id, { transition in + f(.custom(transition)) + }) + }))) + } + var activePoll: TelegramMediaPoll? for media in message.media { if let poll = media as? TelegramMediaPoll, !poll.isClosed, message.id.namespace == Namespaces.Message.Cloud, poll.pollId.namespace == Namespaces.Media.CloudPoll { From 749a35b11c157ba63dd5f747732711f1357eb4dd Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 30 Aug 2019 02:05:58 +0400 Subject: [PATCH 86/86] Fix text selection --- Telegram-iOS/en.lproj/Localizable.strings | 1 + .../ContextUI/Sources/ContextController.swift | 7 +- .../Sources/PresentationStrings.swift | 4294 +++++++++-------- .../ChatMessageTextBubbleContentNode.swift | 10 +- .../Resources/PresentationStrings.mapping | Bin 125599 -> 125672 bytes .../Sources/TextSelectionNode.swift | 66 +- .../project.pbxproj | 4 + 7 files changed, 2218 insertions(+), 2164 deletions(-) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 503bc52b84..3a910220ff 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -1003,6 +1003,7 @@ "Notification.Mute1h" = "Mute for 1 hour"; "Notification.Mute1hMin" = "Mute for 1h"; "Conversation.ContextMenuShare" = "Share"; +"Conversation.ContextMenuLookUp" = "Look Up"; "SharedMedia.TitleAll" = "Shared Media"; diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 41d49b4015..9f27b28a6f 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -717,9 +717,6 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } } let mappedPoint = self.view.convert(point, to: self.scrollNode.view) - if self.actionsContainerNode.frame.contains(mappedPoint) { - return self.actionsContainerNode.hitTest(self.view.convert(point, to: self.actionsContainerNode.view), with: event) - } if let contentParentNode = self.contentParentNode { let contentPoint = self.view.convert(point, to: contentParentNode.contentNode.view) if let result = contentParentNode.contentNode.hitTest(contentPoint, with: event) { @@ -731,6 +728,10 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi } } + if self.actionsContainerNode.frame.contains(mappedPoint) { + return self.actionsContainerNode.hitTest(self.view.convert(point, to: self.actionsContainerNode.view), with: event) + } + return self.dismissNode.view } } diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 3edd08d9c2..fdbff0ceec 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -1959,2757 +1959,2759 @@ public final class PresentationStrings { public var TwoStepAuth_RecoveryTitle: String { return self._s[1642]! } public var Widget_AuthRequired: String { return self._s[1643]! } public var Camera_FlashOn: String { return self._s[1644]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1645]! } - public var Watch_Suggestion_OK: String { return self._s[1646]! } + public var Conversation_ContextMenuLookUp: String { return self._s[1645]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1646]! } + public var Watch_Suggestion_OK: String { return self._s[1647]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1648]!, self._r[1648]!, [_0]) + return formatWithArgumentRanges(self._s[1649]!, self._r[1649]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1650]!, self._r[1650]!, [_0]) + return formatWithArgumentRanges(self._s[1651]!, self._r[1651]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1651]! } - public var DialogList_AdLabel: String { return self._s[1652]! } - public var WatchRemote_NotificationText: String { return self._s[1653]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1654]! } - public var Conversation_ReportSpam: String { return self._s[1655]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1656]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1658]! } - public var PhoneLabel_Title: String { return self._s[1659]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1660]! } - public var Settings_ChangePhoneNumber: String { return self._s[1661]! } - public var Notifications_ExceptionsTitle: String { return self._s[1662]! } - public var Notifications_AlertTones: String { return self._s[1663]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1664]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1665]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1666]! } - public var VoiceOver_Chat_Photo: String { return self._s[1668]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1669]! } - public var ReportPeer_ReasonOther: String { return self._s[1670]! } - public var KeyCommand_ScrollDown: String { return self._s[1672]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1673]! } + public var TextFormat_Strikethrough: String { return self._s[1652]! } + public var DialogList_AdLabel: String { return self._s[1653]! } + public var WatchRemote_NotificationText: String { return self._s[1654]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1655]! } + public var Conversation_ReportSpam: String { return self._s[1656]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1657]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1659]! } + public var PhoneLabel_Title: String { return self._s[1660]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1661]! } + public var Settings_ChangePhoneNumber: String { return self._s[1662]! } + public var Notifications_ExceptionsTitle: String { return self._s[1663]! } + public var Notifications_AlertTones: String { return self._s[1664]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1665]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1666]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1667]! } + public var VoiceOver_Chat_Photo: String { return self._s[1669]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1670]! } + public var ReportPeer_ReasonOther: String { return self._s[1671]! } + public var KeyCommand_ScrollDown: String { return self._s[1673]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1674]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0]) + return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1675]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1676]! } - public var AuthSessions_LogOut: String { return self._s[1677]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1678]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1679]! } - public var Passport_Phone_Title: String { return self._s[1680]! } - public var Settings_PhoneNumber: String { return self._s[1681]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1676]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1677]! } + public var AuthSessions_LogOut: String { return self._s[1678]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1679]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1680]! } + public var Passport_Phone_Title: String { return self._s[1681]! } + public var Settings_PhoneNumber: String { return self._s[1682]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_0]) + return formatWithArgumentRanges(self._s[1683]!, self._r[1683]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1683]! } - public var WebSearch_SearchNoResults: String { return self._s[1684]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1686]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1687]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1688]! } - public var PhotoEditor_CurvesTool: String { return self._s[1689]! } - public var Checkout_PaymentMethod: String { return self._s[1691]! } + public var NotificationsSound_Alert: String { return self._s[1684]! } + public var WebSearch_SearchNoResults: String { return self._s[1685]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1687]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1688]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1689]! } + public var PhotoEditor_CurvesTool: String { return self._s[1690]! } + public var Checkout_PaymentMethod: String { return self._s[1692]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1692]!, self._r[1692]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1693]! } - public var Camera_PhotoMode: String { return self._s[1696]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1698]! } - public var CallSettings_OnMobile: String { return self._s[1699]! } - public var Tour_Text2: String { return self._s[1700]! } + public var Contacts_AccessDeniedError: String { return self._s[1694]! } + public var Camera_PhotoMode: String { return self._s[1697]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1699]! } + public var CallSettings_OnMobile: String { return self._s[1700]! } + public var Tour_Text2: String { return self._s[1701]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1702]!, self._r[1702]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1703]! } - public var Permissions_Skip: String { return self._s[1704]! } - public var SecretImage_Title: String { return self._s[1705]! } - public var Watch_MessageView_Title: String { return self._s[1706]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1707]! } - public var AttachmentMenu_Poll: String { return self._s[1708]! } + public var DialogList_EncryptionProcessing: String { return self._s[1704]! } + public var Permissions_Skip: String { return self._s[1705]! } + public var SecretImage_Title: String { return self._s[1706]! } + public var Watch_MessageView_Title: String { return self._s[1707]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1708]! } + public var AttachmentMenu_Poll: String { return self._s[1709]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1709]!, self._r[1709]!, [_0]) + return formatWithArgumentRanges(self._s[1710]!, self._r[1710]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1710]!, self._r[1710]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1711]!, self._r[1711]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1711]! } - public var WallpaperPreview_Title: String { return self._s[1712]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1713]! } - public var Settings_ProxyConnecting: String { return self._s[1714]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1716]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1717]! } - public var Profile_MessageLifetime5s: String { return self._s[1718]! } - public var Username_InvalidCharacters: String { return self._s[1719]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1720]! } - public var ScheduledMessages_ClearAll: String { return self._s[1721]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1722]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1723]! } - public var Settings_AddAccount: String { return self._s[1724]! } - public var Notification_CreatedChannel: String { return self._s[1727]! } + public var Notification_CallCanceled: String { return self._s[1712]! } + public var WallpaperPreview_Title: String { return self._s[1713]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1714]! } + public var Settings_ProxyConnecting: String { return self._s[1715]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1717]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1718]! } + public var Profile_MessageLifetime5s: String { return self._s[1719]! } + public var Username_InvalidCharacters: String { return self._s[1720]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1721]! } + public var ScheduledMessages_ClearAll: String { return self._s[1722]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1723]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1724]! } + public var Settings_AddAccount: String { return self._s[1725]! } + public var Notification_CreatedChannel: String { return self._s[1728]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1729]!, self._r[1729]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1730]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1731]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1732]! } - public var Contacts_TopSection: String { return self._s[1733]! } + public var Passcode_AppLockedAlert: String { return self._s[1731]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1732]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1733]! } + public var Contacts_TopSection: String { return self._s[1734]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0, _1]) } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) + return formatWithArgumentRanges(self._s[1736]!, self._r[1736]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1736]! } - public var UserInfo_TapToCall: String { return self._s[1737]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1739]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1740]! } - public var Common_Search: String { return self._s[1741]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1742]! } + public var ReportPeer_ReasonSpam: String { return self._s[1737]! } + public var UserInfo_TapToCall: String { return self._s[1738]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1740]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1741]! } + public var Common_Search: String { return self._s[1742]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1743]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1743]!, self._r[1743]!, [_0]) + return formatWithArgumentRanges(self._s[1744]!, self._r[1744]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1744]! } - public var Message_InvoiceLabel: String { return self._s[1745]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1746]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1747]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1745]! } + public var Message_InvoiceLabel: String { return self._s[1746]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1747]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1748]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_0]) + return formatWithArgumentRanges(self._s[1749]!, self._r[1749]!, [_0]) } - public var Conversation_Info: String { return self._s[1749]! } - public var Login_InfoDeletePhoto: String { return self._s[1750]! } - public var Passport_Language_vi: String { return self._s[1752]! } - public var UserInfo_ScamUserWarning: String { return self._s[1753]! } - public var Conversation_Search: String { return self._s[1754]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1755]! } - public var ReportPeer_ReasonPornography: String { return self._s[1756]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1757]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1758]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1759]! } - public var Channel_Setup_TypeHeader: String { return self._s[1760]! } - public var AuthSessions_LoggedIn: String { return self._s[1761]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1762]! } - public var Login_SmsRequestState3: String { return self._s[1763]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1764]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1765]! } - public var Join_ChannelsTooMuch: String { return self._s[1766]! } - public var Channel_Edit_LinkItem: String { return self._s[1767]! } - public var Privacy_Calls_P2PNever: String { return self._s[1768]! } - public var Conversation_AddToReadingList: String { return self._s[1770]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1771]! } - public var Message_Animation: String { return self._s[1772]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1773]! } - public var Map_Unknown: String { return self._s[1774]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1775]! } + public var Conversation_Info: String { return self._s[1750]! } + public var Login_InfoDeletePhoto: String { return self._s[1751]! } + public var Passport_Language_vi: String { return self._s[1753]! } + public var UserInfo_ScamUserWarning: String { return self._s[1754]! } + public var Conversation_Search: String { return self._s[1755]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1756]! } + public var ReportPeer_ReasonPornography: String { return self._s[1757]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1758]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1759]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1760]! } + public var Channel_Setup_TypeHeader: String { return self._s[1761]! } + public var AuthSessions_LoggedIn: String { return self._s[1762]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1763]! } + public var Login_SmsRequestState3: String { return self._s[1764]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1765]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1766]! } + public var Join_ChannelsTooMuch: String { return self._s[1767]! } + public var Channel_Edit_LinkItem: String { return self._s[1768]! } + public var Privacy_Calls_P2PNever: String { return self._s[1769]! } + public var Conversation_AddToReadingList: String { return self._s[1771]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1772]! } + public var Message_Animation: String { return self._s[1773]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1774]! } + public var Map_Unknown: String { return self._s[1775]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1776]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1776]!, self._r[1776]!, [_1, _2]) - } - public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1778]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1779]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1780]! } + public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_1, _2]) + } + public var Call_StatusRequesting: String { return self._s[1779]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1780]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1781]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1781]!, self._r[1781]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) + return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_0]) } - public var Update_Skip: String { return self._s[1783]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1784]! } - public var Message_PinnedPollMessage: String { return self._s[1785]! } - public var BlockedUsers_Title: String { return self._s[1786]! } + public var Update_Skip: String { return self._s[1784]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1785]! } + public var Message_PinnedPollMessage: String { return self._s[1786]! } + public var BlockedUsers_Title: String { return self._s[1787]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1787]!, self._r[1787]!, [_1]) + return formatWithArgumentRanges(self._s[1788]!, self._r[1788]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1788]! } - public var NotificationsSound_Bell: String { return self._s[1789]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1790]! } - public var Weekday_Monday: String { return self._s[1791]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1792]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1793]! } - public var ChatSettings_Groups: String { return self._s[1794]! } + public var Username_CheckingUsername: String { return self._s[1789]! } + public var NotificationsSound_Bell: String { return self._s[1790]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1791]! } + public var Weekday_Monday: String { return self._s[1792]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1793]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1794]! } + public var ChatSettings_Groups: String { return self._s[1795]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1795]!, self._r[1795]!, [_0]) + return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1796]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1798]! } - public var ChatList_Unmute: String { return self._s[1799]! } - public var PhotoEditor_CurvesAll: String { return self._s[1800]! } - public var Weekday_ShortTuesday: String { return self._s[1801]! } - public var DialogList_Read: String { return self._s[1802]! } - public var Appearance_AppIconClassic: String { return self._s[1803]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1804]! } - public var Passport_Identity_Gender: String { return self._s[1805]! } + public var Your_card_was_declined: String { return self._s[1797]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1799]! } + public var ChatList_Unmute: String { return self._s[1800]! } + public var PhotoEditor_CurvesAll: String { return self._s[1801]! } + public var Weekday_ShortTuesday: String { return self._s[1802]! } + public var DialogList_Read: String { return self._s[1803]! } + public var Appearance_AppIconClassic: String { return self._s[1804]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1805]! } + public var Passport_Identity_Gender: String { return self._s[1806]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1806]!, self._r[1806]!, [_0]) + return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1807]! } + public var Target_SelectGroup: String { return self._s[1808]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_0]) + return formatWithArgumentRanges(self._s[1810]!, self._r[1810]!, [_0]) } - public var Passport_Language_en: String { return self._s[1810]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1811]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1812]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1813]! } - public var ScheduledMessages_SendNow: String { return self._s[1814]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1816]! } - public var Login_InfoHelp: String { return self._s[1817]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1818]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1819]! } + public var Passport_Language_en: String { return self._s[1811]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1812]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1813]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1814]! } + public var ScheduledMessages_SendNow: String { return self._s[1815]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1817]! } + public var Login_InfoHelp: String { return self._s[1818]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1819]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1820]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1820]!, self._r[1820]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1823]! } - public var CreatePoll_Title: String { return self._s[1824]! } - public var Conversation_ViewTheme: String { return self._s[1825]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1826]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1827]! } - public var UserInfo_GroupsInCommon: String { return self._s[1828]! } - public var Call_AudioRouteHide: String { return self._s[1829]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1831]! } + public var SocksProxySetup_AddProxy: String { return self._s[1824]! } + public var CreatePoll_Title: String { return self._s[1825]! } + public var Conversation_ViewTheme: String { return self._s[1826]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1827]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1828]! } + public var UserInfo_GroupsInCommon: String { return self._s[1829]! } + public var Call_AudioRouteHide: String { return self._s[1830]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1832]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1832]!, self._r[1832]!, [_0]) + return formatWithArgumentRanges(self._s[1833]!, self._r[1833]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1833]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1834]! } - public var Notifications_Title: String { return self._s[1835]! } - public var Group_Username_InvalidTooShort: String { return self._s[1836]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1837]! } + public var TextFormat_Bold: String { return self._s[1834]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1835]! } + public var Notifications_Title: String { return self._s[1836]! } + public var Group_Username_InvalidTooShort: String { return self._s[1837]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1838]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1839]!, self._r[1839]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1840]! } - public var Stickers_SuggestAdded: String { return self._s[1841]! } - public var Login_CountryCode: String { return self._s[1842]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1843]! } - public var Map_GetDirections: String { return self._s[1844]! } - public var Login_PhoneFloodError: String { return self._s[1845]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1841]! } + public var Stickers_SuggestAdded: String { return self._s[1842]! } + public var Login_CountryCode: String { return self._s[1843]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1844]! } + public var Map_GetDirections: String { return self._s[1845]! } + public var Login_PhoneFloodError: String { return self._s[1846]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1846]!, self._r[1846]!, [_0]) + return formatWithArgumentRanges(self._s[1847]!, self._r[1847]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1848]! } - public var Group_Location_ChangeLocation: String { return self._s[1849]! } - public var Notification_GroupInviterSelf: String { return self._s[1850]! } - public var InstantPage_TapToOpenLink: String { return self._s[1851]! } + public var Settings_SetUsername: String { return self._s[1849]! } + public var Group_Location_ChangeLocation: String { return self._s[1850]! } + public var Notification_GroupInviterSelf: String { return self._s[1851]! } + public var InstantPage_TapToOpenLink: String { return self._s[1852]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1852]!, self._r[1852]!, [_0]) + return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1853]! } - public var SecretChat_Title: String { return self._s[1854]! } - public var Group_UpgradeNoticeText1: String { return self._s[1855]! } - public var AuthSessions_Title: String { return self._s[1856]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1854]! } + public var SecretChat_Title: String { return self._s[1855]! } + public var Group_UpgradeNoticeText1: String { return self._s[1856]! } + public var AuthSessions_Title: String { return self._s[1857]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1857]!, self._r[1857]!, [_0]) + return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1858]! } - public var Channel_About_Title: String { return self._s[1859]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1860]! } + public var PhotoEditor_CropAuto: String { return self._s[1859]! } + public var Channel_About_Title: String { return self._s[1860]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1861]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1863]!, self._r[1863]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1863]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1865]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1866]! } + public var VoiceOver_MessageContextReport: String { return self._s[1864]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1866]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1867]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1867]!, self._r[1867]!, [_1]) + return formatWithArgumentRanges(self._s[1868]!, self._r[1868]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1869]!, self._r[1869]!, [_0]) - } - public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1871]! } - public var Presence_online: String { return self._s[1873]! } - public var PasscodeSettings_Title: String { return self._s[1874]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1875]! } - public var Web_OpenExternal: String { return self._s[1876]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1878]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1879]! } - public var LocalGroup_Title: String { return self._s[1880]! } + public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1871]!, self._r[1871]!, [_0]) + } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1872]! } + public var Presence_online: String { return self._s[1874]! } + public var PasscodeSettings_Title: String { return self._s[1875]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1876]! } + public var Web_OpenExternal: String { return self._s[1877]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1879]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1880]! } + public var LocalGroup_Title: String { return self._s[1881]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) + return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1882]! } - public var Map_YouAreHere: String { return self._s[1883]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1883]! } + public var Map_YouAreHere: String { return self._s[1884]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1885]!, self._r[1885]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1886]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1887]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1888]!, self._r[1888]!, [_0]) + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1886]!, self._r[1886]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1887]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1888]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1890]! } - public var Bot_Start: String { return self._s[1891]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1892]!, self._r[1892]!, [_0]) + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + public var SocksProxySetup_Username: String { return self._s[1891]! } + public var Bot_Start: String { return self._s[1892]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1893]!, self._r[1893]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1894]! } - public var AccentColor_Title: String { return self._s[1896]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1897]! } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1894]!, self._r[1894]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[1895]! } + public var AccentColor_Title: String { return self._s[1897]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1898]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1898]!, self._r[1898]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0]) + return formatWithArgumentRanges(self._s[1900]!, self._r[1900]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1900]!, self._r[1900]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1901]!, self._r[1901]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1901]! } - public var Login_InfoAvatarPhoto: String { return self._s[1902]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1903]! } - public var Tour_Title4: String { return self._s[1904]! } - public var Passport_Identity_Translation: String { return self._s[1905]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1906]! } - public var Login_TermsOfServiceLabel: String { return self._s[1908]! } - public var Passport_Language_it: String { return self._s[1909]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1910]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1911]! } - public var Conversation_ClearAll: String { return self._s[1913]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1915]! } - public var TwoStepAuth_FloodError: String { return self._s[1916]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1902]! } + public var Login_InfoAvatarPhoto: String { return self._s[1903]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1904]! } + public var Tour_Title4: String { return self._s[1905]! } + public var Passport_Identity_Translation: String { return self._s[1906]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1907]! } + public var Login_TermsOfServiceLabel: String { return self._s[1909]! } + public var Passport_Language_it: String { return self._s[1910]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1911]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1912]! } + public var Conversation_ClearAll: String { return self._s[1914]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1916]! } + public var TwoStepAuth_FloodError: String { return self._s[1917]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_1]) + return formatWithArgumentRanges(self._s[1918]!, self._r[1918]!, [_1]) } - public var Paint_Delete: String { return self._s[1918]! } - public var Privacy_AddNewPeer: String { return self._s[1919]! } + public var Paint_Delete: String { return self._s[1919]! } + public var Privacy_AddNewPeer: String { return self._s[1920]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_1]) + return formatWithArgumentRanges(self._s[1921]!, self._r[1921]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[1921]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1922]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1923]!, self._r[1923]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1923]! } + public var Message_PinnedAudioMessage: String { return self._s[1924]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1924]!, self._r[1924]!, [_0]) + return formatWithArgumentRanges(self._s[1925]!, self._r[1925]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1925]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1926]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1927]! } - public var Conversation_MessageEditedLabel: String { return self._s[1928]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1929]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1930]! } + public var Notification_Mute1hMin: String { return self._s[1926]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1927]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1928]! } + public var Conversation_MessageEditedLabel: String { return self._s[1929]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1930]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1931]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1931]!, self._r[1931]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1932]!, self._r[1932]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1932]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1933]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1933]!, self._r[1933]!, [_1]) + return formatWithArgumentRanges(self._s[1934]!, self._r[1934]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1934]! } - public var Month_GenOctober: String { return self._s[1935]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1936]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1937]! } - public var MediaPicker_TimerTooltip: String { return self._s[1939]! } - public var SharedMedia_TitleAll: String { return self._s[1940]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1943]! } - public var Conversation_RestrictedMedia: String { return self._s[1944]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1945]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1947]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1948]! } + public var AccessDenied_LocationTracking: String { return self._s[1935]! } + public var Month_GenOctober: String { return self._s[1936]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1937]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1938]! } + public var MediaPicker_TimerTooltip: String { return self._s[1940]! } + public var SharedMedia_TitleAll: String { return self._s[1941]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1944]! } + public var Conversation_RestrictedMedia: String { return self._s[1945]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1946]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1948]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1949]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_0]) + return formatWithArgumentRanges(self._s[1950]!, self._r[1950]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1952]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1954]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1955]! } + public var Conversation_SavedMessages: String { return self._s[1953]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1955]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1956]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1957]!, self._r[1957]!, [_0]) + return formatWithArgumentRanges(self._s[1958]!, self._r[1958]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[1958]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[1959]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0]) + return formatWithArgumentRanges(self._s[1960]!, self._r[1960]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1960]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1961]! } + public var ReportPeer_AlertSuccess: String { return self._s[1961]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1962]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1962]!, self._r[1962]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1963]! } - public var PhotoEditor_FadeTool: String { return self._s[1964]! } - public var Privacy_ContactsReset: String { return self._s[1965]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1964]! } + public var PhotoEditor_FadeTool: String { return self._s[1965]! } + public var Privacy_ContactsReset: String { return self._s[1966]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1967]!, self._r[1967]!, [_0]) + return formatWithArgumentRanges(self._s[1968]!, self._r[1968]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1968]! } - public var ChatList_Mute: String { return self._s[1969]! } - public var Permissions_CellularDataText_v0: String { return self._s[1970]! } - public var ShareMenu_SelectChats: String { return self._s[1972]! } - public var MusicPlayer_VoiceNote: String { return self._s[1973]! } - public var Conversation_RestrictedText: String { return self._s[1974]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1975]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1976]! } - public var Cache_Videos: String { return self._s[1977]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1978]! } - public var FeatureDisabled_Oops: String { return self._s[1980]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1981]! } + public var Message_PinnedVideoMessage: String { return self._s[1969]! } + public var ChatList_Mute: String { return self._s[1970]! } + public var Permissions_CellularDataText_v0: String { return self._s[1971]! } + public var ShareMenu_SelectChats: String { return self._s[1973]! } + public var MusicPlayer_VoiceNote: String { return self._s[1974]! } + public var Conversation_RestrictedText: String { return self._s[1975]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1976]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1977]! } + public var Cache_Videos: String { return self._s[1978]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1979]! } + public var FeatureDisabled_Oops: String { return self._s[1981]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1982]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1982]!, self._r[1982]!, [_0]) + return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1983]! } - public var GroupPermission_NoSendPolls: String { return self._s[1984]! } - public var Message_VideoExpired: String { return self._s[1986]! } - public var Notifications_Badge: String { return self._s[1987]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1988]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1989]! } - public var Username_InvalidTooShort: String { return self._s[1990]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1991]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1992]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1993]! } + public var Stickers_GroupStickersHelp: String { return self._s[1984]! } + public var GroupPermission_NoSendPolls: String { return self._s[1985]! } + public var Message_VideoExpired: String { return self._s[1987]! } + public var Notifications_Badge: String { return self._s[1988]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1989]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1990]! } + public var Username_InvalidTooShort: String { return self._s[1991]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1992]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1993]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1994]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_1]) + return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1995]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1996]! } - public var SharedMedia_CategoryDocs: String { return self._s[1999]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1996]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1997]! } + public var SharedMedia_CategoryDocs: String { return self._s[2000]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2000]!, self._r[2000]!, [_1]) + return formatWithArgumentRanges(self._s[2001]!, self._r[2001]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[2002]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2003]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2003]!, self._r[2003]!, [_1]) + return formatWithArgumentRanges(self._s[2004]!, self._r[2004]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2004]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2005]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2005]!, self._r[2005]!, [_0]) + return formatWithArgumentRanges(self._s[2006]!, self._r[2006]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2006]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2007]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2008]! } - public var Channel_UpdatePhotoItem: String { return self._s[2009]! } - public var GroupInfo_LeftStatus: String { return self._s[2010]! } - public var Watch_MessageView_Forward: String { return self._s[2012]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2013]! } - public var Cache_ClearEmpty: String { return self._s[2015]! } - public var Localization_LanguageName: String { return self._s[2016]! } - public var WebSearch_GIFs: String { return self._s[2017]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2018]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2019]! } - public var Common_Back: String { return self._s[2020]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2021]! } + public var ChatSettings_PrivateChats: String { return self._s[2007]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2008]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2009]! } + public var Channel_UpdatePhotoItem: String { return self._s[2010]! } + public var GroupInfo_LeftStatus: String { return self._s[2011]! } + public var Watch_MessageView_Forward: String { return self._s[2013]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2014]! } + public var Cache_ClearEmpty: String { return self._s[2016]! } + public var Localization_LanguageName: String { return self._s[2017]! } + public var WebSearch_GIFs: String { return self._s[2018]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2019]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2020]! } + public var Common_Back: String { return self._s[2021]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2022]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2023]!, self._r[2023]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[2023]! } - public var Watch_Conversation_Reply: String { return self._s[2025]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2027]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2028]! } - public var Channel_BanUser_Unban: String { return self._s[2030]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2031]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2032]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2034]! } - public var Passport_Identity_Name: String { return self._s[2035]! } + public var Passport_Email_Help: String { return self._s[2024]! } + public var Watch_Conversation_Reply: String { return self._s[2026]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2028]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2029]! } + public var Channel_BanUser_Unban: String { return self._s[2031]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2032]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2033]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2035]! } + public var Passport_Identity_Name: String { return self._s[2036]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2036]!, self._r[2036]!, [_0]) + return formatWithArgumentRanges(self._s[2037]!, self._r[2037]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2037]! } - public var Conversation_BlockUser: String { return self._s[2038]! } - public var Month_GenJanuary: String { return self._s[2039]! } - public var ChatSettings_TextSize: String { return self._s[2040]! } - public var Notification_PassportValuePhone: String { return self._s[2041]! } - public var Passport_Language_ne: String { return self._s[2042]! } - public var Notification_CallBack: String { return self._s[2043]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2044]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2038]! } + public var Conversation_BlockUser: String { return self._s[2039]! } + public var Month_GenJanuary: String { return self._s[2040]! } + public var ChatSettings_TextSize: String { return self._s[2041]! } + public var Notification_PassportValuePhone: String { return self._s[2042]! } + public var Passport_Language_ne: String { return self._s[2043]! } + public var Notification_CallBack: String { return self._s[2044]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2045]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2045]!, self._r[2045]!, [_0]) + return formatWithArgumentRanges(self._s[2046]!, self._r[2046]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2046]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2047]! } - public var Stickers_FrequentlyUsed: String { return self._s[2048]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2049]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2051]! } + public var Channel_Info_Management: String { return self._s[2047]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2048]! } + public var Stickers_FrequentlyUsed: String { return self._s[2049]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2050]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2052]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2053]!, self._r[2053]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2053]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2054]! } - public var CreatePoll_TextHeader: String { return self._s[2055]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2054]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2055]! } + public var CreatePoll_TextHeader: String { return self._s[2056]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_0]) + return formatWithArgumentRanges(self._s[2057]!, self._r[2057]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2057]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2058]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2060]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2061]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2062]! } + public var PhotoEditor_QualityMedium: String { return self._s[2058]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2059]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2061]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2062]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2063]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2063]!, self._r[2063]!, [_0]) + return formatWithArgumentRanges(self._s[2064]!, self._r[2064]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2064]!, self._r[2064]!, [_1]) + return formatWithArgumentRanges(self._s[2065]!, self._r[2065]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[2066]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2067]! } - public var Settings_Username: String { return self._s[2069]! } - public var Conversation_Block: String { return self._s[2071]! } - public var Wallpaper_Wallpaper: String { return self._s[2072]! } - public var SocksProxySetup_UseProxy: String { return self._s[2074]! } - public var EditTheme_UploadEditedTheme: String { return self._s[2075]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2076]! } - public var MessageTimer_Forever: String { return self._s[2077]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2078]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2079]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2080]! } - public var Passport_Language_da: String { return self._s[2081]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2082]! } + public var Conversation_LinkDialogOpen: String { return self._s[2067]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2068]! } + public var Settings_Username: String { return self._s[2070]! } + public var Conversation_Block: String { return self._s[2072]! } + public var Wallpaper_Wallpaper: String { return self._s[2073]! } + public var SocksProxySetup_UseProxy: String { return self._s[2075]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2076]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2077]! } + public var MessageTimer_Forever: String { return self._s[2078]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2079]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2080]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2081]! } + public var Passport_Language_da: String { return self._s[2082]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2083]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_0]) + return formatWithArgumentRanges(self._s[2084]!, self._r[2084]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2084]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2085]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0]) + return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2088]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2089]! } - public var Conversation_PinnedPoll: String { return self._s[2090]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2091]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2089]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2090]! } + public var Conversation_PinnedPoll: String { return self._s[2091]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2092]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2092]!, self._r[2092]!, [_1]) + return formatWithArgumentRanges(self._s[2093]!, self._r[2093]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2093]! } - public var Cache_ByPeerHeader: String { return self._s[2094]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2094]! } + public var Cache_ByPeerHeader: String { return self._s[2095]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_0]) + return formatWithArgumentRanges(self._s[2096]!, self._r[2096]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2096]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2099]! } - public var Notification_PinnedMessage: String { return self._s[2100]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2102]! } - public var Contacts_SortBy: String { return self._s[2103]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2097]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2100]! } + public var Notification_PinnedMessage: String { return self._s[2101]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2103]! } + public var Contacts_SortBy: String { return self._s[2104]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_1]) + return formatWithArgumentRanges(self._s[2105]!, self._r[2105]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2107]!, self._r[2107]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2107]! } - public var Watch_UserInfo_Service: String { return self._s[2108]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2110]! } - public var Conversation_Unpin: String { return self._s[2112]! } - public var CancelResetAccount_Title: String { return self._s[2113]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2114]! } + public var Call_EncryptionKey_Title: String { return self._s[2108]! } + public var Watch_UserInfo_Service: String { return self._s[2109]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2111]! } + public var Conversation_Unpin: String { return self._s[2113]! } + public var CancelResetAccount_Title: String { return self._s[2114]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2115]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2117]!, self._r[2117]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2117]! } - public var CallSettings_Title: String { return self._s[2118]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2119]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2121]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2122]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2118]! } + public var CallSettings_Title: String { return self._s[2119]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2120]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2122]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2123]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2123]!, self._r[2123]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2124]!, self._r[2124]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2124]! } - public var LoginPassword_PasswordHelp: String { return self._s[2125]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2126]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2127]! } - public var Checkout_TotalPaidAmount: String { return self._s[2128]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2125]! } + public var LoginPassword_PasswordHelp: String { return self._s[2126]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2127]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2128]! } + public var Checkout_TotalPaidAmount: String { return self._s[2129]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) + return formatWithArgumentRanges(self._s[2130]!, self._r[2130]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2130]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2132]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2133]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2131]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2133]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2134]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_1]) + return formatWithArgumentRanges(self._s[2135]!, self._r[2135]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2135]! } - public var Contacts_InviteFriends: String { return self._s[2137]! } - public var Map_ChooseLocationTitle: String { return self._s[2138]! } - public var Conversation_StopPoll: String { return self._s[2140]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2136]! } + public var Contacts_InviteFriends: String { return self._s[2138]! } + public var Map_ChooseLocationTitle: String { return self._s[2139]! } + public var Conversation_StopPoll: String { return self._s[2141]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2141]!, self._r[2141]!, [_0]) + return formatWithArgumentRanges(self._s[2142]!, self._r[2142]!, [_0]) } - public var Call_Camera: String { return self._s[2142]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2143]! } - public var Calls_RatingFeedback: String { return self._s[2144]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2145]! } - public var NotificationsSound_Pulse: String { return self._s[2146]! } - public var Watch_LastSeen_Lately: String { return self._s[2147]! } - public var ReportGroupLocation_Report: String { return self._s[2150]! } - public var Widget_NoUsers: String { return self._s[2151]! } - public var Conversation_UnvotePoll: String { return self._s[2152]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2154]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2155]! } - public var NotificationsSound_Circles: String { return self._s[2156]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2158]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2159]! } - public var Proxy_TooltipUnavailable: String { return self._s[2160]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2162]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2164]! } - public var Conversation_FileDropbox: String { return self._s[2165]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2166]! } - public var Tour_Text3: String { return self._s[2168]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2170]! } - public var GroupPermission_NoSendMessages: String { return self._s[2171]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2172]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2173]! } + public var Call_Camera: String { return self._s[2143]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2144]! } + public var Calls_RatingFeedback: String { return self._s[2145]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2146]! } + public var NotificationsSound_Pulse: String { return self._s[2147]! } + public var Watch_LastSeen_Lately: String { return self._s[2148]! } + public var ReportGroupLocation_Report: String { return self._s[2151]! } + public var Widget_NoUsers: String { return self._s[2152]! } + public var Conversation_UnvotePoll: String { return self._s[2153]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2155]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2156]! } + public var NotificationsSound_Circles: String { return self._s[2157]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2159]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2160]! } + public var Proxy_TooltipUnavailable: String { return self._s[2161]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2163]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2165]! } + public var Conversation_FileDropbox: String { return self._s[2166]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2167]! } + public var Tour_Text3: String { return self._s[2169]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2171]! } + public var GroupPermission_NoSendMessages: String { return self._s[2172]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2173]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2174]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2175]!, self._r[2175]!, [_0]) + return formatWithArgumentRanges(self._s[2176]!, self._r[2176]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2176]! } - public var Checkout_ShippingOption_Title: String { return self._s[2177]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2178]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2177]! } + public var Checkout_ShippingOption_Title: String { return self._s[2178]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2179]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_0]) - } - public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2180]!, self._r[2180]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2181]! } - public var EditTheme_FileReadError: String { return self._s[2182]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2183]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2184]! } - public var AutoDownloadSettings_Photos: String { return self._s[2186]! } - public var Appearance_PreviewIncomingText: String { return self._s[2187]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2188]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2189]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2190]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2191]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2192]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2193]! } - public var Notification_SecretChatScreenshot: String { return self._s[2194]! } - public var AccessDenied_Wallpapers: String { return self._s[2195]! } - public var Passport_Address_City: String { return self._s[2197]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2198]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2199]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2200]! } - public var AccessDenied_LocationDisabled: String { return self._s[2201]! } - public var Group_Location_Title: String { return self._s[2202]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2204]! } - public var GroupInfo_Sound: String { return self._s[2205]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2206]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2207]! } - public var Contacts_Title: String { return self._s[2208]! } - public var Passport_Language_fr: String { return self._s[2209]! } - public var Notifications_ResetAllNotifications: String { return self._s[2210]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2213]! } - public var Checkout_NewCard_Title: String { return self._s[2214]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2215]! } - public var Conversation_ForwardChats: String { return self._s[2216]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2218]! } - public var Settings_FAQ: String { return self._s[2220]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2221]! } - public var Conversation_ContextMenuForward: String { return self._s[2222]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2225]! } - public var PrivacyPolicy_Title: String { return self._s[2228]! } - public var Notifications_TextTone: String { return self._s[2229]! } - public var Profile_CreateNewContact: String { return self._s[2230]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2231]! } - public var Call_Speaker: String { return self._s[2233]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2234]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2236]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2237]! } + public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2181]!, self._r[2181]!, [_0]) + } + public var Channel_Management_LabelAdministrator: String { return self._s[2182]! } + public var EditTheme_FileReadError: String { return self._s[2183]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2184]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2185]! } + public var AutoDownloadSettings_Photos: String { return self._s[2187]! } + public var Appearance_PreviewIncomingText: String { return self._s[2188]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2189]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2190]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2191]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2192]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2193]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2194]! } + public var Notification_SecretChatScreenshot: String { return self._s[2195]! } + public var AccessDenied_Wallpapers: String { return self._s[2196]! } + public var Passport_Address_City: String { return self._s[2198]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2199]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2200]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2201]! } + public var AccessDenied_LocationDisabled: String { return self._s[2202]! } + public var Group_Location_Title: String { return self._s[2203]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2205]! } + public var GroupInfo_Sound: String { return self._s[2206]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2207]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2208]! } + public var Contacts_Title: String { return self._s[2209]! } + public var Passport_Language_fr: String { return self._s[2210]! } + public var Notifications_ResetAllNotifications: String { return self._s[2211]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2214]! } + public var Checkout_NewCard_Title: String { return self._s[2215]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2216]! } + public var Conversation_ForwardChats: String { return self._s[2217]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2219]! } + public var Settings_FAQ: String { return self._s[2221]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2222]! } + public var Conversation_ContextMenuForward: String { return self._s[2223]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2226]! } + public var PrivacyPolicy_Title: String { return self._s[2229]! } + public var Notifications_TextTone: String { return self._s[2230]! } + public var Profile_CreateNewContact: String { return self._s[2231]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2232]! } + public var Call_Speaker: String { return self._s[2234]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2235]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2237]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2238]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2238]!, self._r[2238]!, [_0]) + return formatWithArgumentRanges(self._s[2239]!, self._r[2239]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2239]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2240]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2241]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2242]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2243]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2244]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2245]! } - public var Bot_Unblock: String { return self._s[2246]! } - public var TextFormat_Italic: String { return self._s[2247]! } - public var WallpaperSearch_ColorPink: String { return self._s[2248]! } - public var Settings_About_Help: String { return self._s[2249]! } - public var SearchImages_Title: String { return self._s[2250]! } - public var Weekday_Wednesday: String { return self._s[2251]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2252]! } - public var ExplicitContent_AlertTitle: String { return self._s[2253]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2240]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2241]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2242]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2243]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2244]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2245]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2246]! } + public var Bot_Unblock: String { return self._s[2247]! } + public var TextFormat_Italic: String { return self._s[2248]! } + public var WallpaperSearch_ColorPink: String { return self._s[2249]! } + public var Settings_About_Help: String { return self._s[2250]! } + public var SearchImages_Title: String { return self._s[2251]! } + public var Weekday_Wednesday: String { return self._s[2252]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2253]! } + public var ExplicitContent_AlertTitle: String { return self._s[2254]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2254]!, self._r[2254]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2255]! } - public var Weekday_Thursday: String { return self._s[2256]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2257]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2258]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2256]! } + public var Weekday_Thursday: String { return self._s[2257]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2258]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2259]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_0]) + return formatWithArgumentRanges(self._s[2260]!, self._r[2260]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2260]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2261]! } - public var Passport_RequestedInformation: String { return self._s[2262]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2263]! } - public var Conversation_EncryptionProcessing: String { return self._s[2265]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2266]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2268]! } - public var Channel_Setup_Title: String { return self._s[2269]! } - public var Conversation_SearchPlaceholder: String { return self._s[2270]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2271]! } - public var Checkout_ErrorGeneric: String { return self._s[2272]! } - public var Passport_Language_hu: String { return self._s[2273]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2261]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2262]! } + public var Passport_RequestedInformation: String { return self._s[2263]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2264]! } + public var Conversation_EncryptionProcessing: String { return self._s[2266]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2267]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2269]! } + public var Channel_Setup_Title: String { return self._s[2270]! } + public var Conversation_SearchPlaceholder: String { return self._s[2271]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2272]! } + public var Checkout_ErrorGeneric: String { return self._s[2273]! } + public var Passport_Language_hu: String { return self._s[2274]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2275]!, self._r[2275]!, [_0]) + return formatWithArgumentRanges(self._s[2276]!, self._r[2276]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_1]) + return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_0]) + return formatWithArgumentRanges(self._s[2280]!, self._r[2280]!, [_0]) } - public var Group_Location_Info: String { return self._s[2280]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2281]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2282]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2283]! } + public var Group_Location_Info: String { return self._s[2281]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2282]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2283]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2284]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2284]!, self._r[2284]!, [_0]) + return formatWithArgumentRanges(self._s[2285]!, self._r[2285]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2285]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2286]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[2287]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2288]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2286]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2287]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2288]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2289]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_0]) + return formatWithArgumentRanges(self._s[2290]!, self._r[2290]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2290]! } - public var Message_PinnedAnimationMessage: String { return self._s[2292]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2294]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2295]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2297]! } - public var Embed_PlayingInPIP: String { return self._s[2298]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2299]! } + public var Passport_Language_cs: String { return self._s[2291]! } + public var Message_PinnedAnimationMessage: String { return self._s[2293]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2295]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2296]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2298]! } + public var Embed_PlayingInPIP: String { return self._s[2299]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2300]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_0]) + return formatWithArgumentRanges(self._s[2301]!, self._r[2301]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2301]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2302]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1]) + return formatWithArgumentRanges(self._s[2303]!, self._r[2303]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2303]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2304]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2305]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2306]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2307]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2308]! } + public var Notification_PaymentSent: String { return self._s[2304]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2305]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2306]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2307]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2308]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2309]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2311]!, self._r[2311]!, [_1]) - } - public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2312]!, self._r[2312]!, [_1]) } - public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2313]!, self._r[2313]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2315]! } - public var PasscodeSettings_HelpTop: String { return self._s[2316]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2317]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2318]! } - public var EditTheme_ShortLink: String { return self._s[2319]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2320]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2321]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2322]! } - public var Call_Accept: String { return self._s[2324]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2325]! } - public var Month_GenMarch: String { return self._s[2327]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2328]! } - public var LoginPassword_Title: String { return self._s[2329]! } - public var Call_End: String { return self._s[2330]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2331]! } - public var VoiceOver_Chat_Contact: String { return self._s[2332]! } - public var CallSettings_Always: String { return self._s[2333]! } - public var CallFeedback_Success: String { return self._s[2334]! } - public var TwoStepAuth_SetupHint: String { return self._s[2335]! } + public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2314]!, self._r[2314]!, [_1]) + } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2316]! } + public var PasscodeSettings_HelpTop: String { return self._s[2317]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2318]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2319]! } + public var EditTheme_ShortLink: String { return self._s[2320]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2321]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2322]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2323]! } + public var Call_Accept: String { return self._s[2325]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2326]! } + public var Month_GenMarch: String { return self._s[2328]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2329]! } + public var LoginPassword_Title: String { return self._s[2330]! } + public var Call_End: String { return self._s[2331]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2332]! } + public var VoiceOver_Chat_Contact: String { return self._s[2333]! } + public var CallSettings_Always: String { return self._s[2334]! } + public var CallFeedback_Success: String { return self._s[2335]! } + public var TwoStepAuth_SetupHint: String { return self._s[2336]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2336]!, self._r[2336]!, [_1]) + return formatWithArgumentRanges(self._s[2337]!, self._r[2337]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2337]! } - public var Login_PhoneTitle: String { return self._s[2338]! } - public var Passport_FieldPhoneHelp: String { return self._s[2339]! } - public var Weekday_ShortSunday: String { return self._s[2340]! } - public var Passport_InfoFAQ_URL: String { return self._s[2341]! } - public var ContactInfo_Job: String { return self._s[2343]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2344]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2345]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2346]! } - public var Invite_ChannelsTooMuch: String { return self._s[2347]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2348]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2349]! } - public var CallFeedback_ReasonNoise: String { return self._s[2350]! } - public var Appearance_AppIconDefault: String { return self._s[2352]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2353]! } - public var MediaPicker_AddCaption: String { return self._s[2354]! } - public var CallSettings_TabIconDescription: String { return self._s[2355]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2338]! } + public var Login_PhoneTitle: String { return self._s[2339]! } + public var Passport_FieldPhoneHelp: String { return self._s[2340]! } + public var Weekday_ShortSunday: String { return self._s[2341]! } + public var Passport_InfoFAQ_URL: String { return self._s[2342]! } + public var ContactInfo_Job: String { return self._s[2344]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2345]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2346]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2347]! } + public var Invite_ChannelsTooMuch: String { return self._s[2348]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2349]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2350]! } + public var CallFeedback_ReasonNoise: String { return self._s[2351]! } + public var Appearance_AppIconDefault: String { return self._s[2353]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2354]! } + public var MediaPicker_AddCaption: String { return self._s[2355]! } + public var CallSettings_TabIconDescription: String { return self._s[2356]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2356]!, self._r[2356]!, [_0]) + return formatWithArgumentRanges(self._s[2357]!, self._r[2357]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2357]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2358]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2359]! } - public var DialogList_SearchSectionRecent: String { return self._s[2360]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2361]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2364]! } - public var LastSeen_WithinAWeek: String { return self._s[2365]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2366]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2368]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2369]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2358]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2359]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2360]! } + public var DialogList_SearchSectionRecent: String { return self._s[2361]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2362]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2365]! } + public var LastSeen_WithinAWeek: String { return self._s[2366]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2367]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2369]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2370]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2370]!, self._r[2370]!, [_0]) + return formatWithArgumentRanges(self._s[2371]!, self._r[2371]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2371]! } - public var Conversation_StatusLeftGroup: String { return self._s[2372]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2373]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2375]! } - public var GroupPermission_AddSuccess: String { return self._s[2376]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2378]! } - public var Conversation_ContextMenuCopy: String { return self._s[2379]! } - public var AccessDenied_CallMicrophone: String { return self._s[2380]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2372]! } + public var Conversation_StatusLeftGroup: String { return self._s[2373]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2374]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2376]! } + public var GroupPermission_AddSuccess: String { return self._s[2377]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2379]! } + public var Conversation_ContextMenuCopy: String { return self._s[2380]! } + public var AccessDenied_CallMicrophone: String { return self._s[2381]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2381]!, self._r[2381]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2382]!, self._r[2382]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2382]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2383]! } - public var Checkout_PaymentMethod_New: String { return self._s[2384]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2385]! } - public var PhotoEditor_QualityTool: String { return self._s[2386]! } - public var Login_SendCodeViaSms: String { return self._s[2387]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2388]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2389]! } - public var Login_EmailNotConfiguredError: String { return self._s[2390]! } - public var SocksProxySetup_Status: String { return self._s[2391]! } - public var PrivacyPolicy_Accept: String { return self._s[2392]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2393]! } - public var Appearance_AppIconClassicX: String { return self._s[2394]! } + public var Login_InvalidFirstNameError: String { return self._s[2383]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2384]! } + public var Checkout_PaymentMethod_New: String { return self._s[2385]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2386]! } + public var PhotoEditor_QualityTool: String { return self._s[2387]! } + public var Login_SendCodeViaSms: String { return self._s[2388]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2389]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2390]! } + public var Login_EmailNotConfiguredError: String { return self._s[2391]! } + public var SocksProxySetup_Status: String { return self._s[2392]! } + public var PrivacyPolicy_Accept: String { return self._s[2393]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2394]! } + public var Appearance_AppIconClassicX: String { return self._s[2395]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2395]!, self._r[2395]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2396]!, self._r[2396]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2396]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2397]! } - public var AutoNightTheme_Automatic: String { return self._s[2398]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2399]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2400]! } - public var Cache_Help: String { return self._s[2401]! } - public var Group_ErrorAccessDenied: String { return self._s[2402]! } - public var Passport_Language_fa: String { return self._s[2403]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2404]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2405]! } - public var PrivacySettings_LastSeen: String { return self._s[2406]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2397]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2398]! } + public var AutoNightTheme_Automatic: String { return self._s[2399]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2400]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2401]! } + public var Cache_Help: String { return self._s[2402]! } + public var Group_ErrorAccessDenied: String { return self._s[2403]! } + public var Passport_Language_fa: String { return self._s[2404]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2405]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2406]! } + public var PrivacySettings_LastSeen: String { return self._s[2407]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2407]!, self._r[2407]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2408]!, self._r[2408]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2411]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2412]! } - public var Profile_About: String { return self._s[2413]! } - public var Channel_About_Placeholder: String { return self._s[2414]! } - public var Login_InfoTitle: String { return self._s[2415]! } + public var Preview_SaveGif: String { return self._s[2412]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2413]! } + public var Profile_About: String { return self._s[2414]! } + public var Channel_About_Placeholder: String { return self._s[2415]! } + public var Login_InfoTitle: String { return self._s[2416]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2416]!, self._r[2416]!, [_0]) + return formatWithArgumentRanges(self._s[2417]!, self._r[2417]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2418]! } - public var ContactInfo_Title: String { return self._s[2419]! } - public var Media_ShareThisVideo: String { return self._s[2420]! } - public var Weekday_ShortFriday: String { return self._s[2421]! } - public var AccessDenied_Contacts: String { return self._s[2423]! } - public var Notification_CallIncomingShort: String { return self._s[2424]! } - public var Group_Setup_TypePublic: String { return self._s[2425]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2426]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2427]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2430]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2431]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2432]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2433]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2434]! } - public var DialogList_Typing: String { return self._s[2435]! } - public var CallFeedback_IncludeLogs: String { return self._s[2437]! } - public var Checkout_Phone: String { return self._s[2439]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2442]! } - public var Privacy_Calls_Integration: String { return self._s[2443]! } - public var Notifications_PermissionsAllow: String { return self._s[2444]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2448]! } - public var Settings_ChatSettings: String { return self._s[2449]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2419]! } + public var ContactInfo_Title: String { return self._s[2420]! } + public var Media_ShareThisVideo: String { return self._s[2421]! } + public var Weekday_ShortFriday: String { return self._s[2422]! } + public var AccessDenied_Contacts: String { return self._s[2424]! } + public var Notification_CallIncomingShort: String { return self._s[2425]! } + public var Group_Setup_TypePublic: String { return self._s[2426]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2427]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2428]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2431]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2432]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2433]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2434]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2435]! } + public var DialogList_Typing: String { return self._s[2436]! } + public var CallFeedback_IncludeLogs: String { return self._s[2438]! } + public var Checkout_Phone: String { return self._s[2440]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2443]! } + public var Privacy_Calls_Integration: String { return self._s[2444]! } + public var Notifications_PermissionsAllow: String { return self._s[2445]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2449]! } + public var Settings_ChatSettings: String { return self._s[2450]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2452]! } + public var GroupRemoved_DeleteUser: String { return self._s[2453]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_0]) + return formatWithArgumentRanges(self._s[2454]!, self._r[2454]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2454]!, self._r[2454]!, [_1]) + return formatWithArgumentRanges(self._s[2455]!, self._r[2455]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2455]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2456]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2458]! } - public var Conversation_Unblock: String { return self._s[2459]! } - public var PrivacySettings_DataSettings: String { return self._s[2460]! } - public var Group_PublicLink_Info: String { return self._s[2461]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2462]! } + public var Login_ContinueWithLocalization: String { return self._s[2456]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2457]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2459]! } + public var Conversation_Unblock: String { return self._s[2460]! } + public var PrivacySettings_DataSettings: String { return self._s[2461]! } + public var Group_PublicLink_Info: String { return self._s[2462]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2463]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2464]!, self._r[2464]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2466]! } - public var Call_Mute: String { return self._s[2467]! } - public var Passport_Language_dz: String { return self._s[2468]! } - public var Passport_Language_tk: String { return self._s[2469]! } + public var PrivacySettings_Passcode: String { return self._s[2467]! } + public var Call_Mute: String { return self._s[2468]! } + public var Passport_Language_dz: String { return self._s[2469]! } + public var Passport_Language_tk: String { return self._s[2470]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2470]!, self._r[2470]!, [_0]) + return formatWithArgumentRanges(self._s[2471]!, self._r[2471]!, [_0]) } - public var Settings_Search: String { return self._s[2471]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2472]! } - public var Conversation_ContextMenuReply: String { return self._s[2473]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2474]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2475]! } - public var Tour_Title1: String { return self._s[2476]! } - public var Conversation_ClearGroupHistory: String { return self._s[2478]! } - public var WallpaperPreview_Motion: String { return self._s[2479]! } + public var Settings_Search: String { return self._s[2472]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2473]! } + public var Conversation_ContextMenuReply: String { return self._s[2474]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2475]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2476]! } + public var Tour_Title1: String { return self._s[2477]! } + public var Conversation_ClearGroupHistory: String { return self._s[2479]! } + public var WallpaperPreview_Motion: String { return self._s[2480]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, [_0]) + return formatWithArgumentRanges(self._s[2481]!, self._r[2481]!, [_0]) } - public var Call_RateCall: String { return self._s[2481]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2482]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2483]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2484]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2486]! } + public var Call_RateCall: String { return self._s[2482]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2483]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2484]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2485]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2487]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) + return formatWithArgumentRanges(self._s[2489]!, self._r[2489]!, [_0]) } - public var Compose_Create: String { return self._s[2489]! } - public var Contacts_InviteToTelegram: String { return self._s[2490]! } - public var GroupInfo_Notifications: String { return self._s[2491]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2493]! } - public var Month_GenApril: String { return self._s[2494]! } - public var Appearance_AutoNightTheme: String { return self._s[2495]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2497]! } - public var Login_CodeSentSms: String { return self._s[2499]! } + public var Compose_Create: String { return self._s[2490]! } + public var Contacts_InviteToTelegram: String { return self._s[2491]! } + public var GroupInfo_Notifications: String { return self._s[2492]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2494]! } + public var Month_GenApril: String { return self._s[2495]! } + public var Appearance_AutoNightTheme: String { return self._s[2496]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2498]! } + public var Login_CodeSentSms: String { return self._s[2500]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2500]!, self._r[2500]!, [_0]) + return formatWithArgumentRanges(self._s[2501]!, self._r[2501]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2501]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2502]! } - public var Passport_Language_hr: String { return self._s[2503]! } - public var Common_ActionNotAllowedError: String { return self._s[2504]! } + public var EmptyGroupInfo_Line3: String { return self._s[2502]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2503]! } + public var Passport_Language_hr: String { return self._s[2504]! } + public var Common_ActionNotAllowedError: String { return self._s[2505]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2505]!, self._r[2505]!, [_0]) + return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2506]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2507]! } - public var Privacy_SecretChatsTitle: String { return self._s[2508]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2510]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2511]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2512]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2513]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2514]! } - public var Preview_DeleteGif: String { return self._s[2515]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2516]! } - public var Group_ErrorNotMutualContact: String { return self._s[2517]! } - public var Notification_MessageLifetime5s: String { return self._s[2518]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2507]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2508]! } + public var Privacy_SecretChatsTitle: String { return self._s[2509]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2511]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2512]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2513]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2514]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2515]! } + public var Preview_DeleteGif: String { return self._s[2516]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2517]! } + public var Group_ErrorNotMutualContact: String { return self._s[2518]! } + public var Notification_MessageLifetime5s: String { return self._s[2519]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_0]) + return formatWithArgumentRanges(self._s[2520]!, self._r[2520]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2520]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2522]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2523]! } - public var Passport_Address_AddBankStatement: String { return self._s[2524]! } - public var Notification_CallIncoming: String { return self._s[2525]! } - public var Compose_NewGroupTitle: String { return self._s[2526]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2528]! } - public var Passport_Address_Postcode: String { return self._s[2530]! } + public var VoiceOver_Chat_Video: String { return self._s[2521]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2523]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2524]! } + public var Passport_Address_AddBankStatement: String { return self._s[2525]! } + public var Notification_CallIncoming: String { return self._s[2526]! } + public var Compose_NewGroupTitle: String { return self._s[2527]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2529]! } + public var Passport_Address_Postcode: String { return self._s[2531]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2531]!, self._r[2531]!, [_0]) + return formatWithArgumentRanges(self._s[2532]!, self._r[2532]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2532]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2533]! } - public var WallpaperColors_Title: String { return self._s[2534]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2535]! } - public var VoiceOver_MessageContextForward: String { return self._s[2536]! } - public var GroupPermission_Duration: String { return self._s[2537]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2533]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2534]! } + public var WallpaperColors_Title: String { return self._s[2535]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2536]! } + public var VoiceOver_MessageContextForward: String { return self._s[2537]! } + public var GroupPermission_Duration: String { return self._s[2538]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_0]) + return formatWithArgumentRanges(self._s[2539]!, self._r[2539]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2539]! } - public var Username_Placeholder: String { return self._s[2540]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2541]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2542]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2543]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2540]! } + public var Username_Placeholder: String { return self._s[2541]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2542]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2543]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2544]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2545]!, self._r[2545]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2546]!, self._r[2546]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2546]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2547]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2548]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2549]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2550]! } - public var Conversation_ContextMenuMore: String { return self._s[2551]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2552]! } - public var CallSettings_TabIcon: String { return self._s[2553]! } - public var KeyCommand_Find: String { return self._s[2554]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2555]! } - public var Message_PinnedGame: String { return self._s[2556]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2557]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2559]! } - public var Login_CallRequestState2: String { return self._s[2561]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2563]! } + public var Passport_PasswordDescription: String { return self._s[2547]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2548]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2549]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2550]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2551]! } + public var Conversation_ContextMenuMore: String { return self._s[2552]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2553]! } + public var CallSettings_TabIcon: String { return self._s[2554]! } + public var KeyCommand_Find: String { return self._s[2555]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2556]! } + public var Message_PinnedGame: String { return self._s[2557]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2558]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2560]! } + public var Login_CallRequestState2: String { return self._s[2562]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2564]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2564]!, self._r[2564]!, [_0]) + return formatWithArgumentRanges(self._s[2565]!, self._r[2565]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_0]) + return formatWithArgumentRanges(self._s[2567]!, self._r[2567]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2567]! } - public var Conversation_InstantPagePreview: String { return self._s[2568]! } + public var WallpaperPreview_Blurred: String { return self._s[2568]! } + public var Conversation_InstantPagePreview: String { return self._s[2569]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2569]!, self._r[2569]!, [_0]) + return formatWithArgumentRanges(self._s[2570]!, self._r[2570]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2572]! } - public var WallpaperSearch_ColorRed: String { return self._s[2573]! } - public var GroupPermission_NoPinMessages: String { return self._s[2574]! } - public var Passport_Language_es: String { return self._s[2575]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2577]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2578]! } + public var SecretTimer_VideoDescription: String { return self._s[2573]! } + public var WallpaperSearch_ColorRed: String { return self._s[2574]! } + public var GroupPermission_NoPinMessages: String { return self._s[2575]! } + public var Passport_Language_es: String { return self._s[2576]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2578]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2579]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2579]!, self._r[2579]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2580]!, self._r[2580]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2580]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2581]! } - public var Watch_UserInfo_Unmute: String { return self._s[2582]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2583]! } - public var AccessDenied_CameraRestricted: String { return self._s[2585]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2581]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2582]! } + public var Watch_UserInfo_Unmute: String { return self._s[2583]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2584]! } + public var AccessDenied_CameraRestricted: String { return self._s[2586]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2586]!, self._r[2586]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2587]!, self._r[2587]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2588]! } - public var Settings_CopyUsername: String { return self._s[2589]! } - public var Contacts_SearchLabel: String { return self._s[2590]! } - public var Map_OpenInYandexNavigator: String { return self._s[2592]! } - public var PasscodeSettings_EncryptData: String { return self._s[2593]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2594]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2595]! } - public var DialogList_AdNoticeAlert: String { return self._s[2596]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2598]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2599]! } - public var Localization_LanguageCustom: String { return self._s[2600]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2601]! } - public var CallFeedback_Title: String { return self._s[2602]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2605]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2606]! } - public var Conversation_InfoGroup: String { return self._s[2607]! } - public var Compose_NewMessage: String { return self._s[2608]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2609]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2610]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2611]! } + public var ChatList_ReadAll: String { return self._s[2589]! } + public var Settings_CopyUsername: String { return self._s[2590]! } + public var Contacts_SearchLabel: String { return self._s[2591]! } + public var Map_OpenInYandexNavigator: String { return self._s[2593]! } + public var PasscodeSettings_EncryptData: String { return self._s[2594]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2595]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2596]! } + public var DialogList_AdNoticeAlert: String { return self._s[2597]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2599]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2600]! } + public var Localization_LanguageCustom: String { return self._s[2601]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2602]! } + public var CallFeedback_Title: String { return self._s[2603]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2606]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2607]! } + public var Conversation_InfoGroup: String { return self._s[2608]! } + public var Compose_NewMessage: String { return self._s[2609]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2610]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2611]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2612]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2612]!, self._r[2612]!, [_0]) + return formatWithArgumentRanges(self._s[2613]!, self._r[2613]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2613]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2614]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2615]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2616]! } - public var Channel_BlackList_Title: String { return self._s[2617]! } - public var UserInfo_PhoneCall: String { return self._s[2618]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2620]! } - public var State_connecting: String { return self._s[2621]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2622]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2623]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2614]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2615]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2616]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2617]! } + public var Channel_BlackList_Title: String { return self._s[2618]! } + public var UserInfo_PhoneCall: String { return self._s[2619]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2621]! } + public var State_connecting: String { return self._s[2622]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2623]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2624]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_0]) + return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2625]! } - public var Passport_Identity_EditPassport: String { return self._s[2626]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2628]! } - public var Localization_EnglishLanguageName: String { return self._s[2629]! } - public var Share_AuthDescription: String { return self._s[2630]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2631]! } - public var Passport_Identity_Surname: String { return self._s[2632]! } - public var Compose_TokenListPlaceholder: String { return self._s[2633]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2634]! } - public var Settings_AboutEmpty: String { return self._s[2635]! } - public var Conversation_Unmute: String { return self._s[2636]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2638]! } + public var Notifications_GroupNotifications: String { return self._s[2626]! } + public var Passport_Identity_EditPassport: String { return self._s[2627]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2629]! } + public var Localization_EnglishLanguageName: String { return self._s[2630]! } + public var Share_AuthDescription: String { return self._s[2631]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2632]! } + public var Passport_Identity_Surname: String { return self._s[2633]! } + public var Compose_TokenListPlaceholder: String { return self._s[2634]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2635]! } + public var Settings_AboutEmpty: String { return self._s[2636]! } + public var Conversation_Unmute: String { return self._s[2637]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2639]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_1]) + return formatWithArgumentRanges(self._s[2640]!, self._r[2640]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2640]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2642]! } - public var ChatSettings_Appearance: String { return self._s[2643]! } - public var Appearance_PickAccentColor: String { return self._s[2644]! } + public var Login_CodeSentCall: String { return self._s[2641]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2643]! } + public var ChatSettings_Appearance: String { return self._s[2644]! } + public var Appearance_PickAccentColor: String { return self._s[2645]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2646]!, self._r[2646]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2646]!, self._r[2646]!, [_1]) + return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2647]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2648]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2649]! } - public var ChatAdmins_AdminLabel: String { return self._s[2651]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2652]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2654]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2655]! } - public var Month_GenJune: String { return self._s[2656]! } - public var Watch_Location_Current: String { return self._s[2657]! } - public var Conversation_TitleMute: String { return self._s[2658]! } + public var Notification_CallMissed: String { return self._s[2648]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2649]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2650]! } + public var ChatAdmins_AdminLabel: String { return self._s[2652]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2653]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2655]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2656]! } + public var Month_GenJune: String { return self._s[2657]! } + public var Watch_Location_Current: String { return self._s[2658]! } + public var Conversation_TitleMute: String { return self._s[2659]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2659]!, self._r[2659]!, [_1]) + return formatWithArgumentRanges(self._s[2660]!, self._r[2660]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2660]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2661]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2661]!, self._r[2661]!, [_0]) + return formatWithArgumentRanges(self._s[2662]!, self._r[2662]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2662]! } - public var Chat_SlowmodeSendError: String { return self._s[2663]! } - public var MaskStickerSettings_Info: String { return self._s[2664]! } + public var Call_ReportPlaceholder: String { return self._s[2663]! } + public var Chat_SlowmodeSendError: String { return self._s[2664]! } + public var MaskStickerSettings_Info: String { return self._s[2665]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2665]!, self._r[2665]!, [_0]) + return formatWithArgumentRanges(self._s[2666]!, self._r[2666]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2666]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2668]! } - public var Contacts_ShareTelegram: String { return self._s[2669]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2670]! } - public var Channel_ErrorAccessDenied: String { return self._s[2671]! } - public var UserInfo_ScamBotWarning: String { return self._s[2673]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2674]! } - public var Call_ConnectionErrorTitle: String { return self._s[2675]! } - public var UserInfo_NotificationsEnable: String { return self._s[2676]! } - public var ArchivedChats_IntroText1: String { return self._s[2677]! } - public var Tour_Text4: String { return self._s[2680]! } - public var WallpaperSearch_Recent: String { return self._s[2681]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2682]! } - public var Profile_MessageLifetime2s: String { return self._s[2684]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2685]! } - public var Notification_MessageLifetime2s: String { return self._s[2686]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2667]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2669]! } + public var Contacts_ShareTelegram: String { return self._s[2670]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2671]! } + public var Channel_ErrorAccessDenied: String { return self._s[2672]! } + public var UserInfo_ScamBotWarning: String { return self._s[2674]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2675]! } + public var Call_ConnectionErrorTitle: String { return self._s[2676]! } + public var UserInfo_NotificationsEnable: String { return self._s[2677]! } + public var ArchivedChats_IntroText1: String { return self._s[2678]! } + public var Tour_Text4: String { return self._s[2681]! } + public var WallpaperSearch_Recent: String { return self._s[2682]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2683]! } + public var Profile_MessageLifetime2s: String { return self._s[2685]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2686]! } + public var Notification_MessageLifetime2s: String { return self._s[2687]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2688]!, self._r[2688]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2688]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2689]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2690]! } + public var Cache_ClearCache: String { return self._s[2689]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2690]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2691]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2694]!, self._r[2694]!, [_0]) + return formatWithArgumentRanges(self._s[2695]!, self._r[2695]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2696]!, self._r[2696]!, [_0]) + return formatWithArgumentRanges(self._s[2697]!, self._r[2697]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2697]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2698]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2699]! } - public var ChatList_UnarchiveAction: String { return self._s[2700]! } - public var AutoNightTheme_Title: String { return self._s[2701]! } - public var InstantPage_FeedbackButton: String { return self._s[2702]! } - public var Passport_FieldAddress: String { return self._s[2703]! } + public var LocalGroup_Text: String { return self._s[2698]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2699]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2700]! } + public var ChatList_UnarchiveAction: String { return self._s[2701]! } + public var AutoNightTheme_Title: String { return self._s[2702]! } + public var InstantPage_FeedbackButton: String { return self._s[2703]! } + public var Passport_FieldAddress: String { return self._s[2704]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2704]!, self._r[2704]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2705]!, self._r[2705]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2705]! } + public var Month_ShortMarch: String { return self._s[2706]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2706]!, self._r[2706]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2707]!, self._r[2707]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2707]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2708]! } - public var Passport_FloodError: String { return self._s[2709]! } - public var SecretGif_Title: String { return self._s[2710]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2711]! } - public var Passport_Language_th: String { return self._s[2713]! } - public var Passport_Address_Address: String { return self._s[2714]! } - public var Login_InvalidLastNameError: String { return self._s[2715]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2716]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2717]! } - public var SettingsSearch_FAQ: String { return self._s[2718]! } - public var ShareMenu_Send: String { return self._s[2719]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2721]! } - public var Month_GenNovember: String { return self._s[2723]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2725]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2708]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2709]! } + public var Passport_FloodError: String { return self._s[2710]! } + public var SecretGif_Title: String { return self._s[2711]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2712]! } + public var Passport_Language_th: String { return self._s[2714]! } + public var Passport_Address_Address: String { return self._s[2715]! } + public var Login_InvalidLastNameError: String { return self._s[2716]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2717]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2718]! } + public var SettingsSearch_FAQ: String { return self._s[2719]! } + public var ShareMenu_Send: String { return self._s[2720]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2722]! } + public var Month_GenNovember: String { return self._s[2724]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2726]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2726]!, self._r[2726]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2727]!, self._r[2727]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2727]! } - public var NotificationsSound_Tritone: String { return self._s[2728]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2730]! } + public var Checkout_Email: String { return self._s[2728]! } + public var NotificationsSound_Tritone: String { return self._s[2729]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2731]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_1]) + return formatWithArgumentRanges(self._s[2734]!, self._r[2734]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2734]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2735]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2735]!, self._r[2735]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2736]!, self._r[2736]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2736]! } - public var Notification_Exceptions_Add: String { return self._s[2737]! } - public var DialogList_You: String { return self._s[2738]! } - public var MediaPicker_Send: String { return self._s[2741]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2742]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2743]! } - public var Call_AudioRouteSpeaker: String { return self._s[2744]! } - public var Watch_UserInfo_Title: String { return self._s[2745]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2746]! } - public var Appearance_AccentColor: String { return self._s[2747]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2737]! } + public var Notification_Exceptions_Add: String { return self._s[2738]! } + public var DialogList_You: String { return self._s[2739]! } + public var MediaPicker_Send: String { return self._s[2742]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2743]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2744]! } + public var Call_AudioRouteSpeaker: String { return self._s[2745]! } + public var Watch_UserInfo_Title: String { return self._s[2746]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2747]! } + public var Appearance_AccentColor: String { return self._s[2748]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2748]!, self._r[2748]!, [_0]) + return formatWithArgumentRanges(self._s[2749]!, self._r[2749]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2749]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2750]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2750]!, self._r[2750]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2751]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2752]! } - public var Notification_CallOutgoing: String { return self._s[2753]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2754]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2755]! } - public var Call_RecordingDisabledMessage: String { return self._s[2756]! } - public var Message_Game: String { return self._s[2757]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2758]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2759]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2760]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2761]! } - public var Date_DialogDateFormat: String { return self._s[2762]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2763]! } - public var Notifications_InAppNotifications: String { return self._s[2764]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2752]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2753]! } + public var Notification_CallOutgoing: String { return self._s[2754]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2755]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2756]! } + public var Call_RecordingDisabledMessage: String { return self._s[2757]! } + public var Message_Game: String { return self._s[2758]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2759]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2760]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2761]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2762]! } + public var Date_DialogDateFormat: String { return self._s[2763]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2764]! } + public var Notifications_InAppNotifications: String { return self._s[2765]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2765]!, self._r[2765]!, [_0]) + return formatWithArgumentRanges(self._s[2766]!, self._r[2766]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2766]!, self._r[2766]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2767]!, self._r[2767]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2767]! } + public var NewContact_Title: String { return self._s[2768]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2768]!, self._r[2768]!, [_0]) + return formatWithArgumentRanges(self._s[2769]!, self._r[2769]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2769]! } + public var Conversation_ViewContactDetails: String { return self._s[2770]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2771]!, self._r[2771]!, [_1]) + return formatWithArgumentRanges(self._s[2772]!, self._r[2772]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2772]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2773]! } - public var PrivacySettings_Title: String { return self._s[2774]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2777]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2778]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2779]! } - public var Contacts_PhoneNumber: String { return self._s[2780]! } - public var Map_ShowPlaces: String { return self._s[2782]! } - public var ChatAdmins_Title: String { return self._s[2783]! } - public var InstantPage_Reference: String { return self._s[2785]! } - public var ReportGroupLocation_Text: String { return self._s[2786]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2773]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2774]! } + public var PrivacySettings_Title: String { return self._s[2775]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2778]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2779]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2780]! } + public var Contacts_PhoneNumber: String { return self._s[2781]! } + public var Map_ShowPlaces: String { return self._s[2783]! } + public var ChatAdmins_Title: String { return self._s[2784]! } + public var InstantPage_Reference: String { return self._s[2786]! } + public var ReportGroupLocation_Text: String { return self._s[2787]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2788]!, self._r[2788]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2788]! } - public var Watch_UserInfo_Block: String { return self._s[2789]! } - public var ChatSettings_Stickers: String { return self._s[2790]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2791]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2792]! } + public var Camera_FlashOff: String { return self._s[2789]! } + public var Watch_UserInfo_Block: String { return self._s[2790]! } + public var ChatSettings_Stickers: String { return self._s[2791]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2792]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2793]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_0]) + return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2794]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2795]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2796]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2797]! } - public var VoiceOver_MessageContextShare: String { return self._s[2798]! } + public var Settings_ViewPhoto: String { return self._s[2795]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2796]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2797]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2798]! } + public var VoiceOver_MessageContextShare: String { return self._s[2799]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0]) + return formatWithArgumentRanges(self._s[2801]!, self._r[2801]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2801]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2802]! } + public var Privacy_DeleteDrafts: String { return self._s[2802]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2803]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2803]!, self._r[2803]!, [_0]) + return formatWithArgumentRanges(self._s[2804]!, self._r[2804]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2804]! } - public var DialogList_SavedMessages: String { return self._s[2805]! } - public var GroupInfo_UpgradeButton: String { return self._s[2806]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2808]! } - public var DialogList_Pin: String { return self._s[2809]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2805]! } + public var DialogList_SavedMessages: String { return self._s[2806]! } + public var GroupInfo_UpgradeButton: String { return self._s[2807]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2809]! } + public var DialogList_Pin: String { return self._s[2810]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2811]!, self._r[2811]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2811]!, self._r[2811]!, [_0]) + return formatWithArgumentRanges(self._s[2812]!, self._r[2812]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2812]! } - public var UserInfo_NotificationsDisable: String { return self._s[2813]! } - public var Paint_Outlined: String { return self._s[2814]! } - public var Activity_PlayingGame: String { return self._s[2815]! } - public var SearchImages_NoImagesFound: String { return self._s[2816]! } - public var SocksProxySetup_ProxyType: String { return self._s[2817]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2819]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2820]! } - public var Settings_AppLanguage: String { return self._s[2821]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2822]! } - public var Common_ChoosePhoto: String { return self._s[2823]! } - public var CallFeedback_ReasonEcho: String { return self._s[2824]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2813]! } + public var UserInfo_NotificationsDisable: String { return self._s[2814]! } + public var Paint_Outlined: String { return self._s[2815]! } + public var Activity_PlayingGame: String { return self._s[2816]! } + public var SearchImages_NoImagesFound: String { return self._s[2817]! } + public var SocksProxySetup_ProxyType: String { return self._s[2818]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2820]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2821]! } + public var Settings_AppLanguage: String { return self._s[2822]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2823]! } + public var Common_ChoosePhoto: String { return self._s[2824]! } + public var CallFeedback_ReasonEcho: String { return self._s[2825]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2825]!, self._r[2825]!, [_1]) + return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2826]! } - public var Activity_UploadingVideo: String { return self._s[2827]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2828]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2829]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2830]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2831]! } - public var Checkout_PayWithTouchId: String { return self._s[2832]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2833]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2827]! } + public var Activity_UploadingVideo: String { return self._s[2828]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2829]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2830]! } + public var VoiceOver_Editing_ClearText: String { return self._s[2831]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2832]! } + public var Checkout_PayWithTouchId: String { return self._s[2833]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2834]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2835]!, self._r[2835]!, [_1]) + return formatWithArgumentRanges(self._s[2836]!, self._r[2836]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2836]! } + public var Notifications_ExceptionsNone: String { return self._s[2837]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) + return formatWithArgumentRanges(self._s[2838]!, self._r[2838]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2838]!, self._r[2838]!, [_1]) + return formatWithArgumentRanges(self._s[2839]!, self._r[2839]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2840]! } - public var Passport_Address_Region: String { return self._s[2843]! } - public var ChatList_DeleteChat: String { return self._s[2844]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2845]! } - public var PhotoEditor_TiltShift: String { return self._s[2846]! } - public var Settings_FAQ_URL: String { return self._s[2847]! } - public var Passport_Language_sl: String { return self._s[2848]! } - public var Settings_PrivacySettings: String { return self._s[2850]! } - public var SharedMedia_TitleLink: String { return self._s[2851]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2852]! } - public var Settings_SetProfilePhoto: String { return self._s[2853]! } - public var Channel_About_Help: String { return self._s[2854]! } - public var Contacts_PermissionsEnable: String { return self._s[2855]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2856]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2857]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2859]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2860]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2861]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2862]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2863]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2865]! } - public var Map_OpenInYandexMaps: String { return self._s[2867]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2868]! } - public var VoiceOver_MessageContextReply: String { return self._s[2869]! } - public var PhotoEditor_SaturationTool: String { return self._s[2870]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2841]! } + public var Passport_Address_Region: String { return self._s[2844]! } + public var ChatList_DeleteChat: String { return self._s[2845]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2846]! } + public var PhotoEditor_TiltShift: String { return self._s[2847]! } + public var Settings_FAQ_URL: String { return self._s[2848]! } + public var Passport_Language_sl: String { return self._s[2849]! } + public var Settings_PrivacySettings: String { return self._s[2851]! } + public var SharedMedia_TitleLink: String { return self._s[2852]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2853]! } + public var Settings_SetProfilePhoto: String { return self._s[2854]! } + public var Channel_About_Help: String { return self._s[2855]! } + public var Contacts_PermissionsEnable: String { return self._s[2856]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2857]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2858]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2860]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2861]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2862]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2863]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2864]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2866]! } + public var Map_OpenInYandexMaps: String { return self._s[2868]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2869]! } + public var VoiceOver_MessageContextReply: String { return self._s[2870]! } + public var PhotoEditor_SaturationTool: String { return self._s[2871]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2871]!, self._r[2871]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2872]!, self._r[2872]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2872]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2873]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2874]! } - public var Appearance_TextSize: String { return self._s[2875]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2873]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2874]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2875]! } + public var Appearance_TextSize: String { return self._s[2876]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2877]!, self._r[2877]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2877]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2879]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2878]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2880]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2882]! } - public var Passport_PassportInformation: String { return self._s[2885]! } - public var Theme_Unsupported: String { return self._s[2886]! } - public var WatchRemote_AlertTitle: String { return self._s[2887]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2888]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2890]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2883]! } + public var Passport_PassportInformation: String { return self._s[2886]! } + public var Theme_Unsupported: String { return self._s[2887]! } + public var WatchRemote_AlertTitle: String { return self._s[2888]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2889]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2891]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_0]) + return formatWithArgumentRanges(self._s[2892]!, self._r[2892]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2892]!, self._r[2892]!, [_1]) + return formatWithArgumentRanges(self._s[2893]!, self._r[2893]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2893]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2895]! } - public var AccessDenied_CameraDisabled: String { return self._s[2896]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2894]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2896]! } + public var AccessDenied_CameraDisabled: String { return self._s[2897]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_0]) + return formatWithArgumentRanges(self._s[2898]!, self._r[2898]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2900]! } + public var PhotoEditor_ContrastTool: String { return self._s[2901]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_1]) + return formatWithArgumentRanges(self._s[2902]!, self._r[2902]!, [_1]) } - public var DialogList_Draft: String { return self._s[2902]! } - public var Privacy_TopPeersDelete: String { return self._s[2904]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2905]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2906]! } - public var WebSearch_RecentSectionClear: String { return self._s[2907]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2909]! } - public var Common_Done: String { return self._s[2911]! } - public var AuthSessions_EmptyText: String { return self._s[2912]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2913]! } - public var Tour_Title5: String { return self._s[2914]! } + public var DialogList_Draft: String { return self._s[2903]! } + public var Privacy_TopPeersDelete: String { return self._s[2905]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2906]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2907]! } + public var WebSearch_RecentSectionClear: String { return self._s[2908]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2910]! } + public var Common_Done: String { return self._s[2912]! } + public var AuthSessions_EmptyText: String { return self._s[2913]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2914]! } + public var Tour_Title5: String { return self._s[2915]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2915]!, self._r[2915]!, [_0]) + return formatWithArgumentRanges(self._s[2916]!, self._r[2916]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2916]! } - public var Conversation_LinkDialogSave: String { return self._s[2917]! } - public var GroupInfo_ActionRestrict: String { return self._s[2918]! } - public var Checkout_Title: String { return self._s[2919]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2921]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2923]! } - public var Notification_RenamedGroup: String { return self._s[2924]! } - public var PeopleNearby_Groups: String { return self._s[2925]! } - public var Checkout_PayWithFaceId: String { return self._s[2926]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2927]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2929]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2930]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2931]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2917]! } + public var Conversation_LinkDialogSave: String { return self._s[2918]! } + public var GroupInfo_ActionRestrict: String { return self._s[2919]! } + public var Checkout_Title: String { return self._s[2920]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2922]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2924]! } + public var Notification_RenamedGroup: String { return self._s[2925]! } + public var PeopleNearby_Groups: String { return self._s[2926]! } + public var Checkout_PayWithFaceId: String { return self._s[2927]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2928]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2930]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2931]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2932]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2932]!, self._r[2932]!, [_0]) + return formatWithArgumentRanges(self._s[2933]!, self._r[2933]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2934]! } + public var Profile_AddToExisting: String { return self._s[2935]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2935]!, self._r[2935]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2936]!, self._r[2936]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2937]! } - public var Permissions_PrivacyPolicy: String { return self._s[2938]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2939]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2940]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2942]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2944]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2945]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2946]! } - public var VoiceOver_AttachMedia: String { return self._s[2948]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2949]! } + public var Cache_Files: String { return self._s[2938]! } + public var Permissions_PrivacyPolicy: String { return self._s[2939]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2940]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2941]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2943]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2945]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2946]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2947]! } + public var VoiceOver_AttachMedia: String { return self._s[2949]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2950]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2950]!, self._r[2950]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2951]!, self._r[2951]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2951]! } - public var Conversation_SetReminder_Title: String { return self._s[2952]! } - public var Passport_FieldAddressHelp: String { return self._s[2953]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2954]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2952]! } + public var Conversation_SetReminder_Title: String { return self._s[2953]! } + public var Passport_FieldAddressHelp: String { return self._s[2954]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2955]! } + public var PUSH_REMINDER_TITLE: String { return self._s[2956]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2955]!, self._r[2955]!, [_0]) + return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2956]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2958]! } - public var Login_UnknownError: String { return self._s[2959]! } - public var Group_UpgradeNoticeText2: String { return self._s[2961]! } - public var Watch_Compose_AddContact: String { return self._s[2962]! } - public var Web_Error: String { return self._s[2963]! } - public var Gif_Search: String { return self._s[2964]! } - public var Profile_MessageLifetime1h: String { return self._s[2965]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2966]! } - public var Channel_Username_CheckingUsername: String { return self._s[2967]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2968]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2969]! } - public var Channel_AboutItem: String { return self._s[2970]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2972]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[2973]! } - public var GroupInfo_SharedMedia: String { return self._s[2974]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2958]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2959]! } + public var Login_UnknownError: String { return self._s[2960]! } + public var Group_UpgradeNoticeText2: String { return self._s[2963]! } + public var Watch_Compose_AddContact: String { return self._s[2964]! } + public var Web_Error: String { return self._s[2965]! } + public var Gif_Search: String { return self._s[2966]! } + public var Profile_MessageLifetime1h: String { return self._s[2967]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2968]! } + public var Channel_Username_CheckingUsername: String { return self._s[2969]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2970]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2971]! } + public var Channel_AboutItem: String { return self._s[2972]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2974]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[2975]! } + public var GroupInfo_SharedMedia: String { return self._s[2976]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2975]!, self._r[2975]!, [_1]) - } - public var Call_PhoneCallInProgressMessage: String { return self._s[2976]! } - public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2977]!, self._r[2977]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2978]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2979]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2980]! } - public var CreatePoll_AddOption: String { return self._s[2981]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2982]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2983]! } - public var Channel_Management_AddModerator: String { return self._s[2984]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2985]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2986]! } - public var NotificationsSound_Hello: String { return self._s[2987]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2988]! } - public var Channel_Stickers_Placeholder: String { return self._s[2990]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2978]! } + public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2979]!, self._r[2979]!, [_1]) + } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2980]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2981]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2982]! } + public var CreatePoll_AddOption: String { return self._s[2983]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2984]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2985]! } + public var Channel_Management_AddModerator: String { return self._s[2986]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2987]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2988]! } + public var NotificationsSound_Hello: String { return self._s[2989]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2990]! } + public var Channel_Stickers_Placeholder: String { return self._s[2992]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) + return formatWithArgumentRanges(self._s[2993]!, self._r[2993]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2992]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2993]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2994]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2995]! } - public var AutoDownloadSettings_Channels: String { return self._s[2996]! } - public var Passport_Language_mn: String { return self._s[2997]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3000]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3001]! } - public var Passport_Language_ja: String { return self._s[3003]! } - public var Settings_About_Title: String { return self._s[3004]! } - public var Settings_NotificationsAndSounds: String { return self._s[3005]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3006]! } - public var Settings_BlockedUsers: String { return self._s[3007]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2994]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2995]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2996]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2997]! } + public var AutoDownloadSettings_Channels: String { return self._s[2998]! } + public var Passport_Language_mn: String { return self._s[2999]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3002]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3003]! } + public var Passport_Language_ja: String { return self._s[3005]! } + public var Settings_About_Title: String { return self._s[3006]! } + public var Settings_NotificationsAndSounds: String { return self._s[3007]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3008]! } + public var Settings_BlockedUsers: String { return self._s[3009]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3008]!, self._r[3008]!, [_0]) + return formatWithArgumentRanges(self._s[3010]!, self._r[3010]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3009]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3010]! } - public var Channel_Username_Title: String { return self._s[3011]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3011]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3012]! } + public var Channel_Username_Title: String { return self._s[3013]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_0]) + return formatWithArgumentRanges(self._s[3014]!, self._r[3014]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3014]! } - public var AppleWatch_Title: String { return self._s[3015]! } - public var Activity_RecordingVideoMessage: String { return self._s[3016]! } + public var AttachmentMenu_File: String { return self._s[3016]! } + public var AppleWatch_Title: String { return self._s[3017]! } + public var Activity_RecordingVideoMessage: String { return self._s[3018]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3017]!, self._r[3017]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3019]!, self._r[3019]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3018]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3019]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3020]! } - public var Common_Next: String { return self._s[3022]! } - public var Channel_Stickers_YourStickers: String { return self._s[3024]! } - public var Message_Theme: String { return self._s[3025]! } - public var Call_AudioRouteHeadphones: String { return self._s[3026]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3028]! } - public var Watch_Contacts_NoResults: String { return self._s[3030]! } - public var PhotoEditor_TintTool: String { return self._s[3033]! } - public var LoginPassword_ResetAccount: String { return self._s[3035]! } - public var Settings_SavedMessages: String { return self._s[3036]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3037]! } - public var Bot_GenericSupportStatus: String { return self._s[3038]! } - public var StickerPack_Add: String { return self._s[3039]! } - public var Checkout_TotalAmount: String { return self._s[3040]! } - public var Your_cards_number_is_invalid: String { return self._s[3041]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3042]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3043]! } + public var Weekday_Saturday: String { return self._s[3020]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3021]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3022]! } + public var Common_Next: String { return self._s[3024]! } + public var Channel_Stickers_YourStickers: String { return self._s[3026]! } + public var Message_Theme: String { return self._s[3027]! } + public var Call_AudioRouteHeadphones: String { return self._s[3028]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3030]! } + public var Watch_Contacts_NoResults: String { return self._s[3032]! } + public var PhotoEditor_TintTool: String { return self._s[3035]! } + public var LoginPassword_ResetAccount: String { return self._s[3037]! } + public var Settings_SavedMessages: String { return self._s[3038]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3039]! } + public var Bot_GenericSupportStatus: String { return self._s[3040]! } + public var StickerPack_Add: String { return self._s[3041]! } + public var Checkout_TotalAmount: String { return self._s[3042]! } + public var Your_cards_number_is_invalid: String { return self._s[3043]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3044]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3045]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3044]!, self._r[3044]!, [_0]) + return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3045]!, self._r[3045]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3047]!, self._r[3047]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3046]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3048]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0]) + return formatWithArgumentRanges(self._s[3051]!, self._r[3051]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3050]! } - public var StickerPack_Share: String { return self._s[3051]! } - public var Passport_DeleteAddress: String { return self._s[3052]! } - public var Settings_Passport: String { return self._s[3053]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3054]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3055]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3056]! } - public var Contacts_PermissionsText: String { return self._s[3057]! } - public var Group_Setup_HistoryVisible: String { return self._s[3058]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3060]! } - public var SocksProxySetup_Title: String { return self._s[3061]! } - public var Notification_Mute1h: String { return self._s[3062]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3052]! } + public var StickerPack_Share: String { return self._s[3053]! } + public var Passport_DeleteAddress: String { return self._s[3054]! } + public var Settings_Passport: String { return self._s[3055]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3056]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3057]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3058]! } + public var Contacts_PermissionsText: String { return self._s[3059]! } + public var Group_Setup_HistoryVisible: String { return self._s[3060]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3062]! } + public var SocksProxySetup_Title: String { return self._s[3063]! } + public var Notification_Mute1h: String { return self._s[3064]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3063]!, self._r[3063]!, [_0]) + return formatWithArgumentRanges(self._s[3065]!, self._r[3065]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3064]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3066]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3065]!, self._r[3065]!, [_1]) + return formatWithArgumentRanges(self._s[3067]!, self._r[3067]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3066]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3069]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3071]! } - public var DialogList_NoMessagesText: String { return self._s[3072]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3073]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3074]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3076]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3077]! } - public var Common_TakePhotoOrVideo: String { return self._s[3078]! } - public var Call_StatusBusy: String { return self._s[3079]! } - public var Conversation_PinnedMessage: String { return self._s[3080]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3081]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3082]! } - public var Undo_ChatCleared: String { return self._s[3083]! } - public var AppleWatch_ReplyPresets: String { return self._s[3084]! } - public var Passport_DiscardMessageDescription: String { return self._s[3086]! } - public var Login_NetworkError: String { return self._s[3087]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3068]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3071]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3073]! } + public var DialogList_NoMessagesText: String { return self._s[3074]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3075]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3076]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3078]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3079]! } + public var Common_TakePhotoOrVideo: String { return self._s[3080]! } + public var Call_StatusBusy: String { return self._s[3081]! } + public var Conversation_PinnedMessage: String { return self._s[3082]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3083]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3084]! } + public var Undo_ChatCleared: String { return self._s[3085]! } + public var AppleWatch_ReplyPresets: String { return self._s[3086]! } + public var Passport_DiscardMessageDescription: String { return self._s[3088]! } + public var Login_NetworkError: String { return self._s[3089]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_0]) + return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3089]!, self._r[3089]!, [_0]) + return formatWithArgumentRanges(self._s[3091]!, self._r[3091]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3090]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3092]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3092]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3094]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_0]) + return formatWithArgumentRanges(self._s[3096]!, self._r[3096]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3095]! } - public var VoiceOver_Chat_Music: String { return self._s[3096]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3097]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3099]! } - public var ConversationMedia_Title: String { return self._s[3100]! } - public var EncryptionKey_Title: String { return self._s[3102]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3103]! } - public var Notification_Exceptions_AddException: String { return self._s[3104]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3105]! } - public var Profile_MessageLifetime1m: String { return self._s[3106]! } + public var Call_ConnectionErrorMessage: String { return self._s[3097]! } + public var VoiceOver_Chat_Music: String { return self._s[3098]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3099]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3101]! } + public var ConversationMedia_Title: String { return self._s[3102]! } + public var EncryptionKey_Title: String { return self._s[3104]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3105]! } + public var Notification_Exceptions_AddException: String { return self._s[3106]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3107]! } + public var Profile_MessageLifetime1m: String { return self._s[3108]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3107]!, self._r[3107]!, [_1]) + return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_1]) } - public var Month_GenMay: String { return self._s[3108]! } + public var Month_GenMay: String { return self._s[3110]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_0]) + return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3110]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3111]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3112]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3114]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3115]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3116]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3117]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3118]! } - public var Channel_JoinChannel: String { return self._s[3120]! } - public var Appearance_Animations: String { return self._s[3123]! } + public var PeopleNearby_Users: String { return self._s[3112]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3113]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3114]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3116]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3117]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3118]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3119]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3120]! } + public var Channel_JoinChannel: String { return self._s[3122]! } + public var Appearance_Animations: String { return self._s[3125]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3126]! } - public var Appearance_ShareTheme: String { return self._s[3127]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3129]! } - public var Passport_Address_Street: String { return self._s[3130]! } - public var Conversation_AddContact: String { return self._s[3131]! } - public var Login_PhonePlaceholder: String { return self._s[3132]! } - public var Channel_Members_InviteLink: String { return self._s[3134]! } - public var Bot_Stop: String { return self._s[3135]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3137]! } - public var Notification_PassportValueAddress: String { return self._s[3138]! } - public var Month_ShortJuly: String { return self._s[3139]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3140]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3141]! } - public var Passport_Identity_ReverseSide: String { return self._s[3142]! } - public var Watch_Stickers_Recents: String { return self._s[3145]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3147]! } - public var Map_SendThisLocation: String { return self._s[3148]! } + public var Stickers_GroupStickers: String { return self._s[3128]! } + public var Appearance_ShareTheme: String { return self._s[3129]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3131]! } + public var Passport_Address_Street: String { return self._s[3132]! } + public var Conversation_AddContact: String { return self._s[3133]! } + public var Login_PhonePlaceholder: String { return self._s[3134]! } + public var Channel_Members_InviteLink: String { return self._s[3136]! } + public var Bot_Stop: String { return self._s[3137]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3139]! } + public var Notification_PassportValueAddress: String { return self._s[3140]! } + public var Month_ShortJuly: String { return self._s[3141]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3142]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3143]! } + public var Passport_Identity_ReverseSide: String { return self._s[3144]! } + public var Watch_Stickers_Recents: String { return self._s[3147]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3149]! } + public var Map_SendThisLocation: String { return self._s[3150]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_0]) + return formatWithArgumentRanges(self._s[3151]!, self._r[3151]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3150]!, self._r[3150]!, [_0]) - } - public var ConvertToSupergroup_Note: String { return self._s[3151]! } - public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3153]! } + public var ConvertToSupergroup_Note: String { return self._s[3153]! } + public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_0]) + } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3155]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3156]! } - public var Wallpaper_SearchShort: String { return self._s[3157]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3159]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3160]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3161]! } + public var Login_CallRequestState3: String { return self._s[3158]! } + public var Wallpaper_SearchShort: String { return self._s[3159]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3161]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3162]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3163]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3163]! } - public var EditTheme_UploadNewInfo: String { return self._s[3166]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3168]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3165]! } + public var EditTheme_UploadNewInfo: String { return self._s[3168]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3170]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_0]) + return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3170]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3171]! } + public var Passport_CorrectErrors: String { return self._s[3172]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3173]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_0]) + return formatWithArgumentRanges(self._s[3174]!, self._r[3174]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3173]! } - public var Channel_DiscussionGroup: String { return self._s[3174]! } + public var Map_SendMyCurrentLocation: String { return self._s[3175]! } + public var Channel_DiscussionGroup: String { return self._s[3176]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3175]!, self._r[3175]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3176]! } - public var Permissions_NotificationsText_v0: String { return self._s[3177]! } - public var Appearance_AppIcon: String { return self._s[3178]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3179]! } - public var LoginPassword_FloodError: String { return self._s[3180]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3182]! } + public var SharedMedia_SearchNoResults: String { return self._s[3178]! } + public var Permissions_NotificationsText_v0: String { return self._s[3179]! } + public var Appearance_AppIcon: String { return self._s[3180]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3181]! } + public var LoginPassword_FloodError: String { return self._s[3182]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3184]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3183]!, self._r[3183]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3184]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3185]!, self._r[3185]!, [_0]) } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3186]!, self._r[3186]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Passport_Language_bn: String { return self._s[3186]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3187]!, self._r[3187]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3190]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3192]! } - public var Contacts_PermissionsAllow: String { return self._s[3193]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3194]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3195]! } - public var WallpaperPreview_Pattern: String { return self._s[3196]! } - public var Paint_Duplicate: String { return self._s[3197]! } - public var Passport_Address_Country: String { return self._s[3198]! } - public var Notification_RenamedChannel: String { return self._s[3200]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3201]! } - public var Group_MessagePhotoUpdated: String { return self._s[3202]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3203]! } - public var Conversation_ContextMenuBan: String { return self._s[3204]! } - public var TwoStepAuth_EmailSent: String { return self._s[3205]! } - public var MessagePoll_NoVotes: String { return self._s[3206]! } - public var Passport_Language_is: String { return self._s[3207]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3209]! } - public var Tour_Text5: String { return self._s[3210]! } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) + } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_0]) + } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3192]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3194]! } + public var Contacts_PermissionsAllow: String { return self._s[3195]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3196]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3197]! } + public var WallpaperPreview_Pattern: String { return self._s[3198]! } + public var Paint_Duplicate: String { return self._s[3199]! } + public var Passport_Address_Country: String { return self._s[3200]! } + public var Notification_RenamedChannel: String { return self._s[3202]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3203]! } + public var Group_MessagePhotoUpdated: String { return self._s[3204]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3205]! } + public var Conversation_ContextMenuBan: String { return self._s[3206]! } + public var TwoStepAuth_EmailSent: String { return self._s[3207]! } + public var MessagePoll_NoVotes: String { return self._s[3208]! } + public var Passport_Language_is: String { return self._s[3209]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3211]! } + public var Tour_Text5: String { return self._s[3212]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3213]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3214]! } + public var Undo_SecretChatDeleted: String { return self._s[3215]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3216]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3215]!, self._r[3215]!, [_0]) + return formatWithArgumentRanges(self._s[3217]!, self._r[3217]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3216]! } - public var Paint_Edit: String { return self._s[3218]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3220]! } - public var Undo_DeletedGroup: String { return self._s[3222]! } - public var LoginPassword_ForgotPassword: String { return self._s[3223]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3224]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3218]! } + public var Paint_Edit: String { return self._s[3220]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3222]! } + public var Undo_DeletedGroup: String { return self._s[3224]! } + public var LoginPassword_ForgotPassword: String { return self._s[3225]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3226]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3225]!, self._r[3225]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3226]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3227]! } - public var Passport_Language_uz: String { return self._s[3228]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3229]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3230]! } - public var Map_StopLiveLocation: String { return self._s[3232]! } - public var VoiceOver_MessageContextSend: String { return self._s[3234]! } - public var PasscodeSettings_Help: String { return self._s[3235]! } - public var NotificationsSound_Input: String { return self._s[3236]! } - public var Share_Title: String { return self._s[3239]! } - public var LogoutOptions_Title: String { return self._s[3240]! } - public var Login_TermsOfServiceAgree: String { return self._s[3241]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3242]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3243]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3244]! } - public var EnterPasscode_EnterTitle: String { return self._s[3245]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3228]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3229]! } + public var Passport_Language_uz: String { return self._s[3230]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3231]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3232]! } + public var Map_StopLiveLocation: String { return self._s[3234]! } + public var VoiceOver_MessageContextSend: String { return self._s[3236]! } + public var PasscodeSettings_Help: String { return self._s[3237]! } + public var NotificationsSound_Input: String { return self._s[3238]! } + public var Share_Title: String { return self._s[3241]! } + public var LogoutOptions_Title: String { return self._s[3242]! } + public var Login_TermsOfServiceAgree: String { return self._s[3243]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3244]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3245]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3246]! } + public var EnterPasscode_EnterTitle: String { return self._s[3247]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_0]) + return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3247]! } - public var Conversation_AddToContacts: String { return self._s[3248]! } + public var Settings_CopyPhoneNumber: String { return self._s[3249]! } + public var Conversation_AddToContacts: String { return self._s[3250]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) - } - public var NotificationsSound_Keys: String { return self._s[3250]! } - public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3251]!, self._r[3251]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3252]! } - public var Message_Video: String { return self._s[3253]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3254]! } + public var NotificationsSound_Keys: String { return self._s[3252]! } + public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_0]) + } + public var Notification_MessageLifetime1w: String { return self._s[3254]! } + public var Message_Video: String { return self._s[3255]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3256]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3255]!, self._r[3255]!, [_1]) + return formatWithArgumentRanges(self._s[3257]!, self._r[3257]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3258]!, self._r[3258]!, [_0]) + return formatWithArgumentRanges(self._s[3260]!, self._r[3260]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3259]!, self._r[3259]!, [_0]) + return formatWithArgumentRanges(self._s[3261]!, self._r[3261]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3260]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3261]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3263]! } - public var PrivacyPolicy_Decline: String { return self._s[3264]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3265]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3266]! } - public var Permissions_SiriAllow_v0: String { return self._s[3268]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3269]! } + public var Passport_Language_mk: String { return self._s[3262]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3263]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3265]! } + public var PrivacyPolicy_Decline: String { return self._s[3266]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3267]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3268]! } + public var Permissions_SiriAllow_v0: String { return self._s[3270]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3271]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3270]!, self._r[3270]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3272]!, self._r[3272]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_0]) + return formatWithArgumentRanges(self._s[3273]!, self._r[3273]!, [_0]) } - public var Paint_Regular: String { return self._s[3272]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3273]! } - public var SocksProxySetup_ShareLink: String { return self._s[3274]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3275]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3277]! } - public var GroupInfo_InviteByLink: String { return self._s[3278]! } - public var MessageTimer_Custom: String { return self._s[3279]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3280]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3282]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3283]! } - public var VoiceOver_Chat_Selected: String { return self._s[3284]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3285]! } - public var Channel_Username_InvalidTaken: String { return self._s[3286]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3287]! } - public var Settings_ChatBackground: String { return self._s[3288]! } - public var Channel_Subscribers_Title: String { return self._s[3289]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3290]! } - public var Watch_ConnectionDescription: String { return self._s[3291]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3295]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3296]! } - public var EditProfile_Title: String { return self._s[3297]! } - public var NotificationsSound_Bamboo: String { return self._s[3299]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3301]! } - public var Login_SmsRequestState2: String { return self._s[3302]! } - public var Passport_Language_ar: String { return self._s[3303]! } + public var Paint_Regular: String { return self._s[3274]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3275]! } + public var SocksProxySetup_ShareLink: String { return self._s[3276]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3277]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3279]! } + public var GroupInfo_InviteByLink: String { return self._s[3280]! } + public var MessageTimer_Custom: String { return self._s[3281]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3282]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3284]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3285]! } + public var VoiceOver_Chat_Selected: String { return self._s[3286]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3287]! } + public var Channel_Username_InvalidTaken: String { return self._s[3288]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3289]! } + public var Settings_ChatBackground: String { return self._s[3290]! } + public var Channel_Subscribers_Title: String { return self._s[3291]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3292]! } + public var Watch_ConnectionDescription: String { return self._s[3293]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3297]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3298]! } + public var EditProfile_Title: String { return self._s[3299]! } + public var NotificationsSound_Bamboo: String { return self._s[3301]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3303]! } + public var Login_SmsRequestState2: String { return self._s[3304]! } + public var Passport_Language_ar: String { return self._s[3305]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_0]) + return formatWithArgumentRanges(self._s[3306]!, self._r[3306]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3305]! } - public var Conversation_MessageDialogEdit: String { return self._s[3306]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3307]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3307]! } + public var Conversation_MessageDialogEdit: String { return self._s[3308]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3309]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_1]) + return formatWithArgumentRanges(self._s[3310]!, self._r[3310]!, [_1]) } - public var Common_Close: String { return self._s[3309]! } - public var GroupInfo_PublicLink: String { return self._s[3310]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3311]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3312]! } + public var Common_Close: String { return self._s[3311]! } + public var GroupInfo_PublicLink: String { return self._s[3312]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3313]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3314]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) - } - public var UserInfo_About_Placeholder: String { return self._s[3317]! } - public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3319]! } - public var Channel_Info_Banned: String { return self._s[3321]! } + public var UserInfo_About_Placeholder: String { return self._s[3319]! } + public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3321]! } + public var Channel_Info_Banned: String { return self._s[3323]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_0]) + return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_0]) } - public var Appearance_Other: String { return self._s[3323]! } - public var Passport_Language_my: String { return self._s[3324]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3325]! } + public var Appearance_Other: String { return self._s[3325]! } + public var Passport_Language_my: String { return self._s[3326]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3327]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3326]!, self._r[3326]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3328]!, self._r[3328]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3327]! } - public var Preview_CopyAddress: String { return self._s[3328]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3329]! } + public var Preview_CopyAddress: String { return self._s[3330]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3329]!, self._r[3329]!, [_0]) + return formatWithArgumentRanges(self._s[3331]!, self._r[3331]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3330]! } - public var UserInfo_BotSettings: String { return self._s[3331]! } - public var LiveLocation_MenuStopAll: String { return self._s[3333]! } - public var Passport_PasswordCreate: String { return self._s[3334]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3335]! } - public var Message_PinnedLocationMessage: String { return self._s[3336]! } - public var Map_Satellite: String { return self._s[3337]! } - public var Watch_Message_Unsupported: String { return self._s[3338]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3339]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3340]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3332]! } + public var UserInfo_BotSettings: String { return self._s[3333]! } + public var LiveLocation_MenuStopAll: String { return self._s[3335]! } + public var Passport_PasswordCreate: String { return self._s[3336]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3337]! } + public var Message_PinnedLocationMessage: String { return self._s[3338]! } + public var Map_Satellite: String { return self._s[3339]! } + public var Watch_Message_Unsupported: String { return self._s[3340]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3341]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3342]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_0]) + return formatWithArgumentRanges(self._s[3344]!, self._r[3344]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3343]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3344]! } - public var NotificationsSound_None: String { return self._s[3345]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3347]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3348]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3345]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3346]! } + public var NotificationsSound_None: String { return self._s[3347]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3349]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3350]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_1]) + return formatWithArgumentRanges(self._s[3351]!, self._r[3351]!, [_1]) } - public var Cache_Indexing: String { return self._s[3350]! } - public var DialogList_RecentTitlePeople: String { return self._s[3352]! } - public var DialogList_EncryptionRejected: String { return self._s[3353]! } - public var GroupInfo_Administrators: String { return self._s[3354]! } - public var Passport_ScanPassportHelp: String { return self._s[3355]! } - public var Application_Name: String { return self._s[3356]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3357]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3359]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3360]! } + public var Cache_Indexing: String { return self._s[3352]! } + public var DialogList_RecentTitlePeople: String { return self._s[3354]! } + public var DialogList_EncryptionRejected: String { return self._s[3355]! } + public var GroupInfo_Administrators: String { return self._s[3356]! } + public var Passport_ScanPassportHelp: String { return self._s[3357]! } + public var Application_Name: String { return self._s[3358]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3359]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3361]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3362]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3361]!, self._r[3361]!, [_0]) - } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_0]) - } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3363]!, self._r[3363]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3364]! } - public var Privacy_ChatsTitle: String { return self._s[3365]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3366]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3367]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3368]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3369]! } - public var Group_LinkedChannel: String { return self._s[3370]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3371]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3372]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3373]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3374]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3376]! } - public var Channel_Setup_TypePublic: String { return self._s[3378]! } + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_0]) + } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3366]! } + public var Privacy_ChatsTitle: String { return self._s[3367]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3368]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3369]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3370]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3371]! } + public var Group_LinkedChannel: String { return self._s[3372]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3373]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3374]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3375]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3376]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3378]! } + public var Channel_Setup_TypePublic: String { return self._s[3380]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_0]) + return formatWithArgumentRanges(self._s[3381]!, self._r[3381]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3381]! } - public var Map_OpenInMaps: String { return self._s[3383]! } + public var Channel_TypeSetup_Title: String { return self._s[3383]! } + public var Map_OpenInMaps: String { return self._s[3385]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3384]!, self._r[3384]!, [_1]) + return formatWithArgumentRanges(self._s[3386]!, self._r[3386]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3386]! } + public var NotificationsSound_Tremolo: String { return self._s[3388]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3387]!, self._r[3387]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3389]!, self._r[3389]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3388]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3389]! } - public var Passport_PasswordHelp: String { return self._s[3390]! } - public var Login_CodeExpiredError: String { return self._s[3391]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3392]! } - public var Conversation_TitleUnmute: String { return self._s[3393]! } - public var Passport_Identity_ScansHelp: String { return self._s[3394]! } - public var Passport_Language_lo: String { return self._s[3395]! } - public var Camera_FlashAuto: String { return self._s[3396]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3397]! } - public var Common_Cancel: String { return self._s[3398]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3399]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3400]! } - public var Appearance_TintAllColors: String { return self._s[3401]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3390]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3391]! } + public var Passport_PasswordHelp: String { return self._s[3392]! } + public var Login_CodeExpiredError: String { return self._s[3393]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3394]! } + public var Conversation_TitleUnmute: String { return self._s[3395]! } + public var Passport_Identity_ScansHelp: String { return self._s[3396]! } + public var Passport_Language_lo: String { return self._s[3397]! } + public var Camera_FlashAuto: String { return self._s[3398]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3399]! } + public var Common_Cancel: String { return self._s[3400]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3401]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3402]! } + public var Appearance_TintAllColors: String { return self._s[3403]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3402]!, self._r[3402]!, [_1]) + return formatWithArgumentRanges(self._s[3404]!, self._r[3404]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3403]! } - public var ChatSettings_Title: String { return self._s[3405]! } - public var Passport_PasswordReset: String { return self._s[3406]! } - public var SocksProxySetup_TypeNone: String { return self._s[3407]! } - public var EditTheme_Title: String { return self._s[3409]! } - public var PhoneNumberHelp_Help: String { return self._s[3410]! } - public var Checkout_EnterPassword: String { return self._s[3411]! } - public var Share_AuthTitle: String { return self._s[3413]! } - public var Activity_UploadingDocument: String { return self._s[3414]! } - public var State_Connecting: String { return self._s[3415]! } - public var Profile_MessageLifetime1w: String { return self._s[3416]! } - public var Conversation_ContextMenuReport: String { return self._s[3417]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3418]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3419]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3405]! } + public var ChatSettings_Title: String { return self._s[3407]! } + public var Passport_PasswordReset: String { return self._s[3408]! } + public var SocksProxySetup_TypeNone: String { return self._s[3409]! } + public var EditTheme_Title: String { return self._s[3411]! } + public var PhoneNumberHelp_Help: String { return self._s[3412]! } + public var Checkout_EnterPassword: String { return self._s[3413]! } + public var Share_AuthTitle: String { return self._s[3415]! } + public var Activity_UploadingDocument: String { return self._s[3416]! } + public var State_Connecting: String { return self._s[3417]! } + public var Profile_MessageLifetime1w: String { return self._s[3418]! } + public var Conversation_ContextMenuReport: String { return self._s[3419]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3420]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3421]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3420]!, self._r[3420]!, [_0]) + return formatWithArgumentRanges(self._s[3422]!, self._r[3422]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3421]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3422]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3423]! } - public var PhotoEditor_Set: String { return self._s[3424]! } - public var EmptyGroupInfo_Title: String { return self._s[3425]! } - public var Login_PadPhoneHelp: String { return self._s[3426]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3428]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3430]! } - public var NotificationsSound_Complete: String { return self._s[3431]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3432]! } - public var Group_Info_AdminLog: String { return self._s[3433]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3434]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3435]! } - public var Conversation_Admin: String { return self._s[3437]! } - public var Conversation_GifTooltip: String { return self._s[3438]! } - public var Passport_NotLoggedInMessage: String { return self._s[3439]! } + public var AuthSessions_Terminate: String { return self._s[3423]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3424]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3425]! } + public var PhotoEditor_Set: String { return self._s[3426]! } + public var EmptyGroupInfo_Title: String { return self._s[3427]! } + public var Login_PadPhoneHelp: String { return self._s[3428]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3430]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3432]! } + public var NotificationsSound_Complete: String { return self._s[3433]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3434]! } + public var Group_Info_AdminLog: String { return self._s[3435]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3436]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3437]! } + public var Conversation_Admin: String { return self._s[3439]! } + public var Conversation_GifTooltip: String { return self._s[3440]! } + public var Passport_NotLoggedInMessage: String { return self._s[3441]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_0]) + return formatWithArgumentRanges(self._s[3442]!, self._r[3442]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3441]! } - public var SharedMedia_EmptyTitle: String { return self._s[3443]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3445]! } - public var Username_Help: String { return self._s[3446]! } - public var DialogList_LanguageTooltip: String { return self._s[3448]! } - public var Map_LoadError: String { return self._s[3449]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3450]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3451]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3452]! } - public var Notification_Exceptions_NewException: String { return self._s[3453]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3454]! } - public var WatchRemote_AlertText: String { return self._s[3455]! } - public var EditTheme_UploadEditedInfo: String { return self._s[3456]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3459]! } + public var Profile_MessageLifetimeForever: String { return self._s[3443]! } + public var SharedMedia_EmptyTitle: String { return self._s[3445]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3447]! } + public var Username_Help: String { return self._s[3448]! } + public var DialogList_LanguageTooltip: String { return self._s[3450]! } + public var Map_LoadError: String { return self._s[3451]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3452]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3453]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3454]! } + public var Notification_Exceptions_NewException: String { return self._s[3455]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3456]! } + public var WatchRemote_AlertText: String { return self._s[3457]! } + public var EditTheme_UploadEditedInfo: String { return self._s[3458]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3461]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3460]!, self._r[3460]!, [_0]) + return formatWithArgumentRanges(self._s[3462]!, self._r[3462]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3461]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3462]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3463]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3464]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_0]) + return formatWithArgumentRanges(self._s[3465]!, self._r[3465]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3464]!, self._r[3464]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3465]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3466]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3468]! } - public var ChatList_UndoArchiveText1: String { return self._s[3469]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3470]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3471]! } - public var Cache_ClearNone: String { return self._s[3472]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3473]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3474]! } + public var Group_AdminLog_EmptyText: String { return self._s[3467]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3468]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3470]! } + public var ChatList_UndoArchiveText1: String { return self._s[3471]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3472]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3473]! } + public var Cache_ClearNone: String { return self._s[3474]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3475]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3476]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3475]!, self._r[3475]!, [_0]) - } - public var Passport_Identity_Country: String { return self._s[3476]! } - public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3477]!, self._r[3477]!, [_0]) } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3478]!, self._r[3478]!, [_0]) + public var Passport_Identity_Country: String { return self._s[3478]! } + public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3479]!, self._r[3479]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3479]! } - public var AccessDenied_Settings: String { return self._s[3480]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3481]! } - public var Month_ShortMay: String { return self._s[3482]! } - public var Compose_NewGroup: String { return self._s[3483]! } - public var Group_Setup_TypePrivate: String { return self._s[3485]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3487]! } - public var Appearance_ThemeDayClassic: String { return self._s[3488]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3489]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3490]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3491]! } - public var Conversation_typing: String { return self._s[3493]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3494]! } - public var Paint_Masks: String { return self._s[3495]! } - public var Contacts_DeselectAll: String { return self._s[3496]! } - public var Username_InvalidTaken: String { return self._s[3497]! } - public var Call_StatusNoAnswer: String { return self._s[3498]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3499]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3500]! } - public var Passport_Identity_Selfie: String { return self._s[3501]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3502]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3503]! } - public var Conversation_ClearSecretHistory: String { return self._s[3504]! } - public var PeopleNearby_Description: String { return self._s[3506]! } - public var NetworkUsageSettings_Title: String { return self._s[3507]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3509]! } + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3480]!, self._r[3480]!, [_0]) + } + public var Exceptions_AddToExceptions: String { return self._s[3481]! } + public var AccessDenied_Settings: String { return self._s[3482]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3483]! } + public var Month_ShortMay: String { return self._s[3484]! } + public var Compose_NewGroup: String { return self._s[3485]! } + public var Group_Setup_TypePrivate: String { return self._s[3487]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3489]! } + public var Appearance_ThemeDayClassic: String { return self._s[3490]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3491]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3492]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3493]! } + public var Conversation_typing: String { return self._s[3495]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3496]! } + public var Paint_Masks: String { return self._s[3497]! } + public var Contacts_DeselectAll: String { return self._s[3498]! } + public var Username_InvalidTaken: String { return self._s[3499]! } + public var Call_StatusNoAnswer: String { return self._s[3500]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3501]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3502]! } + public var Passport_Identity_Selfie: String { return self._s[3503]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3504]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3505]! } + public var Conversation_ClearSecretHistory: String { return self._s[3506]! } + public var PeopleNearby_Description: String { return self._s[3508]! } + public var NetworkUsageSettings_Title: String { return self._s[3509]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3511]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_0]) + return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3514]!, self._r[3514]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3514]! } - public var VoiceOver_Navigation_Search: String { return self._s[3515]! } - public var Map_LiveLocationTitle: String { return self._s[3516]! } - public var Login_InfoAvatarAdd: String { return self._s[3517]! } - public var Passport_Identity_FilesView: String { return self._s[3518]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3519]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3520]! } - public var VoiceOver_Chat_File: String { return self._s[3521]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3516]! } + public var VoiceOver_Navigation_Search: String { return self._s[3517]! } + public var Map_LiveLocationTitle: String { return self._s[3518]! } + public var Login_InfoAvatarAdd: String { return self._s[3519]! } + public var Passport_Identity_FilesView: String { return self._s[3520]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3521]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3522]! } + public var VoiceOver_Chat_File: String { return self._s[3523]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3522]!, self._r[3522]!, [_0]) + return formatWithArgumentRanges(self._s[3524]!, self._r[3524]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3523]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3524]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3525]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3525]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3526]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3527]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3528]!, self._r[3528]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3527]! } - public var Tour_Title2: String { return self._s[3528]! } - public var Conversation_FileOpenIn: String { return self._s[3529]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3530]! } - public var Wallpaper_Set: String { return self._s[3531]! } - public var Passport_Identity_Translations: String { return self._s[3533]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3529]! } + public var Tour_Title2: String { return self._s[3530]! } + public var Conversation_FileOpenIn: String { return self._s[3531]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3532]! } + public var Wallpaper_Set: String { return self._s[3533]! } + public var Passport_Identity_Translations: String { return self._s[3535]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3534]!, self._r[3534]!, [_0]) + return formatWithArgumentRanges(self._s[3536]!, self._r[3536]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3535]! } + public var Channel_LeaveChannel: String { return self._s[3537]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3536]!, self._r[3536]!, [_1]) + return formatWithArgumentRanges(self._s[3538]!, self._r[3538]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3538]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3539]! } - public var Passport_Email_Delete: String { return self._s[3540]! } - public var Conversation_Mute: String { return self._s[3542]! } - public var Channel_AddBotAsAdmin: String { return self._s[3543]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3545]! } - public var Channel_Management_LabelOwner: String { return self._s[3547]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3540]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3541]! } + public var Passport_Email_Delete: String { return self._s[3542]! } + public var Conversation_Mute: String { return self._s[3544]! } + public var Channel_AddBotAsAdmin: String { return self._s[3545]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3547]! } + public var Channel_Management_LabelOwner: String { return self._s[3549]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3548]!, self._r[3548]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3550]!, self._r[3550]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3549]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3550]! } - public var Common_No: String { return self._s[3551]! } - public var Weekday_Sunday: String { return self._s[3552]! } - public var Notification_Reply: String { return self._s[3553]! } - public var Conversation_ViewMessage: String { return self._s[3554]! } + public var Calls_CallTabDescription: String { return self._s[3551]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3552]! } + public var Common_No: String { return self._s[3553]! } + public var Weekday_Sunday: String { return self._s[3554]! } + public var Notification_Reply: String { return self._s[3555]! } + public var Conversation_ViewMessage: String { return self._s[3556]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3555]!, self._r[3555]!, [_0]) + return formatWithArgumentRanges(self._s[3557]!, self._r[3557]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3556]!, self._r[3556]!, [_0]) + return formatWithArgumentRanges(self._s[3558]!, self._r[3558]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3557]! } - public var Message_PinnedDocumentMessage: String { return self._s[3558]! } - public var DialogList_TabTitle: String { return self._s[3560]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3561]! } - public var Passport_FieldEmail: String { return self._s[3562]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3563]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3564]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3565]! } - public var Privacy_Calls_P2P: String { return self._s[3566]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3559]! } + public var Message_PinnedDocumentMessage: String { return self._s[3560]! } + public var DialogList_TabTitle: String { return self._s[3562]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3563]! } + public var Passport_FieldEmail: String { return self._s[3564]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3565]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3566]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3567]! } + public var Privacy_Calls_P2P: String { return self._s[3568]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_0]) + return formatWithArgumentRanges(self._s[3570]!, self._r[3570]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3569]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3571]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3570]!, self._r[3570]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3572]!, self._r[3572]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3571]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3572]! } - public var Passport_InfoText: String { return self._s[3573]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3574]! } + public var Stickers_ClearRecent: String { return self._s[3573]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3574]! } + public var Passport_InfoText: String { return self._s[3575]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3576]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_0]) + return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3576]!, self._r[3576]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3578]!, self._r[3578]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3577]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3578]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3579]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3580]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3582]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3583]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3579]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3580]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3581]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3582]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3584]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3585]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3586]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3588]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3588]!, self._r[3588]!, [_0]) + return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_0]) } - public var DialogList_Unread: String { return self._s[3589]! } + public var DialogList_Unread: String { return self._s[3591]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3592]!, self._r[3592]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3591]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3592]! } + public var User_DeletedAccount: String { return self._s[3593]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3594]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3593]!, self._r[3593]!, [_0]) + return formatWithArgumentRanges(self._s[3595]!, self._r[3595]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3594]! } - public var SharedMedia_CategoryMedia: String { return self._s[3595]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3596]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3597]! } - public var Watch_ChatList_Compose: String { return self._s[3598]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3599]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3600]! } - public var Watch_Microphone_Access: String { return self._s[3601]! } - public var Group_Setup_HistoryHeader: String { return self._s[3602]! } - public var Map_SetThisLocation: String { return self._s[3603]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3604]! } - public var Activity_UploadingPhoto: String { return self._s[3605]! } - public var Conversation_Edit: String { return self._s[3607]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3608]! } - public var Login_TermsOfServiceDecline: String { return self._s[3609]! } - public var Message_PinnedContactMessage: String { return self._s[3610]! } + public var UserInfo_NotificationsDefault: String { return self._s[3596]! } + public var SharedMedia_CategoryMedia: String { return self._s[3597]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3598]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3599]! } + public var Watch_ChatList_Compose: String { return self._s[3600]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3601]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3602]! } + public var Watch_Microphone_Access: String { return self._s[3603]! } + public var Group_Setup_HistoryHeader: String { return self._s[3604]! } + public var Map_SetThisLocation: String { return self._s[3605]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3606]! } + public var Activity_UploadingPhoto: String { return self._s[3607]! } + public var Conversation_Edit: String { return self._s[3609]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3610]! } + public var Login_TermsOfServiceDecline: String { return self._s[3611]! } + public var Message_PinnedContactMessage: String { return self._s[3612]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3613]!, self._r[3613]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3612]!, self._r[3612]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3614]!, self._r[3614]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3613]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3615]! } + public var Appearance_LargeEmoji: String { return self._s[3615]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3617]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3617]! } - public var Message_PinnedPhotoMessage: String { return self._s[3618]! } - public var Passport_FieldPhone: String { return self._s[3619]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3620]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3621]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3623]! } - public var Conversation_Call: String { return self._s[3624]! } - public var Common_TakePhoto: String { return self._s[3626]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3627]! } - public var Channel_NotificationLoading: String { return self._s[3628]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3619]! } + public var Message_PinnedPhotoMessage: String { return self._s[3620]! } + public var Passport_FieldPhone: String { return self._s[3621]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3622]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3623]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3625]! } + public var Conversation_Call: String { return self._s[3626]! } + public var Common_TakePhoto: String { return self._s[3628]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3629]! } + public var Channel_NotificationLoading: String { return self._s[3630]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_0]) + return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0]) } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_0]) + return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_1]) + return formatWithArgumentRanges(self._s[3633]!, self._r[3633]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3632]! } + public var Permissions_SiriTitle_v0: String { return self._s[3634]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3633]!, self._r[3633]!, [_0]) + return formatWithArgumentRanges(self._s[3635]!, self._r[3635]!, [_0]) } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_0]) + return formatWithArgumentRanges(self._s[3636]!, self._r[3636]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3635]! } - public var Common_edit: String { return self._s[3636]! } - public var PrivacySettings_AuthSessions: String { return self._s[3637]! } - public var Month_ShortJune: String { return self._s[3638]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3639]! } - public var Call_ReportSend: String { return self._s[3640]! } - public var Watch_LastSeen_JustNow: String { return self._s[3641]! } - public var Notifications_MessageNotifications: String { return self._s[3642]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3643]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3645]! } - public var Group_Status: String { return self._s[3646]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3637]! } + public var Common_edit: String { return self._s[3638]! } + public var PrivacySettings_AuthSessions: String { return self._s[3639]! } + public var Month_ShortJune: String { return self._s[3640]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3641]! } + public var Call_ReportSend: String { return self._s[3642]! } + public var Watch_LastSeen_JustNow: String { return self._s[3643]! } + public var Notifications_MessageNotifications: String { return self._s[3644]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3645]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3647]! } + public var Group_Status: String { return self._s[3648]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3647]!, self._r[3647]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3649]!, self._r[3649]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3648]! } - public var ShareMenu_ShareTo: String { return self._s[3649]! } - public var Conversation_Moderate_Ban: String { return self._s[3650]! } + public var TextFormat_AddLinkTitle: String { return self._s[3650]! } + public var ShareMenu_ShareTo: String { return self._s[3651]! } + public var Conversation_Moderate_Ban: String { return self._s[3652]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_0]) + return formatWithArgumentRanges(self._s[3653]!, self._r[3653]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3652]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3653]! } + public var SharedMedia_ViewInChat: String { return self._s[3654]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3655]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3654]!, self._r[3654]!, [_1]) + return formatWithArgumentRanges(self._s[3656]!, self._r[3656]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3655]!, self._r[3655]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3657]!, self._r[3657]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3657]!, self._r[3657]!, [_0]) + return formatWithArgumentRanges(self._s[3659]!, self._r[3659]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3658]! } - public var Appearance_ReduceMotion: String { return self._s[3659]! } + public var Map_OpenInHereMaps: String { return self._s[3660]! } + public var Appearance_ReduceMotion: String { return self._s[3661]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3660]!, self._r[3660]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3661]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3662]! } - public var PhotoEditor_Skip: String { return self._s[3663]! } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[3663]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3664]! } + public var PhotoEditor_Skip: String { return self._s[3665]! } + public func MuteFor_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { + public func ForwardedFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Seconds(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func Watch_UserInfo_Mute(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Days(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideos(_ value: Int32) -> String { + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } public func Call_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ForwardedPolls(_ value: Int32) -> String { + public func ForwardedStickers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, _1, _2) } public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { + public func MessageTimer_Years(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(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[15 * 6 + Int(form.rawValue)]!, stringValue) } public func MessageTimer_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Minutes(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedLocations(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func Map_ETAHours(_ value: Int32) -> String { + public func MessageTimer_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func Passport_Scans(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func ForwardedPhotos(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) } public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_SelectedChats(_ value: Int32) -> String { + public func ForwardedContacts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[32 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideoMessages(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[33 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(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[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) } public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(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 = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) } public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) } public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func SharedMedia_Video(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 3fec6bc3d9..6c430cdb3c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -370,6 +370,14 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { adjustedTextFrame.origin.x = floor((boundingWidth - adjustedTextFrame.width) / 2.0) } strongSelf.textNode.frame = adjustedTextFrame + if let textSelectionNode = strongSelf.textSelectionNode { + let shouldUpdateLayout = textSelectionNode.frame.size != adjustedTextFrame.size + textSelectionNode.frame = adjustedTextFrame + textSelectionNode.highlightAreaNode.frame = adjustedTextFrame + if shouldUpdateLayout { + textSelectionNode.updateLayout() + } + } strongSelf.textAccessibilityOverlayNode.frame = textFrame strongSelf.textAccessibilityOverlayNode.cachedLayout = textLayout } @@ -544,7 +552,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { knobColor = item.presentationData.theme.theme.chat.message.outgoing.textSelectionKnobColor } - let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: selectionColor, knob: knobColor), textNode: self.textNode, updateIsActive: { [weak self] value in + let textSelectionNode = TextSelectionNode(theme: TextSelectionTheme(selection: selectionColor, knob: knobColor), strings: item.presentationData.strings, textNode: self.textNode, updateIsActive: { [weak self] value in self?.updateIsTextSelectionActive?(value) }, present: { [weak self] c, a in self?.item?.controllerInteraction.presentGlobalOverlayController(c, a) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index ee904ae65551385fcada3a422a58c9ff1153bcef..76229231abee296eb075e9c4bc4c3dff711c042e 100644 GIT binary patch delta 22771 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 delta 21767 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 diff --git a/submodules/TextSelectionNode/Sources/TextSelectionNode.swift b/submodules/TextSelectionNode/Sources/TextSelectionNode.swift index 96fd26e427..09ee5e7289 100644 --- a/submodules/TextSelectionNode/Sources/TextSelectionNode.swift +++ b/submodules/TextSelectionNode/Sources/TextSelectionNode.swift @@ -3,6 +3,7 @@ import UIKit import UIKit.UIGestureRecognizerSubclass import AsyncDisplayKit import Display +import TelegramPresentationData private func findScrollView(view: UIView?) -> UIScrollView? { if let view = view { @@ -174,7 +175,11 @@ private final class TextSelectionGetureRecognizer: UIGestureRecognizer, UIGestur } public final class TextSelectionNodeView: UIView { + var hitTestImpl: ((CGPoint, UIEvent?) -> UIView?)? + override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + return self.hitTestImpl?(point, event) + } } public enum TextSelectionAction { @@ -185,6 +190,7 @@ public enum TextSelectionAction { public final class TextSelectionNode: ASDisplayNode { private let theme: TextSelectionTheme + private let strings: PresentationStrings private let textNode: TextNode private let updateIsActive: (Bool) -> Void private let present: (ViewController, Any?) -> Void @@ -199,8 +205,9 @@ public final class TextSelectionNode: ASDisplayNode { public let highlightAreaNode: ASDisplayNode - public init(theme: TextSelectionTheme, textNode: TextNode, updateIsActive: @escaping (Bool) -> Void, present: @escaping (ViewController, Any?) -> Void, rootNode: ASDisplayNode, performAction: @escaping (String, TextSelectionAction) -> Void) { + public init(theme: TextSelectionTheme, strings: PresentationStrings, textNode: TextNode, updateIsActive: @escaping (Bool) -> Void, present: @escaping (ViewController, Any?) -> Void, rootNode: ASDisplayNode, performAction: @escaping (String, TextSelectionAction) -> Void) { self.theme = theme + self.strings = strings self.textNode = textNode self.updateIsActive = updateIsActive self.present = present @@ -233,19 +240,14 @@ public final class TextSelectionNode: ASDisplayNode { override public func didLoad() { super.didLoad() + + (self.view as? TextSelectionNodeView)?.hitTestImpl = { [weak self] point, event in + return self?.hitTest(point, with: event) + } let recognizer = TextSelectionGetureRecognizer(target: nil, action: nil) recognizer.knobAtPoint = { [weak self] point in - guard let strongSelf = self else { - return nil - } - if !strongSelf.leftKnob.alpha.isZero, strongSelf.leftKnob.frame.insetBy(dx: -4.0, dy: -8.0).contains(point) { - return (.left, strongSelf.leftKnob.frame.offsetBy(dx: 0.0, dy: strongSelf.leftKnob.frame.width / 2.0).center) - } - if !strongSelf.rightKnob.alpha.isZero, strongSelf.rightKnob.frame.insetBy(dx: -4.0, dy: -8.0).contains(point) { - return (.right, strongSelf.rightKnob.frame.offsetBy(dx: 0.0, dy: -strongSelf.rightKnob.frame.width / 2.0).center) - } - return nil + return self?.knobAtPoint(point) } recognizer.moveKnob = { [weak self] knob, point in guard let strongSelf = self, let cachedLayout = strongSelf.textNode.cachedLayout, let _ = cachedLayout.attributedString, let currentRange = strongSelf.currentRange else { @@ -326,6 +328,16 @@ public final class TextSelectionNode: ASDisplayNode { self.view.addGestureRecognizer(recognizer) } + public func updateLayout() { + if let currentRange = self.currentRange { + let updatedMin = currentRange.0 + let updatedMax = currentRange.1 + let updatedRange = NSRange(location: min(updatedMin, updatedMax), length: max(updatedMin, updatedMax) - min(updatedMin, updatedMax)) + + self.updateSelection(range: updatedRange, animateIn: false) + } + } + private func updateSelection(range: NSRange?, animateIn: Bool) { var rects: [CGRect]? @@ -390,6 +402,22 @@ public final class TextSelectionNode: ASDisplayNode { } } + private func knobAtPoint(_ point: CGPoint) -> (Knob, CGPoint)? { + if !self.leftKnob.alpha.isZero, self.leftKnob.frame.insetBy(dx: -4.0, dy: -8.0).contains(point) { + return (.left, self.leftKnob.frame.offsetBy(dx: 0.0, dy: self.leftKnob.frame.width / 2.0).center) + } + if !self.rightKnob.alpha.isZero, self.rightKnob.frame.insetBy(dx: -4.0, dy: -8.0).contains(point) { + return (.right, self.rightKnob.frame.offsetBy(dx: 0.0, dy: -self.rightKnob.frame.width / 2.0).center) + } + if !self.leftKnob.alpha.isZero, self.leftKnob.frame.insetBy(dx: -14.0, dy: -14.0).contains(point) { + return (.left, self.leftKnob.frame.offsetBy(dx: 0.0, dy: self.leftKnob.frame.width / 2.0).center) + } + if !self.rightKnob.alpha.isZero, self.rightKnob.frame.insetBy(dx: -14.0, dy: -14.0).contains(point) { + return (.right, self.rightKnob.frame.offsetBy(dx: 0.0, dy: -self.rightKnob.frame.width / 2.0).center) + } + return nil + } + private func dismissSelection() { self.currentRange = nil self.updateSelection(range: nil, animateIn: false) @@ -409,15 +437,15 @@ public final class TextSelectionNode: ASDisplayNode { let text = (attributedString.string as NSString).substring(with: range) var actions: [ContextMenuAction] = [] - actions.append(ContextMenuAction(content: .text(title: "Copy", accessibilityLabel: "Copy"), action: { [weak self] in + actions.append(ContextMenuAction(content: .text(title: self.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.strings.Conversation_ContextMenuCopy), action: { [weak self] in self?.performAction(text, .copy) self?.dismissSelection() })) - actions.append(ContextMenuAction(content: .text(title: "Look Up", accessibilityLabel: "Look Up"), action: { [weak self] in + actions.append(ContextMenuAction(content: .text(title: self.strings.Conversation_ContextMenuLookUp, accessibilityLabel: self.strings.Conversation_ContextMenuLookUp), action: { [weak self] in self?.performAction(text, .lookup) self?.dismissSelection() })) - actions.append(ContextMenuAction(content: .text(title: "Share...", accessibilityLabel: "Share"), action: { [weak self] in + actions.append(ContextMenuAction(content: .text(title: self.strings.Conversation_ContextMenuShare, accessibilityLabel: self.strings.Conversation_ContextMenuShare), action: { [weak self] in self?.performAction(text, .share) self?.dismissSelection() })) @@ -428,4 +456,14 @@ public final class TextSelectionNode: ASDisplayNode { return (strongSelf, completeRect, rootNode, rootNode.bounds) }, bounce: false)) } + + override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if self.knobAtPoint(point) != nil { + return self.view + } + if self.bounds.contains(point) { + return self.view + } + return nil + } } diff --git a/submodules/TextSelectionNode/TextSelectionNode_Xcode.xcodeproj/project.pbxproj b/submodules/TextSelectionNode/TextSelectionNode_Xcode.xcodeproj/project.pbxproj index 948771da9d..6e4dbcc1dd 100644 --- a/submodules/TextSelectionNode/TextSelectionNode_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TextSelectionNode/TextSelectionNode_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + D009FD0F23187E16006264F6 /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D009FD0E23187E16006264F6 /* TelegramPresentationData.framework */; }; D0C9CBCC2302C00600FAB518 /* TextSelectionNode.h in Headers */ = {isa = PBXBuildFile; fileRef = D0C9CBCA2302C00600FAB518 /* TextSelectionNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0C9CBD92302C2E600FAB518 /* TextSelectionNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C9CBD82302C2E600FAB518 /* TextSelectionNode.swift */; }; D0C9CBDC2302C31100FAB518 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0C9CBDB2302C31100FAB518 /* Foundation.framework */; }; @@ -16,6 +17,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + D009FD0E23187E16006264F6 /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0C9CBC72302C00600FAB518 /* TextSelectionNode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TextSelectionNode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0C9CBCA2302C00600FAB518 /* TextSelectionNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextSelectionNode.h; sourceTree = ""; }; D0C9CBCB2302C00600FAB518 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -31,6 +33,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D009FD0F23187E16006264F6 /* TelegramPresentationData.framework in Frameworks */, D0C9CBE22302C31D00FAB518 /* Display.framework in Frameworks */, D0C9CBE02302C31800FAB518 /* AsyncDisplayKit.framework in Frameworks */, D0C9CBDE2302C31500FAB518 /* UIKit.framework in Frameworks */, @@ -71,6 +74,7 @@ D0C9CBDA2302C30E00FAB518 /* Frameworks */ = { isa = PBXGroup; children = ( + D009FD0E23187E16006264F6 /* TelegramPresentationData.framework */, D0C9CBE12302C31D00FAB518 /* Display.framework */, D0C9CBDF2302C31800FAB518 /* AsyncDisplayKit.framework */, D0C9CBDD2302C31500FAB518 /* UIKit.framework */,